从WAS 8.5升级到9.0后JSF应用二次请求未提交至服务器
JSF升级后重复首次请求响应问题排查方案
环境背景
- 原环境:Java 1.7 + WAS 8.5 + MyFaces 2.2.4(共享库部署)
- 升级后:Java 1.8 + WAS 9.0,MyFaces版本及共享库配置不变
- 现象:首次点击触发服务器调用的按钮正常,后续点击任何按钮均返回首次请求的结果;二次请求未发送至服务器,多浏览器均出现该问题
排查方向及解决步骤
1. 检查WAS9的HTTP缓存配置
WAS9默认缓存策略可能比8.5更激进,导致响应被错误缓存:
- 登录WAS控制台,进入目标应用的Web容器设置,找到HTTP响应缓存:
- 禁用应用级的响应缓存,或为JSF回发请求添加禁止缓存的响应头(
Cache-Control: no-cache, no-store, must-revalidate、Expires: 0) - 确认POST请求的响应未被缓存,JSF回发请求均为POST,理论上不应被缓存,但WAS9可能有默认配置覆盖
- 禁用应用级的响应缓存,或为JSF回发请求添加禁止缓存的响应头(
2. 确认共享库的类加载顺序
WAS9的类加载机制与8.5存在差异,类加载顺序错误可能导致MyFaces功能异常:
- 进入共享库配置,设置类加载顺序为应用程序类加载器优先(PARENT_LAST),避免WAS自带的JSF类覆盖MyFaces的实现
- 检查应用的类加载策略,确保共享库中的MyFaces类被优先加载
3. 校验JSF视图状态配置
MyFaces的视图状态处理在WAS9下可能出现异常,导致客户端无法发起新请求:
- 查看页面源码,确认
javax.faces.ViewState隐藏字段的值在每次回发后是否更新:- 若未更新,客户端会重复使用旧状态,服务器将其识别为同一请求
- 在
web.xml中显式配置视图状态存储方式为客户端:
避免服务器端状态管理的潜在异常<context-param> <param-name>org.apache.myfaces.SAVE_STATE_METHOD</param-name> <param-value>client</param-value> </context-param>
4. 检查客户端请求逻辑
确认JSF生成的页面元素是否正确,排除客户端脚本异常:
- 查看页面源码,确认每个按钮的
name和value属性唯一,JSF依赖这些属性区分不同的action/actionListener - 确认表单
method属性为POST,GET请求更容易被缓存,JSF回发必须使用POST - 打开浏览器开发者工具的网络标签,确认后续点击按钮时是否真的无请求发送:
- 若确实无请求,检查控制台是否有JS错误,旧版MyFaces的JS脚本在Java8+环境下可能存在兼容性问题,可尝试升级MyFaces至2.2.17及以上版本(尽管原版本不变,但旧版本可能不兼容WAS9)
5. 检查WAS9的会话管理配置
会话配置异常可能导致视图状态关联失效:
- 进入WAS控制台的会话管理设置,确认会话跟踪机制为
COOKIE,且Cookie的secure、httpOnly配置合理 - 检查会话超时时间,排除首次请求后会话被意外销毁的情况
内容的提问来源于stack exchange,提问作者Greg Hazzard
相关产品推荐
相关产品推荐

