Struts 2:提交响应后,不可能获得会话

时间:2018-08-14 23:30:10

标签: spring-boot struts2 tomcat8

我已经阅读了another article,但是对于整个应用程序来说,这并没有帮助我找到通用的解决方案。

我保留了一个大型旧式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);
        }
    }
}

0 个答案:

没有答案