spring-boot - Struts 2:提交响应后无法获取会话
问题描述
我已经阅读了另一篇关于它的文章,但它并不能帮助我找到整个应用程序的通用解决方案。
我保留了一个大型遗留 Web 应用程序(Struts2、Spring Boot 和 Tomcat 嵌入式),我正面临以下错误。
2018-08-14 11:01:11.872 [http-nio-10010-exec-114] ERROR o.a.c.c.C.[.[localhost].[/].[jsp] - Servlet.service() for servlet jsp threw exception java.lang.IllegalStateException: Cannot create a session after the response has been committed
at org.apache.catalina.connector.Request.doGetSession(Request.java:2953)
at org.apache.catalina.connector.Request.getSession(Request.java:2367)
at org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:896)
at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:231)
at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:592)
at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:537)
at org.apache.jasper.runtime.PageContextImpl.initialize(PageContextImpl.java:137)
at org.apache.jasper.runtime.JspFactoryImpl.internalGetPageContext(JspFactoryImpl.java:109)
at org.apache.jasper.runtime.JspFactoryImpl.getPageContext(JspFactoryImpl.java:60)
at org.apache.jsp.jsp.errorPage_jsp._jspService(errorPage_jsp.java:127)
其他示例:
2018-08-14 11:01:11.870 [http-nio-10010-exec-114] ERROR o.a.c.c.C.[.[.[.[.q.q.c.RedirectResourceServlet] - Servlet.service() for servlet [com.mydomain.myapplication.control.RedirectResourceServlet] in context with path [] threw exceptionjava.lang.IllegalStateException: Cannot create a session after the response has been committed
at org.apache.catalina.connector.Request.doGetSession(Request.java:2953)
at org.apache.catalina.connector.Request.getSession(Request.java:2367)
at org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:896)
at org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:908)
at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:240)
at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:240)
它出现在不同的地方,例如 *Actions.java 和 JSP 文件。
有人知道如何以及哪种方法是拦截所有request.getSession()
内容以检查它是否已经提交的最佳方法?我如何在 Struts 2 上下文中创建一个新会话?当为真request.getSession(true)
时 不起作用。response.isCommitted()
我已经尝试创建一个@WebFilter,我在其中检查并尝试创建一个新会话,但它没有按预期工作。我也认为这不是最好的方法。
@WebFilter(urlPatterns = "/*")
public class SessionValidatorFilter implements Filter {
private Logger logger = LoggerFactory.getLogger(getClass().getName());
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
if (servletResponse.isCommitted() && servletRequest instanceof HttpServletRequest && servletResponse instanceof HttpServletResponse) {
logger.debug("Response was already committed. Trying to create a new session.");
try {
HttpSession session = ((HttpServletRequest) servletRequest).getSession(true);
if (session != null)
logger.debug("Session created.");
filterChain.doFilter(servletRequest, servletResponse);
} catch (Exception e) {
logger.debug("Error trying to create new Session.");
}
} else {
filterChain.doFilter(servletRequest, servletResponse);
}
}
}
解决方案
推荐阅读
- sql - 当有两行满足查询时,PostgreSQL 查询仅返回一行
- python - mysql上的表关系以计算新字段
- c++ - C ++为什么这种结构甚至有效?
- sql - 在 SQL Server 2016 上使用 STUFF 和 XML PATH 时如何返回空白或空记录?
- azure-devops - Azure DevOps 管道资源触发器不起作用
- c# - C# Main Form BackColor 在图像前面移动
- javascript - 我只得到第二个 .innerHTML 结果,第一个没有运行
- javascript - 快速路由到搜索结果
- python - 计数碱基 DNA 链序列
- reactjs - redux 中是否需要中间件和增强器?