拦截器
作为springmvc提供的拦截器,有三个方法
-
preHandle() - 请求处理前被调用,通过返回值,判定请求是否向下传递。
-
postHandle() - 在请求处理后,数据模型产生后被调用。
-
afterCompletion() - 请求被返回或视图被返回后调用。
使用方式分为两种
-
实现HandlerInterceptor接口
-
继承HandlerInterceptorAdapter类
@Component public class CustomerWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter{ @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new SimpleHandlerInterceptor()).addPathPatterns("/**").excludePathPatterns("/path1") } }
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <mvc:exclude-mapping path="/admin/**"/> <ref bean="simpleHandlerInterceptor"/> </mvc:interceptor> </mvc:interceptors> </beans>
多个拦截器的调用路径,按照配置顺序
过滤器
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//请求传递前处理
chain.doFilter(request, response);
//请求处理后处理
}
1.CharacterEncodingFilter
因为web容器处理http请求,默认的编码格式是IOS8859-1。CharacterEncodingFilter的作用就是设置请求体编码格式,用于请求体参数的字节转字符,也就是对Post请求的参数进行解码。
需要注意的是get请求或者URL上的参数是容器进行解码的,需要设置容器的URL解码的字符集。
2.DelegatingFilterProxy(重要)
这个过滤器是用来代理自定义过滤器的,为什么需要代理?因为从过滤器的配置可以看出,过滤器不能通过spring依赖注入,通过DelegatingFilterProxy进行代理,实际就是通过ApplicationContext中获取filter对象
区别
- 拦截器可以更细粒度的处理请求拦截操作,而且能够排除不需要过滤的请求
- 关于请求链的传递
- 拦截器挺好boolean返回值判定是否继续传递
- filter需要主动调用传递