- 过滤器是请求进入容器后,但还没有进入 Servlet 之前进行预处理的。
- 拦截器是在请求进入控制器(Controller)之前进行预处理的。
- 过滤器依赖于 Servlet 容器,而拦截器依赖于 Spring 的 IoC 容器,因此可以通过注入的方式获取容器当中的对象。
过滤器(Filter)
- 过滤敏感词汇(sql、html注入)
- 设置字符编码
- URL 级别的权限访问控制
- 压缩响应信息
过滤器的创建和销毁都由 Web 服务器负责,Web 应用程序启动的时候,创建过滤器对象,为后续的请求过滤做好准备。
过滤器可以有多个,一个个过滤器组合起来就成了 FilterChain,也就是过滤器链。
在 Spring 中,过滤器都默认继承了 OncePerRequestFilter,顾名思义,OncePerRequestFilter 的作用就是确保一次请求只通过一次过滤器,而不重复执行。
拦截器(Interceptor)
- 登录验证,判断用户是否登录
- 权限验证,判断用户是否有权限访问资源,如校验token
- 日志记录,记录请求操作日志(用户ip,访问时间等),以便统计请求访问量
- 处理 cookie、本地化、国际化、主体等
- 性能监控,监控请求处理时长等。
AOP、拦截器和过滤器的区别
- 过滤器、拦截器拦截的是 URL。AOP 拦截的是类的元数据(包、类、方法名、参数等)。
- 过滤器并没有定义业务用于执行逻辑前、后等,仅仅是请求到达就执行。
- 拦截器有三个方法,相对于过滤器更加细致,有被拦截逻辑执行前、后等。AOP 针对具体的代码,能够实现更加复杂的业务逻辑。
- 三者功能类似,但各有优势,从过滤器、拦截器、切面,拦截规则越来越细致。
拦截器和过滤器的区别
- 拦截器是基于java的反射机制的,而过滤器是基于函数回调。
- 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
- Filter 不能够使用 Spring 容器资源,拦截器是一个Spring的组件,归Spring管理,配置在Spring文件中,因此能使用Spring里的任何资源。
- Filter 定义在 web.xml 中