filter过滤器



注:filter也是一个servlet,但是他要实现filter接口
filter过滤器
并且实现下面的方法

public void doFilter(ServletRequest request, ServletResponse response,

FilterChain chain) throws IOException, ServletException {

// TODO Auto-generated method stub

request.setCharacterEncoding(“utf-8″);

chain.doFilter(request, response);//这一句是必须的,不然程序会断掉。

}

 

public void init(FilterConfig filterConfig) throws ServletException {

// TODO Auto-generated method stub

      }
3.web.xml

<filter>

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

<filter-class>com.ru.filter.EncodingFilter</filter-class>

</filter> 

<filter-mapping>

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

<url-pattern>/*</url-pattern>

</filter-mapping>

一、什么是Servlet过滤器

 

过滤器是在数据交互之间过滤数据的中间组件,独立于任何平台或者 Servlet 容器。

 

Servlet过滤器可以应用在客户机和 servlet 之间、servlet 和 servlet 或 JSP 页面之间,以及所包括的每个 JSP 页面之间。

二、实现一个 Servlet 过滤器

 

 

Servlet过滤器 API 包含javax.servlet包中的 3 个接口,分别是 Filter 、 FilterChain 和 FilterConfig 。

实现一个 Servlet 过滤器的确要经历三个步骤。

 

 

 1、编写 Servlet 过滤器实现类。

 2、配置 Servlet 过滤器。把该过滤器添加到 Web 应用程序中(通过在 Web 部署描述符 /web.xml 中声明它);

 3、部署 Servlet 过滤器。把过滤器与应用程序一起打包并部署它;

 

 

Servlet容器对部署描述符中声明的每一个过滤器,只创建一个实例(或实例池)。

与Servlet类似,容器将在同一个过滤器实例上运行多个线程来同时为多个请求服务,因此,开发过滤器时,也要注意线程安全的问题。

 

 

三、编写过滤器实现类

 

1、Filter接口:所有的Servlet过滤器类都必须实现javax.servlet.Filter接口

 a、init(FilterConfig):

  这是Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后将调用这个方法。在这个方法中可以读取web.xml文件中Servlet过滤器的初始化参数。

 

 b、doFilter(ServletRequest,ServletResponse,FilterChain):

  这个方法完成实际的过滤操作,当客户请求访问于过滤器关联的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain参数用于访问后续过滤器。

 

 c、destroy():

  Servlet容器在销毁过滤器实例前调用该方法,这个方法中可以释放Servlet过滤器占用的资源。

 

2、过滤器实现类创建步骤(过滤器实现类生命周期):

 a.实现javax.servlet.Filter接口。

 b.初始化:实现init方法,读取过滤器的初始化参数。

 c.过滤:实现doFilter方法,完成对请求或响应的过滤。

 d.转发或阻塞:调用FilterChain接口对象的doFilter方法,向后续的过滤器传递请求或响应。

 e.析构:destroy方法销毁过滤器,释放过滤器占用的资源。

 

四、配置 Servlet 过滤器(在web.xml中配置)

 


 

过滤器通过 web.xml 文件中的两个 XML 标签来声明: 

 1、<filter> : 定义过滤器的名称,并且声明过滤器实现类和 init() 参数。 

  <filter-name> : 指定过滤器的名字;

  <filter-class> : 指定过滤器类的类名,包括类的路径;

  <init-param> : 为过滤器实例提供初始化参数,可以有多个;

 

 2、<filter-mapping> : 将过滤器与 servlet 或 URL 模式相关联。 

  <filter-name> :  指定过滤器的名字,与<filter>中的子元素<filter-name>相对应;

  <url-pattern> :  指定和过滤器关联的URL,为”

 public class CheckLoginFilter implements Filter {

   protected FilterConfig filterConfig = null;

      private String redirectURL = null;

   private List notCheckURLList = new ArrayList();

   private String sessionKey = null;

 

   public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) 

   throws IOException, ServletException {

 

     HttpServletRequest request = (HttpServletRequest) servletRequest;

   HttpServletResponse response = (HttpServletResponse) servletResponse;

 

          HttpSession session = request.getSession();

     

   if(sessionKey == null) {

       filterChain.doFilter(request, response);

       return;

     }

     if((!checkRequestURIIntNotFilterList(request)) && 

     session.getAttribute(sessionKey) == null) {

       response.sendRedirect(request.getContextPath() + redirectURL);

       return;

     }

     filterChain.doFilter(servletRequest, servletResponse);

   }

 

   public void destroy() {

     notCheckURLList.clear();

   }

 

   private boolean checkRequestURIIntNotFilterList(HttpServletRequest request) {

 

     String uri = request.getServletPath() + (request.getPathInfo() == null ? “” : request.getPathInfo());

     return notCheckURLList.contains(uri);

   }

 

   public void init(FilterConfig filterConfig) throws ServletException {

     this.filterConfig = filterConfig;

     redirectURL = filterConfig.getInitParameter(“redirectURL”);

          sessionKey = filterConfig.getInitParameter(“checkSessionKey”);

 

     String notCheckURLListStr = filterConfig.getInitParameter(“notCheckURLList”);

 

     if(notCheckURLListStr != null) {

       StringTokenizer st = new StringTokenizer(notCheckURLListStr, “;”);

       notCheckURLList.clear();

       while(st.hasMoreTokens()) {

         notCheckURLList.add(st.nextToken());

       }

     }

   }

 }