2

很长时间以来,我一直在我的项目中使用 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 中强制了 30 分钟会话超时) .

使应用程序正常工作的唯一方法是更改​​此设置:

<context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value>
</context-param>

它是服务器,我将其更改为客户端,但服务器设置最好保留数据服务器端,并且不要在每次请求时将其传输到客户端。

编辑:看起来服务器客户端修复了ViewExpiredException的问题,但网站上的用户登录功能不再起作用。它登录到用户主页,但是在单击任何链接后,它的作用与用户不是记录器一样(我使用SessionScoped ManagedBean来保存用户信息)。

有人有这个bug吗?

谢谢,

亚历克斯。

4

1 回答 1

2

ViewExpiredException当视图不再在会话中时,您将得到一个。所描述的症状表明会话 cookie 没有被维护,因此每个请求都以某种方式迫使服务器创建一个全新的会话。

我无法在针对 Tomcat 7.0.19 的准系统 Mojarra 2.1.2 项目上本地重现您的问题。会话得到很好的维护。我看到了第一个请求的Set-Cookie响应标头,JSESSIONID并且我看到了同一浏览器会话中每个后续请求的Cookie请求标头。JSESSIONID这就是它应该如何工作的方式。所以这个问题至少与 Mojarra 2.1.2 或 Tomcat 7.0.19 没有直接关系。

您可以使用 Firebug 自己查看和跟踪JSESSIONIDcookie。这是我要做的第一件事。您应该检查是否是浏览器拒绝发Cookie回请求标头(我认为不是这种情况),或者是服务器Set-cookie每次都发送新的响应标头(我认为是这种情况)。如果确实是服务器每次都重新创建会话,即使浏览器已经发送了Cookie标头,那么这只能意味着HttpSession#invalidate()代码库中某处存在不正确的调用,从而强制执行此操作。运行调试器来确定罪魁祸首。

于 2011-08-15T13:06:32.163 回答