servlet的过滤器(filter)
@WebFilter(urlPatterns = "/*")
public class EncodingFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("EncodingFilter:doFilter");
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
}
过滤器使用@WebFilter指明过滤的路径,FilterChain 用于是否继续执行链式过滤,由于可以存在多个过滤器,那么他们的执行顺序在xml中是从上到下执行
springmvc的拦截器(interceptor)
Interceptor只拦截Controller方法,一个Interceptor必须实现HandlerInterceptor接口,可以选择实现preHandle()、postHandle()和afterCompletion()方法。preHandle()是Controller方法调用前执行,postHandle()是Controller方法正常返回后执行,而afterCompletion()无论Controller方法是否抛异常都会执行,参数ex就是Controller方法抛出的异常(未抛出异常是null)。
把拦截器注册到WebMvcConfigurer
@Configuration
@EnableWebMvc
public class InterceptorConfig implements WebMvcConfigurer {
@Bean
public MyInterceptor myInterceptor() {
return new MyInterceptor();
}
/**
* 在这里添加自己定义的拦截器
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor())
// 只拦截test路径
.addPathPatterns("/user/**")
// 不拦截pass路径
// .excludePathPatterns("/pass/**");
.excludePathPatterns("/user/saveUser")
.excludePathPatterns("/user/login");
}
/**
* 解决拦截器拦截swagger请求的问题
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
}
}