Servlet过滤器

来源:互联网 发布:flash破解版mac cs5 编辑:程序博客网 时间:2024/04/30 01:31

Servlet过滤器(Filter)技术是从Servlet2.3规范开始引入的。与Servlet技术一样,Servlet过滤器也是一种Web应用程序组件,可以部署在Web应用程序中。

过滤器的工作流程:

Ø         Web服务器接收到一个请求后,将会判断此请求路径是否匹配到一个过滤器配置,如果匹配到,则服务器会把请求交给相关联的过滤器处理

Ø         过滤处理之后,Web服务器会判断是否有另一个关联的过滤器,如果存在继续交给下个处理

Ø         最后调用客户需要访问的Web资源,如JSPServlet

Ø         在返回给客户端的过程中,首先同样经过关联的过滤器,只是顺序与请求到来时相反

 过滤器的用途:

Ø         可以进行请求的权限判断。

Ø         可以处理文本乱码问题。

Ø         过滤器还有很多的其他用途,例如XML转换过滤、数据压缩过滤、图像转换过滤、加密过滤、请求与响应封装等。

创建Servlet过滤器的步骤:

1.       建立一个实现javax.servlet.Filter接口的类。实现接口中的三个方法:doFilter()init()destroy()

2.       doFilter方法中添加需要完成某个过滤功能的代码。调用FilterChain对象的doFilter方法。在调用此对象的doFilter方法时,调用下一个相关的过滤器。如果没有其他的过滤器与所请求路径信息关联,那么会调用客户端请求的Web资源。

3.       对相应的Web资源注册过滤器。在部署描述符文件(web.xml)中使用<filter><filter-mapping>元素注册过滤器组件。

Filter接口:

所有过滤器都必须实现javax.servlet.Filter接口。这个接口包含三个方法,分别为:

public void init(FilterConfigconfig) throws ServletException

public void doFilter(ServletRequestrequest, ServletResponseresponse, FilterChainchain)

 throws ServletException,IOException

public void destroy()public void destroy()

FilterConfig接口:

FilterConfig对象类似于ServletConfig对象。

FilterConfig对象与ServletConfig对象功能类似,通过init方法由容器创建并传递给Filter实现类使用。此接口中主要有以下几个方法:

public String getFilterName()

public String getInitParameter(Stringname)

public Enumeration getInitParameterNames()

ServletContext getServletContext()

FilterChain接口:

javax.servlet.FilterChain接口只有一个方法,方法声明如下

public void doFilter(ServletRequestrequest, ServletResponseresponse);

Servlet过滤器的配置

Servlet过滤器必须配置在web.xml文件中

主要配置两个元素,分别是:

<filter>

<filter-mapping>

Filter总结:

Filter可以解决的问题:将一些共同的处理放到filter中处理,减少了每一个servlet分别处理的麻烦。

Filter过滤的对象:requestresponse

Filter的执行顺序:参照web.xml配置的顺序,<filter-mapping>放置的前后顺序,谁在前,先执行谁。不过要注意的是,每个filter一定是<filter><filter-mapping>前,不然服务器启动会出现错误。

注意事项:

1.     不同requestresponse才可以触发filter,也就是说请求转发,如:forward,因为是同一个request,因此不再经过filter,而sendRedict可以触发filter

2.     可以参与过滤的资源必须包含requestresponse对象

下面是例子:

package com.neu.filter;

import java.io.IOException;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

public class filter1 implements Filter {

    public void destroy() {        // TODO Auto-generated method stub

 

    }

    public void doFilter(ServletRequest arg0, ServletResponse arg1,

            FilterChain arg2) throws IOException, ServletException {

        // TODO Auto-generated method stub

        System.out.println("2");

        arg2.doFilter(arg0, arg1);

         /*告诉服务器这个过滤器已经执行过了,可以继续向下执行了*/

        /*Causes the next filter in the chain to be invoked

         * , or if the calling filter is the last filter in the chain

         * , causes the resource at the end of the chain to be invoked.*/

    }

    public void init(FilterConfig arg0) throws ServletException {

        // TODO Auto-generated method stub

    }

}

<filter>

    <filter-name>Filter1</filter-name>

    <filter-class>com.neu.filter.filter1</filter-class>

  </filter>

  <filter-mapping>

    <filter-name>Filter1</filter-name>

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

  </filter-mapping>

原创粉丝点击