我正在使用Spring安全性的grails web应用程序。即使会话处于活动状态,我也要求在固定的一组时间后强制会话到期。
我想我可以添加过滤器并检查每个请求的上次登录时间:
if (CURRENT_TIME - LAST_LOGIN > ABSOLUTE_SESSIO EXPIRATION) then FORCE LOGOUT
但问题是,在用户发出请求之前,会话仍然在服务器上处于活动状态。
即使用户正在使用系统,是否可以在N分钟后立即销毁会话? 我正在研究tomcat会话管理以及Spring安全性如何处理它,但没有找到任何有用的信息。
有人能指出我的一些例子吗?有没有人实现类似的东西?
答案 0 :(得分:4)
[编辑:在登录时间决定的特定时间杀死会话的想法是使用像Quartz这样的任务调度程序来安排作为参数传递会话的任务。然后,您可以安排它调用在特定时间点执行session.invalidate()
的作业。该任务将在登录时安排。]
我会这样做,但它不会在您想要的特定时间终止会话。它依赖于用户发出请求。这不是万无一失的,但你可以通过AJAX调用让应用程序每分钟左右轮询一次网站。
在用户会话上设置会话激活时间。然后为Web应用程序添加一个筛选器,以查看检查(激活期+允许的时间)超过当前时间的所有传入请求。如果没有,则调用session.invalidate();
即。登录
HttpSession session = request.getSession();
session.setAttribute( "activation-time", System.currentTimeMillis() );
然后向web.xml添加过滤器
<filter>
<filter-name>SessionFilter</filter-name>
<filter-class>com.something.SessionFilter</filter-class>
<init-param>
<param-name>max-period</param-name>
<param-value>60000</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SessionFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
过滤器将是......
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中进行配置。