2016-12-27 103 views
0

在一個Spring MVC應用程序中,我試圖實現一個自定義註銷成功處理程序。這個處理程序應該訪問一個會話屬性並根據它的值進行一些查詢和記錄。如何訪問LogoutSuccessHandler中的會話屬性?

執行的相關部分:

  1. 安全配置:

<http ...> <logout success-handler-ref="logoutSuccessHandler"/> </http>

<beans:bean id="logoutSuccessHandler" class="some.package.LogoutSuccessHandler"> 
    <beans:constructor-arg value="/login" /> 
</beans:bean> 
  • 處理機本身:
  • public class LogoutSuccessHandler extends SimpleUrlLogoutSuccessHandler { 
    
        @Autowired 
        private SomeService someService; 
    
        public LogoutSuccessHandler(String defaultTargetUrl) { 
         this.setDefaultTargetUrl(defaultTargetUrl); 
        } 
    
        @Override 
        public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) 
          throws IOException, ServletException { 
         String sessionAttribute = request.getSession().getAttribute("someAttribute").toString(); 
         someService.doSomething(sessionAttribute); 
         super.onLogoutSuccess(request, response, authentication); 
        } 
    }

    我在用戶登錄時向會話添加了一些屬性。它們在不同的控制器請求期間可見。問題是,當我嘗試在註銷期間訪問會話屬性時,它們都消失了。這是否意味着到那個時候註銷已經發生並且會話信息被清除了?我可以看到SessionId與之前一樣。

    所以,我的問題是:會話屬性會發生什麼,有沒有辦法在LogoutSuccessHandler中訪問它們?

    +0

    填充你需要用它註銷後的屬性要求。另一個選項是在使會話無效之前添加一個鉤子。 –

    +0

    您能否暗示這些解決方案如何實施? –

    回答

    1
    <logout success-handler-ref="logoutSuccessHandler" invalidate-session="false"/> 
    

    invalidate-session的默認值是true,所以你會在你的處理器獲得一個新的會話。

    當你將該值設置爲false,那麼你可以得到舊的會話,並且不要忘記你完成你的業務後無效會話。