Servlet过滤器

    技术2022-05-20  55

    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>


    最新回复(0)