2015-07-22 73 views
0

我正在开发一个Web应用程序使用jspservlet。在我的应用程序有一个注销部分,在我使用下面的代码:会议未注销清除

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和会话),只尝试使用一个。
  2. 尝试删除“uid”属性,而不是将其设置为空。
  3. 在调用它的invalidate()方法之前,尝试检查HttpSession是否为null。

所以最终的代码会,

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

我认为你是不正确的用户会话管理到应用程序中。 我建议使用自定义过滤器来防止每个页面的浏览器catche。

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

打算在此之后,你需要检查会话有效期为通过过滤器每一个请求或检查会话的每个页面(视图)和有效的,如果会话无效然后重定向到索引页面。

并对Logout控制器进行一些修正。

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

}