# 13Interceptor与Filter的区别
Interceptor与Filter两者的功能很相似,都可以对url请求过滤,两者的区别是什么呢?
# 导航
# Interceptor
主要作用:对URL请求进行前置/后置过滤
通过实现Spring的HandlerInterceptor接口,其中preHandler()方法在调用Handler之前进行拦截,postHandler()方法在视图渲染之前调用,afterCompletion()方法在返回响应之前执行;
# filter
filter在请求进入Servlet容器执行service()方法之前就会经过Filter过滤,不像Interceptor一样依赖于spring MVC框架,只需要依赖于servlet.Filter启动是随着WEB应用的启动而启动,只需要初始化一次,以后都可以进行拦截。
Filter有如下几个种类:
用户授权Filter:检查用户请求,根据请求过滤用户非法请求;
日志Filter:记录某些特殊的用户请求
解码Filter: 对非标准编码的请求编码。
Filter可以拦截多个请求和响应,一个请求和响应也可以被多个Filter拦截
# Filter和Interceptor的区别
- Filter接口在javax.Servlet包下面。Interceptor定义在org.Springframework.web.Servlet中
- Filter基于Filter接口中的doFilter回调函数,是Servlet容器支持的;而Interceptor则基于Java本身的反射机制(AOP思想),是spring框架支持的
- Filter是基于Servlet容器的,没有Servlet容器就无法回调doFilter方法,而Interceptor与Servlet无关;
- Filter的过滤范围比Interceptor大,Filter除了过滤请求外通过通配符可以保护页面、图片、文件等,而Interceptor只能过滤请求,只对请求起作用,在请求之前开始,在请求完后结束(如被拦截,不执行请求)
- Filter的过滤一般在加载的时候在init()方法声明,而Interceptor可以通过在xml声明是guest请求还是user请求,来辨别是否过滤。
- Interceptor可以访问请求上下文、值栈里的对象,而Filter不能
- 在请求的生命周期中,拦截器可以被多次调用,而过滤器只能在容器初始化时被调用一次。
Filter | interceptor | |
---|---|---|
多个的执行顺序 | 根据filter mapping的配置先后顺序 | 安装配置的顺序,但是可以通过order控制顺序 |
规范 | 在Servlet规范中定义的,是Servlet容器支持的 | Spring容器内的,是Spring框架支持的 |
使用范围 | 只能用于web程序中 | 既可以用于web程序,也可以用于Application、Swing程序中 |
深度 | Filter只在Servlet中起作用 | 拦截器能够深入到方法前后、异常抛出前后等 |
# 导航,上一页,下一页
# 支持我-微信扫一扫-加入微信公众号
# 赞赏作者
# 种一棵树,最好的时间是十年前,其次是现在
立志用功,如种树然。方其根芽,犹未有干;及其有干,尚未有枝;枝而后叶,叶而后花、实。初种根时,只管栽培灌溉,勿作枝想,勿作实想。悬想何益?何不忘栽培之功,怕没有枝叶花实?