2015-06-18 45 views
0

我打電話java servlet用於註銷從我的頁面設置都爲空和重置HTTP會話中值如下:java.lang.IllegalStateException:無法調用sendRedirect()後的反應一直致力於

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分鐘,然後按註銷按鈕我得到一個空白頁面,而不是重定向到主頁。 在堆棧跟蹤我得到了erroe如下:

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) 

我知道這是要趕,因爲會話將自動失效。我該如何處理?即使會話自動到期,我也需要重定向到主頁。我該怎麼辦?

+0

請在這裏打印錯誤的堆棧跟蹤。 –

回答

-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("/"); 
+0

好的。所以你說我需要檢查ss == null之前去嘗試???你可以發佈作爲一個答案,那將是有益的! – Santhucool

+0

查看最新的回覆。 –

+0

獲取錯誤頁面上述錯誤。我更新了問題! – Santhucool

-1

在catch(){}塊中添加了一些更改,現在可以正常工作。

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