首页 > 解决方案 > 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);
        }
    }
}

标签: spring-bootstruts2tomcat8

解决方案


推荐阅读