WebSphere转Liberty+JSF2.2后遇ViewExpiredException问题咨询
首先直接回答你的核心问题:当JSF使用server状态保存方式时,它没有自己专属的会话Cookie——它完全依赖Java EE容器(这里就是Liberty)提供的会话跟踪Cookie来找到对应的HttpSession,进而获取存在会话里的视图状态。
对于Liberty来说,默认的会话Cookie名称是JSESSIONID,这也是绝大多数Java EE容器的标准默认值。如果没有在Liberty的配置里自定义会话Cookie名称,那JSF就是通过这个JSESSIONID Cookie来检索会话的。
结合你从WebSphere 8.5.10+JSF2.1切换到Liberty17+JSF2.2后出现的ViewExpiredException,我给你几个针对性的排查方向:
- 检查Liberty的会话配置:打开你的server.xml,看看有没有
<httpSession>元素,里面是否设置了cookieName属性。如果有自定义值,那就是Liberty使用的会话Cookie名称,JSF也会用这个来检索会话。 - JSF2.2的视图状态机制变化:JSF2.2对视图状态的验证和存储逻辑做了强化,新增了
javax.faces.ViewState隐藏字段的处理。如果你的页面跳转或表单提交时,这个视图状态字段没有正确传递,或者会话因为超时、序列化失败被销毁,就会触发异常。 - 会话对象的序列化问题:Liberty的会话序列化规则和WebSphere传统版可能有差异。如果你的应用中存在存储在HttpSession里的对象没有实现
Serializable接口,在Liberty下会话可能无法正常持久化或传递,导致视图状态丢失。这也能解释为什么切换到client模式问题会缓解——client模式不需要会话存储,但如果有非序列化对象,就会出现新的错误。 - 客户端Cookie传递问题:检查浏览器是否禁用了Cookie,或者你的应用存在跨域场景,Cookie的
SameSite属性设置不合理,导致JSESSIONID无法在请求中正确传递到服务器。没有这个Cookie,JSF就找不到对应的会话,自然会抛出视图过期异常。
你可以先通过浏览器开发者工具查看请求的Cookie列表,确认JSESSIONID(或自定义名称)是否在每次请求中都存在并正确发送。如果Cookie没问题,再去排查会话对象的序列化和Liberty的会话配置。
内容的提问来源于stack exchange,提问作者rickcoup
相关产品推荐
相关产品推荐

