2015-06-18 2 views
0

Я зову java servlet для выхода из системы с моей страницы настройки всех значений NULL и сброса сеанса 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 минут, то нажмите кнопку выхода из системы. Я получаю пустую страницу вместо перенаправления на домашнюю страницу. В StackTrace я получил 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.


Вы не проверяли 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("/"); 
+0

ОК. Итак, вы говорите, что мне нужно проверить ss == null перед тем, как попробовать. Можете ли вы опубликовать ответ, тогда это будет полезно! – Santhucool

+0

См. Обновленный ответ. –

+0

Ошибка страницы Ошибка, упомянутая выше. Я обновил вопрос !! – Santhucool

-1

Добавлено несколько изменений в мой блок catch() {} следующим образом, теперь работает нормально.

catch(Exception exp) 
     { 
      RequestDispatcher dd = rq.getRequestDispatcher("/"); 
      dd.forward(rq, rs); 
     } 
Смежные вопросы