1. 运行顺序不同(如图):
过滤器是在 Servlet 容器接收到请求之后,但在 Servlet 被调用之前运行的;而拦截器则是在 Servlet 被调用之后,但在响应被发送到客户 端之前运行的。
2. 配置方式不同:
因为过滤器是 Sevlet规范中一部分,任何java web工程都可以使用。因此在web.xml中配置 。 在Url-pattern中配置了/*后,可以对所有要访问的资源进行拦截。 而 拦截器是Spring MVC框架中的,只有使用Spring MVC框架的工程才能使用,在 Spring 的配置文件中 applicationContext下配置 或者使用注解进行配置。
3. Filter 依赖于 Servlet 容器,而 Interceptor 不依赖于 Servlet 容器。
4. Filter 在过滤是只能对 request 和 response 进行操作,而 interceptor 可以对 request、response、handler、modelAndView、exception 进行操作。
即: 拦截器只会拦截访问的控制器方法,如果访问的是Jsp/html/css/image/js是不会进行拦截的
这里主要强调一下应用场景的区分
拦截器:( 拦截器是AOP思想的具体应用 )
-
登录验证,判断用户是否登录。
-
权限验证,判断用户是否有权限访问资源,如校验token
-
日志记录,记录请求操作日志(用户ip,访问时间等),以便统计请求访问量。
-
处理 cookie、本地化、国际化、主题等。
-
性能监控,监控请求处理时长等。
-
通用行为:读取 cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取 Locale、Theme 信息等,只要是多个处理器都需要的即可使用拦截器实现)
过滤器:
- 过滤敏感词汇(防止sql注入)
- 设置字符编码
- URL级别的权限访问控制
- 压缩响应信息