PrimeFaces 13.0浏览器会话首次请求显示"Invalid Request"问题求助
问题定位
你的问题核心是PrimeFaces 13.0升级后,Chrome首次会话请求被Shiro的InvalidRequestFilter拦截(返回"Invalid Request"),而后续请求正常。这是因为PrimeFaces 13的首次请求格式(比如资源路径、请求头或参数)触发了Shiro默认的非法请求检查规则,导致登录Bean代码未被执行。
配置层面解决方案
以下是通过web.xml或Shiro配置文件解决的可行方案:
1. 调整Shiro InvalidRequestFilter的检查规则
针对Shiro的InvalidRequestFilter,添加放行规则或关闭特定检查项,避免误拦截PrimeFaces的请求。
方式1:在web.xml中配置Shiro Filter的初始化参数
如果使用web.xml配置Shiro,修改filterChainDefinitions,为PrimeFaces资源或登录页面添加自定义检查规则:
<filter> <filter-name>shiroFilter</filter-name> <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class> <init-param> <param-name>filterChainDefinitions</param-name> <param-value> <!-- 放行PrimeFaces资源路径 --> /javax.faces.resource/** = anon /primefaces/** = anon <!-- 对登录页面关闭易触发的检查项:非ASCII字符、分号 --> /index.xhtml = authc, invalidRequestFilter[blockNonAscii=false,blockSemicolon=false] <!-- 其他业务路径规则 --> /** = authc </param-value> </init-param> </filter>
方式2:在Shiro.ini中配置
若使用shiro.ini,添加或修改过滤器配置:
[main] invalidRequestFilter = org.apache.shiro.web.filter.InvalidRequestFilter # 关闭非ASCII字符拦截 invalidRequestFilter.blockNonAscii = false # 关闭分号拦截 invalidRequestFilter.blockSemicolon = false [urls] /javax.faces.resource/** = anon /primefaces/** = anon /index.xhtml = authc, invalidRequestFilter /** = authc
2. 调整PrimeFaces的请求格式配置
修改PrimeFaces的初始化参数,使其请求格式避开Shiro的拦截规则:
<context-param> <!-- 禁用客户端验证,减少首次请求的特殊参数 --> <param-name>primefaces.CLIENT_SIDE_VALIDATION</param-name> <param-value>false</param-value> </context-param> <context-param> <!-- 使用JSF默认资源处理器,避免PrimeFaces自定义资源路径触发拦截 --> <param-name>primefaces.RESOURCE_HANDLER</param-name> <param-value>com.sun.faces.application.resource.ResourceHandlerImpl</param-value> </context-param>
3. 临时禁用InvalidRequestFilter(应急方案)
若上述方案无效,可临时禁用该过滤器(注意:会降低安全防护,仅作为应急手段):
<filter> <filter-name>shiroFilter</filter-name> <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class> <init-param> <param-name>filterChainDefinitions</param-name> <param-value> /javax.faces.resource/** = anon /index.xhtml = authc /** = authc </param-value> </init-param> </filter>
验证步骤
- 清空Chrome的缓存、Cookie,重启浏览器
- 首次访问应用,确认是否直接进入
index.xhtml且登录Bean断点触发 - 查看JBoss日志,确认无
InvalidRequestFilter拦截记录
内容的提问来源于stack exchange,提问作者BelaOxmyx
相关产品推荐
相关产品推荐

