我在测试环境中测试一个Web应用程序,当我尝试从firefox上的私有窗口打开它时,返回一个空白页面并且日志显示:
java.lang.IllegalStateException: Session was invalidated
16/02/02 14:45:17 at com.evermind.server.http.EvermindHttpSession.getId(EvermindHttpSession.java:467)
16/02/02 14:45:17 at cm.listener.SessionListener.sessionCreated(SessionListener.java:14)
16/02/02 14:45:17 at com.evermind.server.http.HttpApplication.createSession(HttpApplication.java:1971)
16/02/02 14:45:17 at com.evermind.server.http.EvermindHttpServletRequest.unprivileged_getSession(EvermindHttpServletRequest.java:2772)
16/02/02 14:45:17 at com.evermind.server.http.EvermindHttpServletRequest.getSession(EvermindHttpServletRequest.java:2661)
16/02/02 14:45:17 at com.evermind.server.http.EvermindHttpServletRequest.getSession(EvermindHttpServletRequest.java:2655)
16/02/02 14:45:17 at utilities.AdsServerFilter.doFilter(AdsServerFilter.java:39)
以及抛出异常的行如下:
HttpSession session=httpRequest.getSession();
应用程序的生产版本在私人窗口上正常工作..
根据我的知识,私有窗口只提供一个新的私有会话,如果找不到现有的会话,httpRequest.getSession()也会返回一个新会话...任何帮助?
我正在使用firefox 26(我无法更新它以便继续支持GWT扩展)
答案 0 :(得分:2)
这与GWT无关,但如果您尝试使会话无效,那么它是servlet会话如何工作的一部分,然后在同一请求中返回使用它。
从HttpSession的javadoc(在https://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/http/HttpSession.html和其他地方可用),invalidate()
方法几乎打破了会话中调用的任何其他方法,包括它自己:
无效
public void invalidate()
使此会话无效,然后取消绑定绑定到它的任何对象。
抛出: java.lang.IllegalStateException - 如果在已经失效的会话上调用此方法
您可以从堆栈跟踪中看到,由于尝试创建会话,OC4J服务器内的某些内容正在会话中调用getId()
。此方法也有相同的例外:
的getId
public java.lang.String getId()
返回包含分配给此会话的唯一标识符的字符串。标识符由servlet容器分配,并且取决于实现。
返回: 指定分配给此会话的标识符的字符串
抛出: java.lang.IllegalStateException - 如果在无效的会话上调用此方法
现在的问题是"为什么你的会话已经失效?" - 您是否也在同一请求中的代码中的其他位置调用invalidate?或者OC4J中是否存在无法为私有浏览器创建新会话的错误?