Filter --Servlet技术支持 -- WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。
无论是Filter,MethodInterceptor,ACL都要用到AOP,实际上都是拦截器的概念,其中要用到AbstractSecurityInterceptor总拦截器,AfterInvocationManager后置拦截,authenticationManager验证管理器,可能还要用上RunAsManager。
1--Filter的创建和销毁由WEB服务器负责。web应用程序启动时,web服务器将创建Filter的实例对象,并调用其init方法,完成对象的初始化。filter对象只会创建一次,init方法(完成对象的初始化功能)也只会执行一次。
2--用destroy方法销毁Filter,在Filter的生命周期中仅执行一次。
3-- init(FilterConfig filterConfig)
FilterConfig接口:通过filterConfig对象的方法,就可获得:
String getFilterName():得到filter的名称。
String getInitParameter(String name): 返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.
Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。
public ServletContext getServletContext():返回Servlet上下文对象的引用。
4--FilterChain 过滤器链 ,过滤器链中的所有过滤器的doFilter方法都执行完成才能通过。
当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。
1.ChannelProcessingFilter
2.SecurityContextPersistenceFilter
3.ConcurrentSessionFilter
4.HeaderWriterFilter
5.CsrfFilter
6.LogoutFilter
7.X509AuthenticationFilter
8.AbstractPreAuthenticatedProcessingFilter(Subclasses)
9.CasAuthenticationFilter
10.UsernamePasswordAuthenticationFilter
11.BasicAuthenticationFilter
12.SecurityContextHolderAwareRequestFilter
13.JaasApiIntegrationFilter
14.RememberMeAuthenticationFilter
15.AnonymousAuthenticationFilter
16.SessionManagementFilter
17.ExceptionTranslationFilter
.18.FilterSecurityInterceptor
19.SwitchUserFilter
一、配置自定义 Filter 在 Spring Security 过滤器链中的位置
WebSecurityConfigurerAdapter --> configure(HttpSecurity http) -->
HttpSecurity
有三个常用方法来配置:
- addFilterBefore(Filter filter, Class<? extends Filter> beforeFilter)
在 beforeFilter 之前添加 filter, - addFilterAfter(Filter filter, Class<? extends Filter> afterFilter)
在 afterFilter 之后添加 filter - addFilterAt(Filter filter, Class<? extends Filter> atFilter)
在 atFilter 相同位置添加 filter, 此 filter 不覆盖 filter
作者:Anoyi
链接:https://www.jianshu.com/p/deb512b41f99
// 在 UsernamePasswordAuthenticationFilter 前添加 BeforeLoginFilter
http.addFilterBefore(new BeforeLoginFilter(), UsernamePasswordAuthenticationFilter.class);
// 在 CsrfFilter 后添加 AfterCsrfFilter
http.addFilterAfter(new AfterCsrfFilter(), CsrfFilter.class);
1.通过 @WebFilter 注解来配置
2.通过 @Bean 注解来配置
@Bean
public FilterRegistrationBean testFilterRegistration() {
FilterRegistrationBean registration = new FilterRegistrat