java.lang.IllegalStateException:在提交响应后无法调用sendRedirect()

时间:2015-06-18 16:42:54

标签: java session servlets

我正在调用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分钟然后按下注销按钮我得到一个空白页而不是重定向到主页。 在堆栈跟踪中,我得到了如下的错误:

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)

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

2 个答案:

答案 0 :(得分:-1)

如果容器的会话已过期,则此行

HttpSession ss=rq.getSession(false);

将返回null

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

而且,您不需要再有一个变量用于保持会话,您可以重用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("/");

答案 1 :(得分:-1)

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

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