我是 Spring Security 的新手并将其用于身份验证。我面临一个问题,即当浏览器关闭或发生任何异常故障时,会话会过期,但我无法捕获事件以执行清理代码。我对此进行了探索,并在 Spring 中找到了HttpSessionEventPublisher
捕获方法,但是当我关闭浏览器时不会调用它。HttpSessionDestroyedEvent
sessionDestroyed()
要求提出相同的解决方案。
我是 Spring Security 的新手并将其用于身份验证。我面临一个问题,即当浏览器关闭或发生任何异常故障时,会话会过期,但我无法捕获事件以执行清理代码。我对此进行了探索,并在 Spring 中找到了HttpSessionEventPublisher
捕获方法,但是当我关闭浏览器时不会调用它。HttpSessionDestroyedEvent
sessionDestroyed()
要求提出相同的解决方案。
也许SessionManagementFilter可以提供帮助?
或者您可以将 Spring Security 配置为在发生超时时自动重定向用户:检测超时部分。
您需要在web.xml
!
<listener>
<listener-class>
org.springframework.security.web.session.HttpSessionEventPublisher
</listener-class>
</listener>
但当然它只检测到会话已关闭(由于超时或某些明确的编程会话破坏),但它没有检测到有人关闭了他的浏览器。这是因为没有关于关闭浏览器的 http 通知。
您可以使用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>
希望这可以帮助。