不同点
项 | 过滤器 | 拦截器 |
使用场景 | 对请求/响应进行修改、判断等。一般用于过滤参数、登录权限验证、资源访问权限控制、敏感词汇过滤、字符编码转换。 | 在service或者一个方法前/后调用一个方法,或者在方法后调用一个方法。 |
能力 | 可以拿到原始的http请求与响应,拿不到请求的控制器和请求控制器中的方法的信息。 可以修改请求、响应、参数:比如:修改字符编码、删除低俗文字、删除危险字符、修改参数 | 可以拿到你请求的控制器和方法,却拿不到请求与响应。 |
顺序 | 可指定顺序。 | 可指定顺序。 |
实现方式 | 回调函数 | AOP |
使用范围 | 只能用于Web | 可用于Web、Application、Swing |
作用范围 | 所有请求。 | 只能是controller请求。静态资源无法控制。 |
使用位置 | controller前后、dispaterServlet前后 | controller前后 |
规范定义 | Servlet 规范定义,Servlet 容器支持。 Filter 接口定义在 javax.servlet 包 | Spring容器内,Spring框架支持。 HandlerInterceptor 接口 定义在org.springframework.web.servlet 包 |
灵活性/粒度 | 灵活性差(粒度大)。 不能够使用 Spring 容器资源 | 灵活性好(粒度小)。 能使用Spring里的任何资源、对象,例如 Service对象、数据源、事务管理等,通过IoC注入到拦截器即可。 |
打断链路 | 打断方法:处理请求和响应对象来引发中断,需要额外的动作,比如将用户重定向到错误页面。 | 打断方法:preHandle方法内返回 false |
执行次数 | 一个controller周期只调用一次:一个过滤器实例只能在容器初始化时调用一次。 | 一个controller周期可调用多次 |