登录会话超时

Posted

技术标签:

【中文标题】登录会话超时【英文标题】:Login session timeout 【发布时间】:2017-04-04 23:24:30 【问题描述】:

我想为登录会话设置 x 分钟的超时时间。

我创建了一个SessionListener:

public class SessionListener implements HttpSessionListener 

    @Override
    public void sessionCreated(HttpSessionEvent event) 
        event.getSession().setMaxInactiveInterval(60 *15);
    

    @Override
    public void sessionDestroyed(HttpSessionEvent event)  

它会创建超时 15 分钟的会话,但我想在用户登录后设置此超时。否则,如果您在登录页面等待超过 15 分钟并尝试登录,则会话已被破坏,您将无法登录(并启动 AccessDeniedHandler 类)。

【问题讨论】:

【参考方案1】:

最后我有一个解决方案。即使用户未通过身份验证,Spring 也会创建会话的主要原因是为了 csrf 令牌,因此一旦打开页面,Spring 就会创建会话。我所做的是在创建会话时设置会话没有超时。

public class SessionListener implements HttpSessionListener 

    @Override
    public void sessionCreated(HttpSessionEvent event) 
        event.getSession().setMaxInactiveInterval(0);
    

    @Override
    public void sessionDestroyed(HttpSessionEvent event)  

然后,一旦用户通过身份验证(使用登录页面),我将超时设置为当前会话:

public class LoginSuccessHandler extends SimpleUrlAuthenticationSuccessHandler 

    @Autowired
    private RedirectStrategy redirectStrategy;

    @Override
    protected void handle(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException 

        // Set session timeout when user is authenticated
        request.getSession().setMaxInactiveInterval(5);

        redirectStrategy.sendRedirect(request, response, targetUrl);
    


通过这种方式,用户可以在登录页面停留多久,并且会话永远不会被破坏。

【讨论】:

谢谢,这个解决方案也解决了我的问题,不确定这是否是处理这个问题的最佳方法,但它有效。在 SessionListener 里面我放了一个无限时间的负值:setMaxInactiveInterval(-1)

以上是关于登录会话超时的主要内容,如果未能解决你的问题,请参考以下文章

Grails Spring Security - 会话超时后重新登录时重新加载会话变量

登录页面刷新时会话超时

会话超时后自动重定向到登录页面 - JSP,Spring

会话超时后失效

当会话超时重定向到 GWT 项目中的登录页面时

Spring 3.1:处理会话超时