会话验证过滤器,在会话过期时注销用户

5 java servlets login servlet-filters

我有一个会话验证过滤器,在会话过期时注销用户.

这是一段代码,但这不起作用.不工作意味着即使会话过期,也不会重定向到登录页面.

请帮我解决这个问题.

public void doFilter(ServletRequest request, ServletResponse response, 
        FilterChain chain) throws IOException, ServletException {  
    HttpServletResponse res = (HttpServletResponse) response;  
    HttpServletRequest req = (HttpServletRequest) request;  

    HttpSession s = req.getSession(false);  

    if (s==null)
    {
        //redirect to login page with session expiry message   
    } else {  
        chain.doFilter(request, response);  
    }  
}
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 10

我有一个会话验证过滤器,在会话过期时注销用户.

这真的没有任何意义.如果将登录用户存储为会话属性并根据会话中登录用户的存在截获"已登录"状态,则无需手动注销用户会话已过期.当会话到期时,无论如何它的所有属性都将丢失,因此用户将"自动"注销.

这里有一个如何可以在登录用户的例子doPost()一个的小服务程序是由一个POST调用提交登录表单的JSP.

String username = request.getParameter("username");
String password = request.getParameter("password");
User user = userService.find(username, password);

if (user != null) {
    request.getSession().setAttribute("user", user); // Login user.
    response.sendRedirect("userhome"); // Redirect to user home page.
} else {
    request.setAttribute("errormessage", "Unknown login, try again"); // Set error message.
    request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); // Redisplay login form.
}
Run Code Online (Sandbox Code Playgroud)

您会看到,当登录有效时,用户将存储为会话属性.您的代码的残余部分可以检查它是否为空以确定用户是否已登录.每当会话到期时,它将自动变为空.


即使会话过期,也不会重定向到登录页面

我不知道你要做什么,因为最初的功能要求毫无意义.但是,存在与会话到期和登录页面相关的两个常见功能要求.我想你实际上需要其中一个:

  1. "当访问者请求限制为登录用户的页面时,如何将访问者重定向到登录页面?"

    您需要创建一个过滤器并将其映射到受限页面的(通用)URL模式.在过滤器中,只需检查用户是否在会话中,然后继续链,否则重定向到登录页面.

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        HttpSession session = request.getSession(false);
    
        if (session == null || session.getAttribute("user") == null) {
            response.sendRedirect("login"); // No logged-in user found, so redirect to login page.
        } else {
            chain.doFilter(req, res); // Logged-in user found, so just continue request.
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. "当会话到期时,如何自动将当前打开的页面重定向到登录页面?"

    <meta>结合使用刷新HttpSession#getMaxInactiveInterval().

    <meta http-equiv="refresh" content="${pageContext.session.maxInactiveInterval};url=sessionexpired.jsp">
    
    Run Code Online (Sandbox Code Playgroud)

    url每当会话到期时,这将自动将当前页面重定向到给定页面.该${pageContext.session.maxInactiveInterval}表达式将内联会话过期时间(秒),这是什么content属性需要.