2015-07-22 18 views
0

Я разрабатываю веб-приложение, используя jsp и servlet. В моем приложении у меня есть раздел выхода из системы, в которой я использую следующий код:Сессия не очищается при выходе из системы

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) { 
       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.invalidate(); 
      rs.sendRedirect("/"); 
     } catch (Exception exp) { 
      // rs.sendRedirect("/"); 
      RequestDispatcher dd = rq.getRequestDispatcher("/"); 
      dd.forward(rq, rs); 
     } 

    } 
} 

В браузере если мы будем использовать непрерывно, и пусть неделю без очистки истории, а затем, если войти в систему и нажать кнопку выхода из системы, его перенаправляется на домашнюю страницу, но сеанс по-прежнему сохраняется. Сессия не очищается при выходе из системы.

В чем проблема? Есть ли в моем коде какие-либо изменения?

ответ

0

Не знаю, в чем проблема, но некоторые предложения.

  1. Не нужно создавать два объекта HttpSession (ss и session), попробуйте использовать только один.
  2. Попробуйте удалить атрибут «uid», а не сделать его нулевым.
  3. Попробуйте проверить, что HttpSession имеет значение null или нет, прежде чем ссылаться на метод invalidate().

Таким образом, окончательный код будет,

public class logout extends HttpServlet { 

    public void service(HttpServletRequest rq, HttpServletResponse rs) throws IOException, ServletException { 
     try { 
      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 ss = rq.getSession(false); 
      if (ss.getAttribute("uid") == null) { 
       rs.sendRedirect("/"); 
      } 

      ss.removeAttribute("uid"); 
      if (ss != null) { 
       ss.invalidate(); 
      } 
      rs.sendRedirect("/"); 
     } catch (Exception exp) { 
      // rs.sendRedirect("/"); 
      RequestDispatcher dd = rq.getRequestDispatcher("/"); 
      dd.forward(rq, rs); 
     } 

    } 
} 
+0

Я чувствую некоторую проблему в этой строке HttpSession ss = rq.getSession (false); Как упоминалось выше код! – Santhucool

+0

Вы получаете какое-либо исключение? – Niranjan

+0

NOPE !! Я не получал – Santhucool

0

Я думаю, что вы не пользователь надлежащего управления сеансом в приложение. Я предлагаю использовать специальный фильтр для предотвращения браузера для каждой страницы.

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); 

После прохождения этого вам необходимо проверить сессия действительна для каждого запроса через фильтр или проверить сессию действующий на каждой странице (вид), если сеанс является недействительным, то перенаправление на главную страницу.

и внести исправления в контроллер выключения.

public void service(HttpServletRequest rq, HttpServletResponse rs) throws IOException, ServletException { 
    try { 
     HttpSession session = rq.getSession(false); 
     session.removeAttribute("uid"); 
     session.invalidate(); 
     rs.sendRedirect("/"); 
    } catch (Exception exp) { 
     RequestDispatcher dd = rq.getRequestDispatcher("/"); 
     dd.forward(rq, rs); 
    } 

} 
Смежные вопросы