2013-10-23 92 views
7

我是Spring安全新手,並將其用於身份驗證。我面臨的一個問題是,當瀏覽器關閉或遇到任何異常故障時,會話過期,但我無法捕獲事件以執行清理代碼。 我對此進行了探索,並在Spring中發現HttpSessionEventPublisher以捕獲HttpSessionDestroyedEventsessionDestroyed()方法,但在關閉瀏覽器時未調用該方法。春季會話過期的監聽器

要求建議相同的解決方案。

+0

我添加了一個解決方案。希望這有助於並讓我知道。 –

回答

1

也許SessionManagementFilter可以提供幫助嗎?

或者您可以配置Spring Security在發生超時時自動重定向用戶:Detecting timeouts部分。

+0

SessionManagementFilter將幫助我跟蹤和驗證每個請求,但在關閉瀏覽器時,服務器上不會發送此類請求。 – Prashant

0

您需要註冊聽衆web.xml

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

但是,當然,它只是關閉會話(因爲超時或一些explicite程序會話破壞)檢測,但它沒有檢測到有人接近他的瀏覽器。這是因爲關於關閉的brwoser沒有http通知。

-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); 
     } 
    }); 
}); 

春天控制器

@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> 

希望這有助於。

+0

我還沒有嘗試過,但如果javascript被禁用或系統崩潰會發生什麼。 – Prashant

+0

JavaScript必須啓用。今天,沒有JavaScript的網絡應用程序。 –

+0

@HyperLink如果我們的系統只使用直接客戶端通信的直接Spring MVC,那麼也可以只使用JQuery而不使用Ajax?謝謝。 –