Filter 过滤器

一、Filter的介绍

 

     Filter也称之为过滤器,它是Servlet2.3以上新增加的一个功能,其技术也是非常强大的。通过Filter技术可以对WEB服务器的文件进行拦截,从而实现一些特殊的功能。在JSP开发应用中也是必备的技能之一。

 

    Filter可以改变一个request(请求)和修改一个response(响应)Filter不是一个Servlet,它不能产生一个response,它能够在一个requsst到达Servlet之前预处理request,也可以在离开Servlet时处理response

 

一个Filter包括:

 

1、在Servlet被调用之前截获。

 

2、在Servlet被调用之前检查Servlet Reqest3

 

3、根据需要修改request头和request数据。

 

4、根据需要修改response头和response数据。

 

5、在Servlet被调用之后截获。

 

File和用户及WEB资源关系如果所示:

 Filter——过滤器

 

二、Filter开发基础介绍

 

1  一个Filter必须实现javax.servlet.Filter接口并定义三个方法:

 

  ● public void init(FilterConfig config):Filter实例化后进行初始化的回调方法。

 

  ● public void doFilter(ServletRequest req,ServletResponse res, FilterChain chain):处理过滤器的方法。

 

  ● public void destory():Filter在释放时回调的方法。

 

2FilterConfig接口

 

       在配置filter时,可以使用<init-param>filter配置一些初始化参数,当web容器实例化Filter对象,调用其init方法时,会把封装了filter初始化参数的filterConfig对象传递进来。因此在编写filter时,通过filterConfig对象的方法,就可获得:

 

  String getFilterName():得到filter的名称。

 

  String getInitParameter(String name): 返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.

 

  Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。

 

  public ServletContext getServletContext():返回Servlet上下文对象的引用。

 

3Filter

 

    在一个Web应用中可以有多个过滤器,这些些过滤器组成起来形成了一个过滤器链,每当发出的请求到达目标资源之前,浏览器压缩后数据,可以提高数据的传输效率。WEB服务器根据Filterweb.xml文件中的注册顺序决定先调用哪一个Filter,当地一个FilterdoFilter方法被调用时,WEB服务器会创建一个Filter链的FilterChain对象传递给该方法。

 

 

 

三、Filter常见的应用。

 

 

 

1、过滤器解决中文乱码的问题,统一全站字符编码的过滤器。

 

 

 

  首先定义一个EncodingFiler的实现类,实现Filter接口,代码如下:

 

public class EncodingFilter implements Filter {

  private FilterConfig config = null;

  private String defaultCharset = "utf-8";

 

  // Filter被释放时的回调方法

 public void destroy() {

 

 }

 

  // FilterConfig接口实例中封装了这个Filter的初始化参数

  public void init(FilterConfig filterConfig) throws ServletException {

   this.config = filterConfig;

  }

 

   // 过滤方法

 

 public void doFilter(ServletRequest request, ServletResponse response,

    FilterChain chain) throws IOException, ServletException {

   HttpServletRequest req = (HttpServletRequest) request;

   HttpServletResponse resp = (HttpServletResponse) response;

  

   String charset = config.getInitParameter("charset");

   if(charset==null){

    charset = defaultCharset;

   }

   request.setCharacterEncoding(charset);

 

  //有时候response不用设置编码,因为servlet一般不做输出,

 //输出交由jsp来做,所以只要jsp页面设定编码即可

   resp.setCharacterEncoding(charset);

   resp.setContentType("text/html;charset="+charset);

  

   chain.doFilter(req, resp);

     

  }

 

}

 

在 web.xml 文件中实现Filter实现类,并配置初始化。代码如下:

 

 <?xml version="1.0" encoding="UTF-8"?>

 <web-app version="2.5"

  xmlns="http://java.sun.com/xml/ns/javaee"

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

   <display-name></display-name>

 

   <filter>

      <filter-name>EncodingFilter</filter-name>

      <filter-class>cn.class3g.web.filter.EncodingFilter</filter-class>

       <init-param>

          <param-name>charset</param-name>

          <param-value>utf-8</param-value>

       </init-param>

       <web-app>

 

2、禁止浏览器缓存所有动态页面的过滤器

 

 

 

有 3 个 HTTP 响应头字段都可以禁止浏览器缓存当前页面,它们在 Servlet 中的示例代码如下:

 

response.setDateHeader("Expires",-1);

 

response.setHeader("Cache-Control","no-cache");  

 

response.setHeader("Pragma","no-cache");

 

并不是所有的浏览器都能完全支持上面的三个响应头,因此最好是同时使用上面的三个响应头。

 

 

 

     Expires数据头:值为GMT时间值,为-1指浏览器不要缓存页面

 

     Cache-Control响应头有两个常用值:

 

     no-cache指浏览器不要缓存当前页面。

 

     max-age:xxx指浏览器缓存页面xxx秒。

 

 

 

首先定义一个NoCacheFilter的实现类,实现Filter接口,代码如下:

 

public class NoCacheFilter implements Filter {

 

 public void init(FilterConfig filterConfig) throws ServletException {

 

       }

 

 public void doFilter(ServletRequest req, ServletResponse res,

    FilterChain chain) throws IOException, ServletException {

 

        HttpServletRequest  request=(HttpServletRequest)req;

        HttpServletResponse response = (HttpServletResponse) res;

  

   response.setDateHeader("expires",-1);

   response.setHeader("Cache-Control","no-cache");

   response.setHeader("Pragma","no-cache");

  

   chain.doFilter(request, response);

 

    }

 

   public void destroy() {

    }

 

   }

 

 

 

3、控制浏览器缓存页面中的静态资源的过滤器

 

 有些动态页面中引用了一些图片或css文件以修饰页面效果,这些图片和css文件经常是不变化的,所以为减轻服务器的压力,可以使用filter控制浏览器缓存这些文件,以提升服务器的性能。

 

这一个举个简单的例子说明一下:

 

  就是你登陆一个***系统或者是***网站时,登陆了账号密码以后,进去以后,再点返回,返回到登陆窗口,你发现你之前登陆过的账号密码就不在现实,被浏览器中的过滤器清除了。

相关文章
相关标签/搜索