我很长时间以来一直在使用Tomcat 6.0.26和我的项目。现在,我需要在这个项目中使用EL 2.2,所以我将其移动到Tomcat 7.0.19而没有其他更改(使用Mojarra 2.1.2-b04和RichFaces 4.0.0)。当我启动它时,一切都很好,直到我尝试任何a4j:commandButton或h:commandButton它抛出ViewExpiredException,即使应用程序启动不到一分钟(对于信息,我在web.xml中强制30min会话超时)
使应用程序运行的唯一方法是更改此设置:
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
它是服务器,我将其更改为客户端,但服务器设置最好保留数据服务器端,并且不要在每次请求时将其传输到客户端。 / p>
编辑:看起来服务器到客户端修复了 ViewExpiredException 的问题,但网站上的用户登录功能不起作用了。它登录到用户主页,但是在点击任何链接之后,它会像用户不是记录器一样(我使用 SessionScoped ManagedBean 来保存用户信息)。
有人有这个错误吗?
谢谢,
亚历。
答案 0 :(得分:2)
当视图不在会话中时,您将获得ViewExpiredException
。所描述的症状表明会话cookie未得到维护,因此每个请求都以某种方式迫使服务器创建一个全新的会话。
我不能在针对Tomcat 7.0.19的准系统Mojarra 2.1.2项目上本地重现您的问题。会话保持完好。我在第一个请求中看到Set-Cookie
的{{1}}响应标头,我在同一个浏览器会话中的每个后续请求中看到JSESSIONID
Cookie
请求标头。这就是它应该如何运作。所以问题至少与Mojarra 2.1.2或Tomcat 7.0.19没有直接关系。
您可以使用Firebug自行查看和跟踪JSESSIONID
Cookie。这是我要做的第一件事。您应该检查是否是拒绝发送JSESSIONID
请求标头的浏览器(我不认为是这种情况),或者是每次都发送新的Cookie
响应标头的服务器(我认为就是这种情况)。如果确实是服务器每次都重新创建会话,即使浏览器已经发送了Set-cookie
标头,那么这只能意味着在代码库中的某处有一个不正确的Cookie
调用强制执行此操作。运行调试器给naildown罪魁祸首。