1、filter和interceptor的方式的不同. Filter是利用了方法的调用(入栈出栈)完成整个流程, 而Interceptor是利用了for循环完成了整个流程.
2、Filter的实现比较占用栈空间, 在Filter多的情况下可能会有栈溢出的风险存在.
3、Interceptor的实现逻辑更加的清晰简单
4、Filter组件更加的通用, 只要支持java servlet的容器都可以使用, 而Interceptor必须依赖于Spring
5、Filter的优先级是高于Interceptor, 即请求是先到Filter再到Interceptor的, 因为Interceptor的实现主体还是一个servlet
spring boot 添加拦截器有两种方式:
添加 非常简单 共两步
第一步: 编写拦截器:(实现 HandlerInterceptor 接口)
第二步: 添加拦截器 :(创建一个类,继承 WebMvcConfigurerAdapter 并通过 复写 addInterceptors 方法)
第一步:
编写拦截器:(com.zll.demo.intercepter.MyInterceptor )
/**
* 方法流程 例如 访问 http//127.0.0.1:8080/hello
* 执行顺序
* 1、preHandle
* 2、hellorController
* 2、postHandle
* 3、视图渲染
* 4、afterCompletion
*/
public class MyInterceptor implements HandlerInterceptor {
/**
* 在 @controller 方法之前执行
*/
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
System.out.println("preHandle");
return true;//true 继续执行,false 停止执行。
}
/**
* 在 @Controller方法执行之后,在视图渲染之前执行
*/
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
}
/**
* 在 @controller 视图渲染之后执行
*/
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("afterCompletion");
}
}
第二步:
添加拦截器:
在创建一个类,继承 WebMvcConfigurerAdapter 重写 addInterceptors方法 然后添加 @Configuration
@Configuration
public class WebConfig extends WebMvcConfigurationSupport{
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor ()) //默认拦截所有请求
// .addPathPatterns("/first/**")// addPathPatterns 表示拦截first 路径下的请求
//.excludePathPatterns("/second/**"); // excludePathPatterns 表示不拦截second 下的请求,一般选一种就行
}
@Override
@Bean
public RequestMappingHandlerMapping requestMappingHandlerMapping() {
RequestMappingHandlerMapping handlerMapping = new RequestMappingHandlerMapping();
handlerMapping.setOrder(0);
handlerMapping.setInterceptors(getInterceptors());
return handlerMapping;
}
}
多个拦截器的执行顺序是:
interceptor 1111 preHandle
interceptor 2222 preHandle
1 == 5
interceptor 2222 postHandle
interceptor 1111 postHandle
interceptor 2222 afterCompletion
interceptor 1111 afterCompletion