当前位置: 首页 > 面试题库 >

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

黎腾
2023-03-14
问题内容

我有一个会话验证过滤器,当会话过期时该过滤器注销用户。

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

请帮助我解决此问题。

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()使用servlet登录用户,该servlet由登录表单JSP的POST提交调用。

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.
}

您会看到,当登录有效时,用户将存储为会话属性。您的代码残留可以只检查它是否为空,或者确定用户是否已登录。只要会话过期,它就会自动变为空。

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

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

  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.
    }
}
  1. “会话期满后,如何自动将当前打开的页面重定向到登录页面?”

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

    <meta http-equiv="refresh" content="${pageContext.session.maxInactiveInterval};url=sessionexpired.jsp">

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



 类似资料:
  • 问题内容: 我们的应用程序在30分钟后注销并重定向到登录页面,我在web.xml中指定会话超时,并使用requestProcessor进行重定向。我想向用户显示一条消息,指出会话过期后会话已过期,如何我可以这样做吗?自动注销?我想在“会话超时,请重新登录”页面上提示错误消息。那我怎么能检测到会话超时呢?有什么方法会自动触发吗? 问题答案: 创建一个活动检查器,该检查器每分钟检查是否发生了任何用户活

  • 我在Tomcat7中有一个web应用程序,它将会话中的用户信息作为DTO对象保存。我还为我的项目启用了Spring Security性,如果用户没有会话,它会自动将用户重定向到登录页面。 如果我登录到应用程序一次,然后在Eclipse中重新启动Tomcat,会发生的情况是,我的会话被冲出,但cookie没有运行。 Edit:尽管Firefox说,但如果关闭并重新启动Firefox,cookie仍然

  • 只是一个关于Spring Security性和会话失效的问题。 当会话被ConcurrentSessionControlStrategy无效时,会话将通过调用removeSessionInformation方法从SessionRegistry中移除;然而,当会话被手动注销无效时,HttpSession也会无效,但不会调用SessionRegistry从那里移除条目。 我添加了HttpSession

  • 问题内容: 我在iOS应用中使用Firebase身份验证。当用户使用Firebase登录我的应用程序然后注销该用户的所有其他设备(会话)时,Firebase中是否有任何方法?我可以使用Firebase admin SDK来做到这一点吗? 问题答案: 当我遇到此问题时,我已使用云功能解决了该问题,请访问此链接以获取更多详细信息https://firebase.google.com/docs/auth

  • 问题内容: 我的webapp有登录的用户。有超时。在会话到期之前,我想执行一种方法来清除一些锁。 我已经实现了一个,但是一旦到达会话,会话就已经消失了,我需要从中获取一些数据,因此我想在会话实际过期之前执行一个方法(该会话需要运行并可以访问)。 我怎样才能做到这一点?有任何想法吗?这是我的会话监听器: 但我要去的原因是null或返回null 问题答案: 您可以通过实现HttpSessionBind

  • 首先;这个问题类似于另一个尚未解决的问题:对magento soap api的调用立即过期 我正在开发一个基于XMLRPC的客户端-服务器模块。基于Magento的服务器向基于Java的客户端公开了几个API方法。我在我的客户端中使用标准JavaXMLRPC Jars。 我有一个“登录”调用,用于检索会话。然后我把这个传给其他人做不同的电话。我检查了它是否返回(看起来)有效会话。 但是,我使用此会