我是Spring安全新手,並將其用於身份驗證。我面臨的一個問題是,當瀏覽器關閉或遇到任何異常故障時,會話過期,但我無法捕獲事件以執行清理代碼。 我對此進行了探索,並在Spring中發現HttpSessionEventPublisher
以捕獲HttpSessionDestroyedEvent
sessionDestroyed()
方法,但在關閉瀏覽器時未調用該方法。春季會話過期的監聽器
要求建議相同的解決方案。
我是Spring安全新手,並將其用於身份驗證。我面臨的一個問題是,當瀏覽器關閉或遇到任何異常故障時,會話過期,但我無法捕獲事件以執行清理代碼。 我對此進行了探索,並在Spring中發現HttpSessionEventPublisher
以捕獲HttpSessionDestroyedEvent
sessionDestroyed()
方法,但在關閉瀏覽器時未調用該方法。春季會話過期的監聽器
要求建議相同的解決方案。
也許SessionManagementFilter可以提供幫助嗎?
或者您可以配置Spring Security在發生超時時自動重定向用戶:Detecting timeouts部分。
SessionManagementFilter將幫助我跟蹤和驗證每個請求,但在關閉瀏覽器時,服務器上不會發送此類請求。 – Prashant
您需要註冊聽衆web.xml
!
<listener>
<listener-class>
org.springframework.security.web.session.HttpSessionEventPublisher
</listener-class>
</listener>
但是,當然,它只是關閉會話(因爲超時或一些explicite程序會話破壞)檢測,但它沒有檢測到有人接近他的瀏覽器。這是因爲關於關閉的brwoser沒有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);
}
});
});
在春天控制器,
@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.xm升添加這個,如果你使用HttpSessionEventPublisher趕上會話破壞事件,
<listener>
<listener-class>
org.springframework.security.web.session.HttpSessionEventPublisher
</listener-class>
</listener>
希望這有助於。
我還沒有嘗試過,但如果javascript被禁用或系統崩潰會發生什麼。 – Prashant
JavaScript必須啓用。今天,沒有JavaScript的網絡應用程序。 –
@HyperLink如果我們的系統只使用直接客戶端通信的直接Spring MVC,那麼也可以只使用JQuery而不使用Ajax?謝謝。 –
我添加了一個解決方案。希望這有助於並讓我知道。 –