过滤器filter

来源:互联网 发布:广州市启凡网络 编辑:程序博客网 时间:2024/06/02 18:47
传智播客——servlet过滤器应用(2010-01-09 15:26:17)

1.6

思路:servlet过滤器filter。主要过滤请求和相应(可以设置)

      a.应用实例:1.登录拦截验证2.编码格式设定3.过滤不雅字(装饰模式)4.设置无缓存

     

 

Servlet 过滤器:拦截重定向,然后拦截返回的转发

 

Filter接口:用来实现过滤器 

获取上下文路径:${pageContext.request.contextPath}

生命周期: init 初始化   doFilter 执行  destroy销毁

先执行构造方法,再执行初始化方法(该方法由servlet容器调用)

过滤器的使用:

1.       注册过滤器


 

<filter>

                         <!--注册的过滤器的名称-->

                         <filter-name>BaseFilter</filter-name>

                         <!-- 配置过滤器的完成路径 -->

                         <filter-class>com.itcast.filter.BaseFilter</filter-class>

                   </filter>

2.       配置过滤器的映射,即要拦截的文件类型

         

             <!-- 配置过滤器的映射 -->

                   <filter-mapping>

                      <!-- 以注册的过滤器的名称 -->

                      <filter-name>BaseFilter</filter-name>

                      <!-- 拦截所有的文件 -->

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

                   </filter-mapping>

 

Init中的FilterConfig接口的应用:

该接口类似于ServletConfig接口,由容器实现。Servlet规范将代表 ServletContext 对象和 Filter 的配置参数信息都封装在该对象中。Servlet 容器将其作为参数传入过滤器对象的init()方法中。

l        String getFilterName():得到描述符中指定的过滤器的名字。

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

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

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

 

Filter 接口

l        doFilter(ServletRequest request,ServletResponse response,

                           FilterChain chain)throws java.io.IOException,ServletException:

        doFilter()方法类似于Servlet接口的service()方法。当客户端请求目标资源的时候,容器就会调用与这个目标资源相关联的过滤器的doFilter()方法。

          *  其中参数 request, response 为 web 容器或 Filter 链的上一个 Filter 传递过来的请求和相应对象;

           *   参数 chain 为代表当前 Filter 链的对象,在特定的操作完成后,可以在当前 Filter 对象的 doFilter 方法内部需要调用 FilterChain 对象的 chain.doFilter(request,response)方法才能把请求交付给

              * Filter 链中的下一个 Filter

              * 或者目标 Servlet 程序去处理,

              * 也可以直接向客户端返回响应信息,

              * 或者利用RequestDispatcher的forward()和include()方法,

                 以及HttpServletResponse的sendRedirect()方法将请求转向到其他资源

   这个方法的请求和响应参数的类型是ServletRequest和ServletResponse,也就是

说,过滤器的使用并不依赖于具体的协议。

FilterChain接口

l        FilterChain接口:代表当前 Filter 链的对象。由容器实现,容器将其实例作为参数传入过滤器对象的doFilter()方法中。过滤器对象使用FilterChain对象调用过滤器链中的下一个过滤器,如果该过滤器是链中最后一个过滤器,那么将调用目标资源。

l        doFilter(ServletRequest request,ServletResponse response)throws java.io.IOException:调用该方法将使过滤器链中的下一个过滤器被调用。如果是最后一个过滤器,会调用目标资源。

 

 

Filter的应用:设置程序全局编码格式

         再filter中强转servletRequest为httpServletRequest然后设置编码格式

         优化:将要设置的编码格式配置在filter的初始化参数中,然后用FilterConfig获取参数,并设置.(回忆:获取web.xml的初始化参数:request.getServletConfig)

 

拦截单个或指定的多个拦截:

<filter-mapping>         //可以设定多个filter-mapping

      <filter-name>CharacterEncodingFilter</filter-name>

      <!-- 只拦截一个servlet -->

      <servlet-name>EmpServlet</servlet-name>

      <!-- 拦截所有文件 -->

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

    </filter-mapping>

 

拦截servlet方法

<!-- 拦截所有的*.do文件 -->

    <filter-mapping>

      <filter-name>CharacterEncodingFilter</filter-name>

      <url-pattern>*.do</url-pattern>

    </filter-mapping>

 

问题:无法拦截转发的请求

映射 Filter

l       <filter-mapping>元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径( url样式)

•         <filter-name>子元素用于设置filter的注册名称。该值必须是在<filter>元素中声明过的过滤器的名字

•         <url-pattern>设置 filter 所拦截的请求路径(过滤器关联的URL样式)

•         <servlet-name>指定过滤器所拦截的Servlet名称。

•         <dispatcher>指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST. 可以设置多个<dispatcher> 子元素用来指定 Filter 对资源的多种调用方式进行拦截

    <dispatcher> 子元素可以设置的值及其意义:

•         REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。

•         INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。

•         FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。

•         ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。

 

实例:

<filter-mapping>

       <filter-name>NoteFilter</filter-name>

      <url-pattern>*.do</url-pattern>

      <dispatcher>REQUEST</dispatcher>

      <dispatcher>FORWARD</dispatcher>

</filter-mapping>

 

获取初始filter中设置的参数:

<filter>

       <filter-name>CharacterEncodingFilter</filter-name>

       <filter-class>com.itcast.filter.CharacterEncodingFilter</filter-class>

       <init-param>

         <param-name>encoding</param-name>

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

       </init-param>

</filter>

 

获取:

filterConfig.getInitParameter("encoding");    //调用用filterConfi接口的方法

 

回忆:获取初始化参数和servlet构造参数

 

<context-param>

      <param-name>driver_type</param-name>

          <param-value>
         oracle.jdbc.driver.OracleDriver

         </param-value>

   </context-param>

  <context-param>

     <param-name>url</param-name>

        <paramvalue>

               jdbc:oracle:thin:@rich:1521:ora9201

       </param-value>

  </context-param>

 

List. Contains(obj);   // 判断该list中是否存在指定的参数

 

getServletContext().getInitParameter("");  //全局参数获取

getServletConfig().getInitParameter("name"); //单个servlet初始化参数

 

过滤指定的文件:

filtermapping里面定义了对文件进行过滤,

   1)、”/*”表示所有URL

   2)、如果*.jsp表示对后缀是.jsp的文件进行过滤

   3)、如果还有其他的页面,如.do或者.action等,那么可以继续添加

<filter-mapping>这个选项,其中<url-pattern>就填写*.do或者*.action即可。

 

 

过滤器链

若有多个 Filter 程序对某个 Servlet 程序的访问过程进行拦截,当针对该 Servlet 的访问请求到达时,web 容器将把这多个 Filter 程序组合成一个 Filter 链(过滤器链)。Filter 链中各个 Filter 的拦截顺序与它们在应用程序的 web.xml 中映射的顺序一致

 

HttpServletReuqest.getSession();

 

装饰模式:

l     装饰 HttpServletRequest 对象 HttpServletRequestWrapper

l           Servlet API 中提供了一个 HttpServletRequestWrapper 类来包装原始的 request 对象, HttpServletRequestWrapper 类实现了 HttpServletRequest 接口中的所有方法,这些方法的内部实现都是仅仅调用了一下所包装的的 request 对象的对应方法

l        相类似 Servlet API 也提供了一个 HttpServletResponseWrapper 类来包装原始的 response 对象

原创粉丝点击