序
本文讲一个spring security自定义filter非常容易出现的一个问题,那就是filter被执行两遍。
复现
1 | 复制代码@EnableWebSecurity |
其中DemoFilter如下
1 | 复制代码public class DemoFilter extends GenericFilterBean { |
原因
在spring容器托管的GenericFilterBean的bean,都会自动加入到servlet的filter chain,而上面的定义,还额外把filter加入到了spring security的
AnonymousAuthenticationFilter之前。而spring security也是一系列的filter,在mvc的filter之前执行。因此在鉴权通过的情况下,就会先后各执行一次。
解决方案
方案1
不把filter托管给spring,直接new,比如
1 | 复制代码@EnableWebSecurity |
方案2
有时候filter需要访问spring容器的资源,托管给容器可能好些,那么这个时候,就可以像FilterSecurityInterceptor做个标记FILTER_APPLIED
1 | 复制代码public class DemoFilter extends GenericFilterBean { |
doc
本文转载自: 掘金