过滤器(Filter)
过滤器就如上面的水质过滤器一样,把管道中的水进行一遍过滤再使用。过滤器基于filter接口中的doFilter回调函数,主要的用途是设置字符集、控制权限、控制转向、做一些业务逻辑判断等。我们通常使用过滤器的做法如下:
encodingorg.springframework.web.filter.CharacterEncodingFilterencodingUTF-8forceEncodingtrue
可以了解到它的基本工作原理就是,在web.xml文件配置好要拦截的客户端请求,它都会帮你拦截到请求,这个时候就可以对请求或响应(Request、Response)统一设置编码,简化操作。
可以说是一种加强版的 Servlet。所以我们大概可以知道它的一些优势:
- 在请求到达Servlet进行拦截,对其数据进行验证,同时也可以修改请求头信息和数据信息,过滤那些不用的数据信息。
- 在响应回到客户端之前,也可以对数据进行相应的修改操作。
拦截器(Interceptor)
拦截器也如上图一样,有邮件进来的时候,我判断它如果是垃圾邮件的话,那我拒收。要实现拦截器也很简单,通过实现接口HandlerInterceptor(spring提供的拦截器接口)就行了。
在实现上是基于Java的反射机制,属于面向切面编程(AOP)的一种运用,就是在你的service或者一个方法前调用一个方法,或者在方法后调用一个方法,例如我们通常可以通过面向切面来实现日记记录、参数校验等功能。简单示例如下:
public class BaseInterceptor implements HandlerInterceptor{ /** * 在DispatcherServlet之前执行 * */ public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception { System.out.println("aaaa"); return true; } /** * 在controller执行之后的DispatcherServlet之后执行 * */ public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { System.out.println("bbbb"); } /** * 在页面渲染完成返回给客户端之前执行 * */ public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { System.out.println("cccc"); } }
区别
1、Filter基于回调函数,Interceptor则基于Java反射机制;
2、Filter是依赖于servlet容器的,没有servlet容器就没办法回调doFilter方法,所以说你就别在Swing程序中使用Filter了,没用的,而Interceptor与servlet无关,只需要实现框架接口就行。
3、从过滤范围来说,Filter更广,Interceptor只能过滤action,而过滤器则可以对几乎所有的请求起作用。
4、Interceptor可以访问action上下文、值栈里的对象,而过滤器不能访问。
5、拦截器可以被多次调用,而过滤器只能在容器初始化时被调用一次。