我正在使用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 :(得分:3)
您不需要自定义LogoutFilter
,您需要将以下其中一项插入标准过滤器:
LogoutHandler
s(javadoc here)LogoutSuccessHandler
(javadoc here)请注意LogoutHandler
在LogoutSuccessHandler
之前被调用,但后者被允许抛出异常,而前者不应该。{/ p>
另请注意,如果您使用自定义LogoutHandler
,则需要在LogoutFilter
和 ConcurrentSessionFilter
(如果使用)中注明/注入这些内容
如果您在XML配置中使用安全命名空间(即xmlns="http://www.springframework.org/schema/security"
),则可以通过
LogoutSuccessHandler
<http>
...
<logout success-handler-ref="yourBeanId"/>
</http>
不确定如何使用命名空间插入自定义LogoutHandler
。
否则,它看起来像这样:
<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>