版本說明: spring-boot-starter-parent 2.1.11.RELEASE
1:定義兩個filter過濾器類
public class MyFilter1 implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // todo XXX chain.doFilter(request, response); } @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void destroy() { } }
再定義第二個過濾器 MyFilter2,代碼同上。 注意:不添加任何注解!
2:filter注冊為一個bean
在SpringBoot啟動類里添加@Configuration 注解,這可以讓SpringBoot認得@Bean注解。然后啟動類里添加如下代碼:
@Bean MyFilter1 getApiAuthenticationFilter1(){ return new MyFilter1(); } @Bean("myFilter1RegistrationBeanName") public FilterRegistrationBean<MyFilter1> registerFilter1(MyFilter1 myFilter1) { FilterRegistrationBean<MyFilter1> registrationBean = new FilterRegistrationBean(); registrationBean.setFilter(myFilter1); registrationBean.addUrlPatterns("/account/*"); //url攔截 registrationBean.setOrder(1); registrationBean.setAsyncSupported(true); return registrationBean; } @Bean //這里特意注冊為一個bean,是可以讓spring容器在filter類里注入@Autowited字段 MyFilter2 getInnerApiAuthFilter1(){ return new MyFilter2(); } @Bean("myFilter2RegistrationBeanName") //注意,如果是多個filter,一定要給bean命名不通的名字 public FilterRegistrationBean<MyFilter2> registerFilter2(MyFilter2 myFilter2) { //傳參方式而非new對象的方式,可以從spring容器里得到bean對象 FilterRegistrationBean<MyFilter2> registrationBean = new FilterRegistrationBean(); registrationBean.setFilter(myFilter2); registrationBean.addUrlPatterns("/api/*"); registrationBean.setOrder(2); registrationBean.setAsyncSupported(true); return registrationBean; }
3:修改log日志打印級別為debug
在application.properties配置文件中,添加日志級別配置:logging.level.org.springframework.boot=debug
4:日志打印驗證url攔截
2020-01-02 19:35:19.125 DEBUG 61918 [main] o.s.b.w.s.ServletContextInitializerBeans : Mapping filters: springSecurityFilterChain urls=[/*],
filterRegistrationBean urls=[/account/*], filterRegistrationBean urls=[/api/*], characterEncodingFilter urls=[/*] 2020-01-02 19:35:19.125 DEBUG 61918 [main] o.s.b.w.s.ServletContextInitializerBeans : Mapping servlets: dispatcherServlet urls=[/],
messageDispatcherServlet urls=[/services/*]
從以上日志打印可以看出url攔截已經生效了。
以上代碼親測驗證有效。
至於controller的代碼攔截試驗,此處不方便貼出,請大家各自驗證。