You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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可能有默认配置覆盖

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 10:53:14