一、什么是Filter?
Filter是Servlet2.3新增加的功能,它不是Servlet,它不能处理用户请求,也不能处理用户响应。主要对HttpServletRequest进行预处理,也对HttpServletResponse进行后处理,是典型的处理链。
二、Filter出现前后原理图对比
1.JSP请求(无filter)
2.JSP请求(有filter):
三、Servlet过滤器接口
所有的Servlet过滤器接口必须实现java.servlet.Filter接口,这个接口含有三个过滤器类必须实现的方法:
1.init(FilterConfig)
Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后,将调用这个方法。这个方法可以读取web.xml中的Servlet过滤器的配置初始化参数
2.doFilter(ServletRequest,ServletResponse,FilterChain)
这个方法完成实际的过滤操作,当客户请求访问于过滤器关联的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain参数用于访问后续过滤器
3.destroy()
Servlet容器在销毁过滤器实例前调用该方法,这个方法中可以释放Servlet过滤器占用的资源
四、Servlet过滤器创建步骤
1.实现java.servlet.Filter接口
2.实现init方法,读取过滤器的初始化参数
3.实现doFilter方法,完成对请求或过滤的响应
4.调用FilterChain接口对象的doFilter方法,向后续的过滤器传递请求和响应
5.销毁过滤器
filterdemo
过滤器类:CharsetEncodingFilter
<span style="font-family:Microsoft YaHei;font-size:14px;">package com.bjpowernode.drp.util.filter; import java.io.IOException; import javax.security.auth.message.callback.PrivateKeyCallback.Request; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; /** * @ClassName:CharsetEncodingFilter * @Description:采用filter统一处理字符集 * @author wm * @date 2015年12月11日上午10:53:38 */ public class CharsetEncodingFilter implements Filter { @Override public void destroy() { // TODO Auto-generated method stub } /** * 过滤 */ @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.print("CharsetEncodingFilter-->>begin"); //设置字符集 request.setCharacterEncoding("GB18030"); //将请求转发给过滤器链上下一个对象,下一个过滤器 chain.doFilter(request, response); System.out.println("CharsetEncodingFilter-->>end"); } /** * 初始化 */ @Override public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub } } </span>
<span style="font-family:Microsoft YaHei;font-size:14px;"><web-app> <filter> <filter-name>CharsetEncodingFilter</filter-name> <filter-class>com.bjpowernode.drp.util.filter.CharsetEncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>CharsetEncodingFilter</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping> </web-app></span>
五、传统filter和基于Aop思想的interceptor对比
1.filter基于回调函数doFilter(),而interceptor则基于java本身的反射机制,这是两者最本质的区别。
2.filter依赖Servlet容器,而interceptor与该容器无关
3.filter过滤范围比interceptor大,filter可以过滤请求,通过通配符可以保护页面、图片、文件等等,而interceptor只能过滤请求
4.filter的过滤例外在init方法声明,而Interceptor可以通过xml声明是guest请求还是user请求来辨别是否过滤。
六、总结
Aop即为Aspect Oriented Programming的缩写,面向切面的编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。Aop可以使公共服务和业务逻辑的分离,从而使两者间的解耦度降低,提高代码的复用性。无论是filter还是interceptor,都是对aop思想很好的体现。