一、何为Filter?
Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源。换句话说其主要用于前台向后台传递数据的过滤操作。
例如Jsp, Servlet,静态图片文件或静态
html文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级能。
二、在开发中的应用
首先看一下Filter在项目中的应用。
从图中可见它在web容器和Servlet、jsp之间,类似于一个过滤器将web传过来的垃圾信息全部过滤掉,然后再传给服务器,这样提高了一些效率。接下来从代码中看看它是怎么用的:
1、新建一个类,实现filter接口并实现doFilter()方法
packagecom.bjpowernode.drp.util.filter; importjava.io.IOException; importjavax.servlet.Filter; importjavax.servlet.FilterChain; importjavax.servlet.FilterConfig; importjavax.servlet.ServletException; importjavax.servlet.ServletRequest; importjavax.servlet.ServletResponse; /** * 采用Filter统一处理字符集 * @author yujie * */ public classCharsetEncodingFilter implements Filter { private Stringendcoding; publicvoid destroy() { } publicvoid doFilter(ServletRequest request, ServletResponse response, FilterChainchain) throws IOException, ServletException { //System.out.println("CharsetEncodingFilter--->>>begin"); //设置字符集 request.setCharacterEncoding(endcoding); //继续执行 chain.doFilter(request,response); //System.out.println("CharsetEncodingFilter--->>>end"); } publicvoid init(FilterConfig filterConfig) throws ServletException { this.endcoding= filterConfig.getInitParameter("encoding"); System.out.println("CharsetEncodingFilter.init()-->>endcoding=" + endcoding); } }
2、在web.xml中进行配置
<filter> <filter-name>CharsetEncodingFilter</filter-name> <filter-class>com.bjpowernode.drp.util.filter.CharsetEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>GBK</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharsetEncodingFilter</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping>
3、访问一个页面看看能否进行控制
三、深入Filter应用场景
1>通过控制对chain.doFilter的方法的调用,来决定是否需要访问目标资源。
比如,可以在用户权限验证等等。判断用户是否有访问某些资源的权限,有权限放行,没权限不执行chain.doFilter方法。
2>通过在调用chain.doFilter方法之前,做些处理来达到某些目的。
比如,解决中文乱码的问题等等。可以在doFilter方法前,执行设置请求编码与响应的编码。甚至可以对request接口进行封装装饰来处理get请求方式的中文乱码问题(重写相应的request.getParameter方法)。
3>通过在调用chain.doFilter方法之后,做些处理来达到某些目的。
比如对整个web网站进行压缩。在调用chain.doFilter方法之前用类A对response对象进行封装装饰,重写getOutputStream和重写getWriter方法。在类A内部中,将输出内容缓存进ByteArrayOutputStream流中,然后在chain.doFilter方法执行后,获取类A中ByteArrayOutputStream流缓存数据,用GZIPOutputStream流进行压缩下。
四、Filter生命周期
简单的一句话和Servlet一样Filter的创建和销毁也是由WEB服务器负责。简单过程如下:
init()->doFilter()->destroy()
注意:init方法与destroy方法只会执行一次。
五、总结
以上就是对Java中filter的简单理解,简单的一句话:filter就是一个过滤器。它的功能很强大,希望在今后的学习中渐渐深入。
Java之Filter