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

Java N分钟后绝对会话过期,即使用户正在使用系统,java,tomcat,grails,spring-security,session-timeout,Java,Tomcat,Grails,Spring Security,Session Timeout,我正在使用spring security开发一个grails web应用程序。即使会话处于活动状态,我也需要在一组固定的时间后强制会话过期 我想我可以添加过滤器并检查每个请求的上次登录时间: if (CURRENT_TIME - LAST_LOGIN > ABSOLUTE_SESSIO EXPIRATION) then FORCE LOGOUT 但问题是,在用户发出请求之前,会话在服务器上仍然处于活动状态 即使用户正在使用系统,这是否可能在N分钟后立即销毁会话? 我在研究tomcat会话

我正在使用spring security开发一个grails web应用程序。即使会话处于活动状态,我也需要在一组固定的时间后强制会话过期

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

if (CURRENT_TIME - LAST_LOGIN > ABSOLUTE_SESSIO EXPIRATION) then FORCE LOGOUT
但问题是,在用户发出请求之前,会话在服务器上仍然处于活动状态

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


有人能给我举个例子吗?有人实现过类似的功能吗?

[编辑:在由登录时间决定的特定时间终止会话的一个想法是使用任务计划程序来计划作为参数传递给会话的任务。然后,您可以将其计划为调用执行
会话的作业。invalidate()
在特定时间点。任务将在登录时安排。]

我会这样做,但它不会在您想要的特定时间终止会话。它依赖于用户发出请求。它不是傻瓜式的,但是您可以让应用程序每隔一分钟左右通过AJAX调用轮询站点

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

i、 e.登录时

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>

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

请参阅此讨论。一旦掌握了所有活动会话,您可以编写一个计划程序来枚举会话,并将过期的会话超时。可能是简单(或)直接的任务。另一方面,你为什么在意?用户不使用的会话只是内存或磁盘上一些未使用的字节。等待下一个请求或等待默认超时来删除它们不会造成太大伤害。你必须问问自己,“这个要求有意义吗?”如果没有,那么我就不会太担心在特定时间终止会话。可能是编写需求的人不了解会话如何工作的细节。总而言之,Spring 3.0+提供了开箱即用的调度,对于大多数用例来说应该足够了,您不必使用Quartz。更多
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
    }
}