代码之家  ›  专栏  ›  技术社区  ›  Prabhat

如何区分注销和会话过期?

  •  6
  • Prabhat  · 技术社区  · 15 年前

    案例1:注销:一旦我们注销,如果试图访问上一个,它必须自动重定向到login.jsp

    案例2:会话过期:如果会话在用户仍然登录时过期,则在访问上一页时,它必须尝试自动重定向到sessionExpired.jsp。

    如何区分?我当前正在注销时使会话无效。

    3 回复  |  直到 15 年前
        1
  •  9
  •   JoseK    15 年前

    登录时,设置一个长过期的cookie(>24小时)。通过将maxage设置为0,在注销时删除此cookie。

    您可以检查任何未登录的用户(即会话id无效)。 如果cookie不存在,请将其重定向到login.jsp

    如果cookie存在,则表示他的会话已过期,因此将其重定向到session-expired.jsp

        2
  •  8
  •   BalusC    13 年前

    HttpServletRequest#getRequestedSessionId() 不会再回来了 null (这意味着客户端已发送会话cookie,因此假定会话仍然有效)以及 HttpServletRequest#isRequestedSessionIdValid() 退货 false

    在螺母中:

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        HttpSession session = request.getSession(false);
    
        if (request.getRequestedSessionId() != null && !request.isRequestedSessionIdValid()) {
            response.sendRedirect(request.getContextPath() + "/sessionexpired.jsp");
        } else if (session == null || session.getAttribute("user") == null) {
            response.sendRedirect(request.getContextPath() + "/login.jsp");
        } else {
            chain.doFilter(request, response);
        }
    }
    

    Filter url-pattern 覆盖受保护的页面(因此不包括sessionexpired和login页面!)。

    别忘了禁用浏览器对受保护页面的页面缓存,否则当您返回浏览器历史记录时,webbrowser将从缓存中加载这些页面,而不是向服务器发送新请求。您可以通过在同一个过滤器中执行以下操作来实现这一点, 之前 Chain#doFilter() 打电话。

    response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
    response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
    response.setDateHeader("Expires", 0); // Proxies.
    
        3
  •  1
  •   Gavin    15 年前

    由于您仍然无法区分超时和未登录,我通常会做出这样的决定:如果他们请求一个经过身份验证的页面,我只会将他们发送到会话超时页面,该页面还兼作一个登录页面,上面写着

    “哦,我们不知道您是谁,您的会话已超时或您尚未登录请在下面登录”

    这就迎合了这两种情况

    推荐文章