JBOSS 7服务器频繁抛出java.lang.IllegalStateException异常如何解决
该java.lang.IllegalStateException异常触发的核心原因是:HTTP响应已经被提交到客户端后,RestEasy的异常处理逻辑仍尝试执行响应重置操作。
从堆栈路径可以明确触发流程:
RestEasy写响应体过程中抛出未捕获异常 → 触发内置异常映射器处理逻辑 → 调用HttpServletResponse.reset()方法清空已写入的响应内容 → 此时CORSFilter已经完成响应头写入、甚至部分响应体已经发回客户端,响应对象处于已提交状态,reset()方法直接抛出非法状态异常。
按优先级从高到低执行以下操作即可解决:
升级依赖兼容版本
你当前使用的RestEasy 2.3.2.Final存在已知的异常处理阶段响应重置逻辑缺陷,同时cors-filter 2.6和JBOSS 7内置的Servlet 3.0容器存在适配问题。直接升级两个组件到兼容版本:- RestEasy升级到
2.3.7.Final(JBOSS 7支持的最高稳定2.x版本) - cors-filter升级到
2.12版本
两个版本均已修复响应状态判断的相关缺陷,可直接规避该问题。
- RestEasy升级到
调整Filter执行顺序
在web.xml配置中,将CORSFilter的filter-mapping配置放到所有其他Filter(包括Weld会话传播过滤器)的最前面,确保CORS响应头在业务逻辑执行前完成写入,避免后续响应提交后CORSFilter再修改响应内容。
示例配置:<!-- CORSFilter放在所有filter最顶部 --> <filter> <filter-name>CORSFilter</filter-name> <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class> </filter> <filter-mapping> <filter-name>CORSFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 其他Filter配置放在CORSFilter后面 -->关闭RestEasy强制重置响应开关
在resteasy-servlet的初始化参数中添加配置,关闭异常处理时的强制响应重置逻辑:<servlet> <servlet-name>resteasy-servlet</servlet-name> <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class> <init-param> <param-name>resteasy.disable.response.optimization</param-name> <param-value>true</param-value> </init-param> </servlet>自定义响应提交状态校验
如果上述方案都不适用,可自定义Filter继承CORSFilter,重写doFilter方法,在执行响应操作前先判断响应是否已提交:public class CustomCORSFilter extends CORSFilter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { super.doFilter(request, response, (req, res) -> { chain.doFilter(req, res); // 响应已提交时直接返回,不执行后续CORS响应修改逻辑 if (res.isCommitted()) { return; } }); } }
内容的提问来源于stack exchange,提问作者Chirag

