【问题标题】:java.lang.IllegalStateException: Cannot call sendRedirect() after the response has been committed [duplicate]java.lang.IllegalStateException:提交响应后无法调用 sendRedirect() [重复]
【发布时间】:2015-06-18 16:42:54
【问题描述】:

我正在调用 java servlet 从我的页面注销,将所有值设置为 null 并重置 http 会话,如下所示:

public class logout extends HttpServlet
{
    public void service(HttpServletRequest rq,HttpServletResponse rs)throws IOException,ServletException
    {
        try{
            HttpSession ss=rq.getSession(false);
            if(ss.getAttribute("uid")==null || ss.getAttribute("usr")==null || ss.getAttribute("acc")==null)
            {
                rs.sendRedirect("/");
            }

            rs.setHeader("Cache-Control","no-cache, no-store, must-revalidate"); 
            rs.addHeader("Cache-Control", "post-check=0, pre-check=0");
            rs.setHeader("Pragma","no-cache"); 
            rs.setDateHeader ("Expires", 0);    
            HttpSession session = rq.getSession(false);
            session.setAttribute("uid",null);
            session.setAttribute("usr",null);
            session.setAttribute("acc",null);
            session.invalidate();
            rs.sendRedirect("/");
        }
        catch(Exception exp)
        {
            //Catch
        }


    }
}

如果我单击注销按钮,则可以正常注销。假设如果我有一段时间没有注销假设 30 分钟然后按注销按钮我得到一个空白页面而不是重定向到主页。 在stacktrace中我得到了如下错误:

java.lang.IllegalStateException: Cannot call sendRedirect() after the response has been committed
    org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:494)
    logout.service(logout.java:32)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

我知道它会被捕获,因为会话会自动过期。我该如何处理?即使会话自动过期,我也需要重定向到主页。我该怎么办?

【问题讨论】:

  • 请在此处打印错误堆栈跟踪。

标签: java session servlets


【解决方案1】:

如果容器的会话过期了,那么这一行

HttpSession ss=rq.getSession(false);

将返回null


在使用ss 变量之前,您没有检查not null,这可能会在运行时引发异常。

而且,你不需要多一个变量来保持会话,你可以重复使用ss

     if(ss != null){
            if(ss.getAttribute("uid")==null || ss.getAttribute("usr")==null || ss.getAttribute("acc")==null)
                        {
                           // rs.sendRedirect("/");
                        }else{        
                        rs.setHeader("Cache-Control","no-cache, no-store, must-revalidate"); 
                        rs.addHeader("Cache-Control", "post-check=0, pre-check=0");
                        rs.setHeader("Pragma","no-cache"); 
                        rs.setDateHeader ("Expires", 0);    

                        ss.setAttribute("uid",null);
                        ss.setAttribute("usr",null);
                        ss.setAttribute("acc",null);
                        ss.invalidate();
                      //  rs.sendRedirect("/");
    }
        }
rs.sendRedirect("/");

【讨论】:

  • 好的。所以你说我需要在尝试之前检查 ss == null ???你可以发布作为答案然后它会有所帮助!!
  • 查看更新后的回复。
  • 获取错误页面 上述错误。我已经更新了问题!
  • 从 if 块中删除或注释 rs.sendRedirect("/")。
  • 如果我这样做了,那么它将如何重定向到主页???
【解决方案2】:

在我的 catch(){} 块中添加了一些更改,如下所示,现在可以正常工作了。

catch(Exception exp)
        {
            RequestDispatcher dd = rq.getRequestDispatcher("/");
            dd.forward(rq, rs);
        }

【讨论】:

    猜你喜欢
    • 2012-09-23
    • 2014-08-22
    • 2013-12-17
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多