注销

时间:2015-07-22 06:54:03

标签: java session servlets

我正在使用jspservlet开发一个Web应用程序。在我的应用程序中,我有一个注销部分,其中我使用以下代码:

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

    }
}

在浏览器中,如果我们连续使用并假设一周没有清除历史记录,那么如果我们登录并单击注销,则会将注销重定向到主页,但会话仍然存在。 会话未在注销时清除

这个问题到底发生了什么?我的代码中是否还需要进行更改?

2 个答案:

答案 0 :(得分:0)

不知道问题是什么,但有些建议。

  1. 不需要创建两个HttpSession对象(ss和session),只尝试使用一个。
  2. 尝试删除“uid”属性,而不是将其设为null。
  3. 尝试检查HttpSession是否为null,然后再调用它的invalidate()方法。
  4. 所以最终的代码是,

    dexOptions {
        javaMaxHeapSize "4g"
    }
    

答案 1 :(得分: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);

执行此操作后,您需要通过过滤器检查会话是否对每个请求有效,或者如果会话无效,则检查会话在每个页面上有效(查看),然后重定向到索引页。

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

}