我正在使用 spring-security 3.x。我有一个要求,就在用户注销之前,我想执行一些逻辑。我写了一个过滤器扩展 spring provided 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);
}
}
当用户点击注销按钮时,如何调用我自己的过滤器?
您不需要自定义 LogoutFilter
,您需要将以下其中一项插入标准过滤器:
请注意,LogoutHandler
在 LogoutSuccessHandler
之前被调用,但后者允许抛出异常,而前者则不允许。
另请注意,如果您使用自定义 LogoutHandler
,则需要将这些提供给/注入(inject)到 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>