【问题标题】:The session not getting cleared in logout注销时会话未清除
【发布时间】:2015-07-22 06:54:03
【问题描述】:

我正在使用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);
        }

    }
}

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

这个问题是怎么回事?我的代码还需要更改吗?

【问题讨论】:

    标签: java session servlets


    【解决方案1】:

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

    1. 不需要创建两个 HttpSession 对象(ss 和 session),尝试只使用一个。
    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);
            }
    
        }
    }
    

    【讨论】:

    • 感觉这一行有问题 HttpSession ss = rq.getSession(false);上面提到的代码!!
    • 你有什么异常吗?
    • 不!我没有得到任何
    【解决方案2】:

    我认为您不是对应用程序进行适当的会话管理。 我建议使用自定义过滤器来防止浏览器捕获每个页面。

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

    【讨论】:

      猜你喜欢
      • 2012-06-04
      • 2018-09-24
      • 1970-01-01
      • 1970-01-01
      • 2013-03-28
      • 1970-01-01
      • 2015-03-03
      • 1970-01-01
      • 2023-03-14
      相关资源
      最近更新 更多