Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在会话超时侦听器中区分超时销毁的会话和手动销毁的会话_Java_Spring_Session - Fatal编程技术网

Java 在会话超时侦听器中区分超时销毁的会话和手动销毁的会话

Java 在会话超时侦听器中区分超时销毁的会话和手动销毁的会话,java,spring,session,Java,Spring,Session,我想实现一个在会话过期时调用的侦听器,我发现我可以创建一个实现接口HttpSessionListener的侦听器,并重写方法sessionDestroyed 但问题是,每次会话被销毁时(例如登录和注销)都会调用此方法,因此如何知道会话在会话过期后被销毁,或者是否存在HttpSessionListener以外的其他解决方案 PS:我在应用程序中使用的是Spring框架。也许你可以这样猜测: 可能的\u超时=CurrentTime-LastAccessedTime>=MaxInactiveInter

我想实现一个在会话过期时调用的侦听器,我发现我可以创建一个实现接口HttpSessionListener的侦听器,并重写方法sessionDestroyed

但问题是,每次会话被销毁时(例如登录和注销)都会调用此方法,因此如何知道会话在会话过期后被销毁,或者是否存在HttpSessionListener以外的其他解决方案


PS:我在应用程序中使用的是Spring框架。

也许你可以这样猜测:

可能的\u超时=CurrentTime-LastAccessedTime>=MaxInactiveInterval

// HttpServlet

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    System.out.println("Inside doGet(HttpServletRequest,HttpServletResponse)");

    HttpSession session = request.getSession(true);
    System.out.println("Session Id : " +session.getId() );
    System.out.println( "Is New Session : " + session.isNew() );

    int timeout = 10;
    session.setMaxInactiveInterval(timeout);

    System.out.println( "Max Inactive Interval : " + session.getMaxInactiveInterval() );

    System.out.println("Exiting doGet(HttpServletRequest,HttpServletResponse)");
    System.out.println();

}


// SessionEventListener

public void sessionCreated(HttpSessionEvent httpSessionEvent) {
    System.out.println("In sessionCreated(HttpSessionEvent) ");
    HttpSession httpSession = httpSessionEvent.getSession();
    System.out.println("Session Id :"+httpSession.getId() );
    System.out.println("Exiting sessionCreated(HttpSessionEvent) ");
    System.out.println();
}


public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {

    System.out.println("In sessionDestroyed(HttpSessionEvent) ");

    HttpSession httpSession = httpSessionEvent.getSession();
    long createdTime = httpSession.getCreationTime();
    long lastAccessedTime = httpSession.getLastAccessedTime();
    int maxInactiveTime = httpSession.getMaxInactiveInterval();
    long currentTime = System.currentTimeMillis();

    System.out.println("Session Id :"+httpSession.getId() );
    System.out.println("Created Time : " + createdTime);
    System.out.println("Last Accessed Time : " + lastAccessedTime);
    System.out.println("Current Time : " + currentTime);
    boolean possibleSessionTimeout = (currentTime-lastAccessedTime) >= (maxInactiveTime*1000);

    System.out.println("Possbile Timeout : " + possibleSessionTimeout);
    System.out.println("Exiting sessionDestroyed(HttpSessionEvent)");
    System.out.println();
}
输出如下:

Inside doGet(HttpServletRequest,HttpServletResponse)
In sessionCreated(HttpSessionEvent) 
Session Id :39F84968757E85ED89E7565639322F1F
Exiting sessionCreated(HttpSessionEvent) 

Session Id : 39F84968757E85ED89E7565639322F1F
Is New Session : true
Max Inactive Interval : 10
Exiting doGet(HttpServletRequest,HttpServletResponse)

In sessionDestroyed(HttpSessionEvent) 
Session Id :39F84968757E85ED89E7565639322F1F
Created Time : 1383729761582
Last Accessed Time : 1383729761587
Current Time : 1383729815839
Possbile Timeout : true
Exiting sessionDestroyed(HttpSessionEvent)

我观察到,不一定会立即检测到超时。似乎有一个线程定期检查会话超时。此外,每个请求都有一个检查。

注意:删除会话时会调用sessionDestroyed,这有时会晚于超时时间-查看此问题并回答,这不是您问题的答案,但这是你应该知道的,我认为你不能用会话侦听器来区分这两种场景。为什么需要这样做?我已经在weblogic服务器中测试过,当servlet中的会话超时时。但差值与实际差值相差约500ms。知道吗?@lahiruhunage by short你的意思是超时发生在配置的间隔之前吗?这没有任何意义。如果您的意思是更多,那么它可能只是意味着容器大约每半秒检查一次给定负载的会话超时。是的,当我检查会话超时时的时差时,它很短。我不知道确切的原因是什么。也许我必须得到上限值。但是我没有尝试,因为我使用了一个过滤器来跟踪会话超时。
Inside doGet(HttpServletRequest,HttpServletResponse)
In sessionCreated(HttpSessionEvent) 
Session Id :39F84968757E85ED89E7565639322F1F
Exiting sessionCreated(HttpSessionEvent) 

Session Id : 39F84968757E85ED89E7565639322F1F
Is New Session : true
Max Inactive Interval : 10
Exiting doGet(HttpServletRequest,HttpServletResponse)

In sessionDestroyed(HttpSessionEvent) 
Session Id :39F84968757E85ED89E7565639322F1F
Created Time : 1383729761582
Last Accessed Time : 1383729761587
Current Time : 1383729815839
Possbile Timeout : true
Exiting sessionDestroyed(HttpSessionEvent)