本篇基于springboot 2.5.1开发,工程结构如下:
- 创建过滤器MyFilter,MyFilter2
package com.example.demo.filter;
import javax.servlet.*;
import java.io.IOException;
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("Filter:init");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("Filter:do start");
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("Filter:do end");
}
@Override
public void destroy() {
System.out.println("Filter:destroy");
}
}
package com.example.demo.filter;
import javax.servlet.*;
import java.io.IOException;
public class MyFilter2 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("Filter2:init");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("Filter2:do start");
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("Filter2:do end");
}
@Override
public void destroy() {
System.out.println("Filter2:destroy");
}
}
2.创建拦截器MyInterceptor,MyInterceptor2
package com.example.demo.interceptor;
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("Interceptor:preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
System.out.println("Interceptor:postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable Exception ex) throws Exception {
System.out.println("Interceptor:afterCompletion");
}
}
package com.example.demo.interceptor;
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor2 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("Interceptor2:preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
System.out.println("Interceptor2:postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable Exception ex) throws Exception {
System.out.println("Interceptor2:afterCompletion");
}
}
- 创建配置类,配置过滤器、拦截器
package com.example.demo.config;
import com.example.demo.filter.MyFilter;
import com.example.demo.filter.MyFilter2;
import com.example.demo.interceptor.MyInterceptor;
import com.example.demo.interceptor.MyInterceptor2;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.Collections;
@Configuration
public class MyConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").order(2);
registry.addInterceptor(new MyInterceptor2()).addPathPatterns("/**").order(1);
}
@Bean
public FilterRegistrationBean addFilter() {
FilterRegistrationBean<MyFilter> bean = new FilterRegistrationBean<>();
bean.setFilter(new MyFilter());
bean.setUrlPatterns(Collections.singletonList("/*"));
bean.setOrder(2);
return bean;
}
@Bean
public FilterRegistrationBean addFilter2() {
FilterRegistrationBean<MyFilter2> bean = new FilterRegistrationBean<>();
bean.setFilter(new MyFilter2());
bean.setUrlPatterns(Collections.singletonList("/*"));
bean.setOrder(1);
return bean;
}
}
- 编写一个Controller测试
package com.example.demo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class MyController {
@GetMapping("sayHello")
public String sayHello() {
System.out.println("Controller:sayHello");
return "Hello world!";
}
}
- 启动项目,验证结果
简单分析:按Filter配置顺序,先执行了Filter2,再到Filter,然后按拦截器配置顺序执行Interceptor2的前置处理,再到Interceptor的前置处理,接着执行Controller方法,然后执行Interceptor的postHandle,Interceptor2的postHandle等等;在Controller之前越先执行的Filter,Interceptor,在Controller之后顺序就会越靠后执行。