即使用户正在使用系统,N分钟后的绝对会话到期

我正在使用带有弹簧安全性的grails web应用程序。 即使会话处于活动状态,我也要求在固定的一组时间后强制会话到期。

我想我可以添加filter并检查每个请求的上次登录时间:

if (CURRENT_TIME - LAST_LOGIN > ABSOLUTE_SESSIO EXPIRATION) then FORCE LOGOUT 

但问题是,在用户发出请求之前,会话仍然在服务器上处于活动状态。

即使用户使用系统,这可能会在N分钟后立即销毁会话吗? 我正在研究tomcat会话管理以及Spring安全性如何处理它,但没有找到任何有用的信息。

有人能指出我的一些例子吗? 有没有人实现类似的东西?

[编辑:在登录时间决定的特定时间杀死会话的想法将使用像Quartz这样的任务调度程序来安排作为参数传递会话的任务。 然后,您可以安排它调用在特定时间点执行session.invalidate()的作业。 该任务将在登录时安排。]

我就是这样做的,但它不会在你想要的特定时间杀死会话。 它依赖于用户发出请求。 这不是万无一失的,但你可以通过一个AJAX调用让应用程序每分钟左右轮询一次。

在用户会话上设置会话激活时间。 然后为Web应用程序添加一个筛选器,以查看检查(激活期+允许的时间)超过当前时间的所有传入请求。 如果没有,则调用session.invalidate();

即在登录时

 HttpSession session = request.getSession(); session.setAttribute( "activation-time", System.currentTimeMillis() ); 

然后在web.xml中添加一个filter

  SessionFilter com.something.SessionFilter  max-period 60000    SessionFilter /*  

filter将是……

 package com.something; import java.io.IOException; import java.util.Date; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; public class SessionFilter implements Filter { private long maxPeriod; public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpSession session = request.getSession( false ); if ( session != null ) { long activated = (long) session.getAttribute( "activation-time" ); if ( System.currentTimeMillis() > ( activated + maxPeriod ) ) { session.invalidate(); } } chain.doFilter(req, res); } public void init(FilterConfig config) throws ServletException { //Get init parameter if ( config.getInitParameter("max-period") == null ) { throw new IllegalStateException( "max-period must be provided" ); } maxPeriod = new Long( config.getInitParameter("max-period") ); } public void destroy() { //add code to release any resource } } 

如果需要在会话失效时调用某些内容,则可以编写HttpSessionListener并在web.xml中进行配置。