2013-06-05 102 views
3

我正在使用spring-security 3.x.我有一個要求,在用戶註銷之前,我想執行一些邏輯。我寫了一個濾波器擴展彈簧,提供如下LogoutFilter在用戶使用彈簧安全性註銷之前調用某些邏輯?

public class MyFilter extends LogoutFilter{ 

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) 
      throws IOException, ServletException { 
     //Perform some logic 

      super.doFilter(req,res,chain); 

    } 

} 

如何在用戶點擊註銷按鈕時調用我自己的過濾器?

+0

創建自己的過濾器沒有意義。當你註銷時,它應該被通知給Spring安全篩選器鏈。如果你需要一個自定義註銷過濾器,那麼爲什麼你不使用' '?另外,如果你在註銷之前執行一些代碼邏輯,那麼Spring提供了一個合適的處理程序。你可以使用它。 – Lion

+0

我很困惑的問題 - 爲什麼不只是有你的註銷鏈接/按鈕/無論首先按你的要求做,然後重定向到或調用實際的註銷過程?正如獅子指出的那樣,這裏不需要重新發明輪子。 – cabbagery

回答

3

你不需要自定義LogoutFilter,你需要插件以下爲標準過濾器之一:

請注意,LogoutHandler s在LogoutSuccessHandler之前被調用,但後者被允許拋出異常,其中a前者是不應該的。

還要注意的是,如果你使用自定義LogoutHandler情況下,它們需要被賦予/在LogoutFilter注射ConcurrentSessionFilter(如果使用)。

如果您使用的XML配置安全命名空間(即xmlns="http://www.springframework.org/schema/security"),則很容易通過

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

不知道如何使用命名空間插件定製LogoutHandler s到添加自定義LogoutSuccessHandler

否則,它會是這個樣子:

<bean id="logoutFilter" class="org.springframework.security.web.authentication.logout.LogoutFilter"> 
    <constructor-arg ref="logoutSuccessHandler"/> 
    <constructor-arg ref="logoutHandlers"/> 
    ... 
</bean> 

<bean id="logoutSuccessHandler" class="your.custom.LogoutSuccessHandler"/> 

<bean id="logoutHandlers" class="java.util.Arrays" factory-method="asList"> 
    <constructor-arg> 
     <array> 
      <bean class="your.custom.LogoutHandler"/> 
      ... 
     </array> 
    </constructor-arg> 
</bean>