Java 会话验证筛选器,该筛选器在会话过期时注销用户

Java 会话验证筛选器,该筛选器在会话过期时注销用户,java,servlets,login,servlet-filters,Java,Servlets,Login,Servlet Filters,我有一个会话验证过滤器,它在会话过期时注销用户 这是一段代码,但它不起作用。不工作意味着即使会话过期,也不会重定向到登录页面 请帮我解决这个问题 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletResponse res = (HttpSe

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

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

请帮我解决这个问题

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);  
    }  
}
我有一个会话验证过滤器,它在会话过期时注销用户

老实说,这毫无意义。如果您将登录用户存储为会话的一个属性,并根据会话中登录用户的存在拦截“登录”状态,则在会话过期时您根本不需要手动注销该用户。当会话到期时,其所有属性都将丢失,因此用户将“自动”注销

下面是一个示例,说明如何在的
doPost()
中登录用户,登录表单的POST submit会调用该函数

stringusername=request.getParameter(“用户名”);
字符串密码=request.getParameter(“密码”);
User=userService.find(用户名、密码);
如果(用户!=null){
request.getSession().setAttribute(“user”,user);//登录用户。
response.sendRedirect(“userhome”);//重定向到用户主页。
}否则{
request.setAttribute(“errormessage”,“未知登录,重试”);//设置错误消息。
request.getRequestDispatcher(“/WEB-INF/login.jsp”).forward(请求,响应);//重新显示登录表单。
}
您可以看到,当登录有效时,用户将存储为会话属性。代码的剩余部分可以检查它是否为null,以确定用户是否登录。只要会话过期,它就会自动变为空


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

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

  • “当访问者请求仅限于登录用户的页面时,如何将其重定向到登录页面?”

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

    @覆盖
    public void doFilter(ServletRequest-req、ServletResponse-res、FilterChain-chain)抛出IOException、ServletException{
    HttpServletRequest请求=(HttpServletRequest)请求;
    HttpServletResponse=(HttpServletResponse)res;
    HttpSession session=request.getSession(false);
    if(session==null | | session.getAttribute(“用户”)==null){
    response.sendRedirect(“login”);//未找到登录用户,因此重定向到登录页面。
    }否则{
    chain.doFilter(req,res);//找到登录用户,所以只需继续请求即可。
    }
    }
    

  • “会话到期时,如何将当前打开的页面自动重定向到登录页面?”

    结合使用
    刷新

    
    
    每当会话过期时,这将自动将当前页面重定向到给定的
    url
    ${pageContext.session.maxInactiveInterval}
    表达式将内联以秒为单位的会话过期时间,这正是
    content
    属性所需要的


  • 您是否已检查重定向块中的sesion id?它在变化吗?您的软件/框架是否可能在某处调用getSession(true)?我有标记,但它只是立即重定向到我指定的页面。@Makky:显然它打印了
    0
    。好的。您能告诉我如何在会话到期时自动重定向吗?@BalusC:答案很好,但出于好奇,不使用getSession(false)跟踪会话的原因是什么。文档中清楚地写着,当请求没有附加任何现有会话时,它返回null。@未知:因为您仍然希望容器创建一个会话。请注意,过滤器不会这样做,因为您不希望容器不必要地创建它,即使您不打算使用它。