Spring中会话过期的监听器

时间:2013-10-23 06:37:15

标签: java spring session spring-security

我是Spring的新手,并将其用于身份验证。我面临的一个问题是,当浏览器关闭或遇到任何异常故障时会话到期但我无法捕获事件以便执行清理代码。 我探索了它并在Spring中找到了HttpSessionEventPublisher来捕获HttpSessionDestroyedEvent方法中的sessionDestroyed(),但是当我关闭浏览器时没有调用它。

请求建议相同的解决方案。

3 个答案:

答案 0 :(得分:1)

也许SessionManagementFilter会有所帮助?

或者您可以将Spring Security配置为在发生超时时自动重定向用户:Detecting timeouts部分。

答案 1 :(得分:0)

您需要在web.xml

中注册听众
 <listener>
      <listener-class>
           org.springframework.security.web.session.HttpSessionEventPublisher
      </listener-class>
</listener>

但当然它只检测会话已关闭(因为超时或某些明确的程序会话销毁),但它没有检测到某人关闭了他的浏览器。这是因为没有关于关闭的brwoser的http通知。

答案 2 :(得分:-3)

您可以使用 JQuery 来解决浏览器关闭问题,

JQuery 将是,

$(window).on('beforeunload', function(){
    return 'Are you sure you want to leave?';
});

$(window).on('unload', function(){
    //alert("unload");
    $.ajax({
        type: "POST",
        url: "Logout.html",
        //data: "message=" + message,
        dataType: "html",

        success: function(response) {

        },
        error: function(e) {
            //alert('Error: ' + e);
        }
    });
});

Spring控制器中,

@RequestMapping(value="Logout.html",method=RequestMethod.POST)
public  @ResponseBody String logout(HttpSession session){

    System.out.println("Request Logout");

    // Do you work before invalidate the session 

    session.invalidate();

}

web.xml 中添加此项,如果您使用HttpSessionEventPublisher捕获会话销毁事件,

 <listener>
      <listener-class>
       org.springframework.security.web.session.HttpSessionEventPublisher
      </listener-class>
</listener>

希望这有帮助。