概述

一个执行过滤器的Java 类必须实现javax.servlet.Filter 接口。这一接口含有三个方法:

  init(FilterConfig):这是容器所调用的初始化方法。它保证了在第一次 doFilter() 调用前由容器调用。它能获取在 web.xml 文件中指定的filter初始化参数。

  doFilter(ServletRequest, ServletResponse, FilterChain):这是一个完成过滤行为的方法。它同样是上一个过滤器调用的方法。引入的 FilterChain 对象提供了后续过滤器所要调用的信息。

  destroy():容器在销毁过滤器实例前,doFilter()中的所有活动都被该实例终止后,调用该方法。

 

简单的例子
  
  两个Filter过滤器.其中一个过滤器,完成字符集的编码的转化,如大家经常遇到的汉字编码问题,你只需配置为GBK即可.它从Web.xml之中读取这些参数的配置信息,然后进行编码的转化.另一个是安全校验Fliter,它负责进行安全检查哪些页面可以进行,哪些不可。它们组成一个Filter链,结构图和实现代码如下:


public class EncodingFilter implements Filter {
 private FilterConfig config = null;
 // default to ASCII
 private String targetEncoding = "ASCII";

 public void init(FilterConfig config) throws ServletException {
  this.targetEncoding = config.getInitParameter("encoding");
 }
 //在过滤器中实现字符集编码转化
 public void doFilter(ServletRequest srequest, ServletResponse sresponse, FilterChain chain)
 throws IOException, ServletException {
 
  HttpServletRequest request = (HttpServletRequest)srequest;
  request.setCharacterEncoding(targetEncoding);
  // move on to the next
  chain.doFilter(srequest,sresponse);
 }
 public void destroy() {
  .................
 }
}

public class SignOnFilter implements Filter {
 public void init(FilterConfig config) throws ServletException {
  this.config = config;
  URL protectedResourcesURL = null;
  try {
   protectedResourcesURL = config.getServletContext().getResource("/WEB-INF/signon-config.xml");
   ...............
  } catch (java.net.MalformedURLException ex) {
   System.out.println("SignonFilter: malformed URL exception: " + ex);
  }
 }

 public void destroy() {
  config = null;
 }
 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
 throws IOException, ServletException {
  ........
 }
}

  容器通过 Web 应用程序中的配置描述符 web.xml 文件解析过滤器配置信息。有两个新的标记与过滤器相关:<filter> 和 <filter-mapping>。<filter> 标记是一个过滤器定义,它必定有一个 <filter- name> 和 <filter-class> 子元素。<filter-name> 子元素给出了一个与过滤器实例相关的名字。<filter-class> 指定了由容器载入的实现类。您能随意地包含一个 <init-param> 子元素为过滤器实例提供初始化参数。<filter-mapping> 标记代表了一个过滤器的映射,指定了过滤器会对其产生作用的 URL 的子集。

<!-- Encoding Filter Declaration Start -->
<filter>
 <filter-name>EncodingFilter</filter-name>
 <display-name>Encoding Filter</display-name>
 <description>no description</description>
 <filter-class>com.sun.j2ee.blueprints.encodingfilter.web.EncodingFilter</filter-class>
 <init-param>
  <param-name>encoding</param-name>
  <param-value>UTF-8</param-value>
 </init-param>
</filter>
<!-- Encoding Filter Declaration End -->
<!-- Signon Filter Declaration Start -->
<filter>
 <filter-name>SignOnFilter</filter-name>
 <display-name>SignOn Filter</display-name>
 <description>no description</description>
 <filter-class>com.sun.j2ee.blueprints.signon.web.SignOnFilter</filter-class>
</filter>
<!-- Signon Filter Declaration End -->

<!-- Encoding Filter Mapping Start-->
<filter-mapping>
 <filter-name>EncodingFilter</filter-name>
 <url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Encoding Filter Mapping End -->
<!-- Signon Filter Mapping Start-->
<filter-mapping>
 <filter-name>SignOnFilter</filter-name>
 <url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Signon Filter Mapping End -->

  

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐