8

我是 Spring Security 的新手并将其用于身份验证。我面临一个问题,即当浏览器关闭或发生任何异常故障时,会话会过期,但我无法捕获事件以执行清理代码。我对此进行了探索,并在 Spring 中找到了HttpSessionEventPublisher捕获方法,但是当我关闭浏览器时不会调用它。HttpSessionDestroyedEventsessionDestroyed()

要求提出相同的解决方案。

4

3 回答 3

1

也许SessionManagementFilter可以提供帮助?

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

于 2013-10-23T07:05:59.027 回答
0

您需要在web.xml!

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

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

于 2013-10-23T07:06:43.587 回答
-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>

希望这可以帮助。

于 2013-10-23T09:02:15.790 回答