• Filter(一)


    Filter

                   先把Filter的基础知识绘制成思维导图的形式,便于记忆

    一、Filter简介:

                  Filter又称为过滤器,就是实现浏览器与服务器之间的过滤问题,作用是在浏览器的请求在到达WEB资源(HTML、CSS、Servlet、JSP)之前进行拦截。然后能够进行一些操作:例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

    Filter 的作用:

    1.Filter可以在请求到达目标资源之前进行拦截 2.Filter也可以放行请求 3.Filter可以在响应到达浏览器之前做一个预处理

    二、Filter的实现原理

        也就是Filter是怎么实现拦截的?

         因为Filter是实现Filter接口,而该接口会提供一个doFilter方法;当创建好Filter类后,实现doFilter方法,在web-xml文件中部署好Filter后,每当浏览器向服务器发送请求时,在调用service方法之前都会执行doFilter方法,这时候就可以对网页进行一些过滤和其他的操作;也就是说Filter就像一个门口的保安一样,在你进入小区之前会核实你的身份,如果允许进入就同行,不是本小区的陌生人,就可能让你先登个记在让你进(同行前进行一些操作),出来的时候可能还需要在登个记(放行之后的操作),如果是黑名单上的人就不允许进入。

       这就是Filter的功能(在doFilter中实现):

            访问目标资源前进行一些操作

            是否允许调用目标资源(是否放行)

            调用目标资源后的一些操作

    三、Filter类的创建

             3.1使用Filter的步骤

                     1.编写Java类实现Filter接口,并实现doFilter方法;

                     2.在web-xml文件中进行配置

    1).Java的实现范例

    public class myFilter implements Filter{
    	@Override
    	public void init(FilterConfig arg0) throws ServletException {//初始化方法
    		System.out.println("init初始化");		
    	}
    	@Override
    	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    			throws IOException, ServletException {  //doFilter方法
    		System.out.println("放行前");
    		System.out.println("doFilter");	
    		chain.doFilter(request, response);//放行
    		System.out.println("放行后");
    	}
    	@Override
    	public void destroy() {//销毁方法
    		System.out.println("destroy销毁");
    	}
    }
    

     2)web-xml文件的配置代码

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
      <display-name>web-filter</display-name>
      <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
      </welcome-file-list>
      <!-- 注册过滤器 -->
      <filter>
          <!-- 注册过滤器的名,程序员在程序中使用 -->
      	<filter-name>myFilter</filter-name>
      	 <!-- 配置类,给程序使用,程序识别class类 -->
      	<filter-class>com.deuedu.filter.myFilter</filter-class>
      </filter>
      <!-- 映射过滤器 -->
      <filter-mapping>
         <!-- 映射过滤器,能够通过这个找到注册过滤器名,所以这两个名要一致 -->
      	<filter-name>myFilter</filter-name>
      	<!-- 拦截的请求 -->
      	<url-pattern>/1.jsp</url-pattern>
      </filter-mapping>
    </web-app>
    

     四、Filter的部署

       就是上述在web-xml进行配置的过程,两步:1是注册Filter,2是映射Filter

      1)、注册Filter

            

    <!-- 注册过滤器 -->
      <filter>
          <!-- 注册过滤器的名,程序员在程序中使用 -->
      	<filter-name>myFilter</filter-name>
      	 <!-- 配置类,给程序使用,程序识别class类 -->
      	<filter-class>com.deuedu.filter.myFilter</filter-class>
      </filter>
    

    当然可以在注册的时候添加参数,通过init-param来实现

     <!-- 注册过滤器 -->
      <filter>
          <!-- 注册过滤器的名,程序员在程序中使用 -->
      	<filter-name>myFilter</filter-name>
      	 <!-- 配置类,给程序使用,程序识别class类 -->
      	<filter-class>com.deuedu.filter.myFilter</filter-class>
        <init-param>
     7        <description>初始化参数</description>
     8        <param-name>name</param-name>
     9        <param-value>孙悟空</param-value>
    10   </init-param>
      </filter>
    

           <description>用于添加描述信息,该元素的内容可为空,<description>可以不配置。

      <filter-name>用于为过滤器指定一个名字,该元素的内容不能为空。
      <filter-class>元素用于指定过滤器的完整的限定类名。
      <init-param>元素用于为过滤器指定初始化参数,它的子元素<param-name>指定参数的名字,<param-value>指定参数的值。在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。如果过滤器不需要指定初始化参数,那么<init-param>元素可以不配置。

    2)映射Filter

    <!-- 映射过滤器 -->
      <filter-mapping>
         <!-- 映射过滤器,能够通过这个找到注册过滤器名,所以这两个名要一致 -->
      	<filter-name>myFilter</filter-name>
      	<!-- 拦截的请求 -->
      	<url-pattern>/1.jsp</url-pattern>
      </filter-mapping>
    

     <filter-mapping>元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径
      <filter-name>子元素用于设置filter的注册名称。该值必须是在<filter>元素中声明过的过滤器的名字
      <url-pattern>设置 filter 所拦截的请求路径(过滤器关联的URL样式)
      <servlet-name>指定过滤器所拦截的Servlet名称。
      <dispatcher>指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置多个<dispatcher> 子元素用来指定 Filter 对资源的多种调用方式进行拦截。

    1. REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。
    2. INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
    3. FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
    4. ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用

    3)

    url-pattern的设置规则

     
    1.精确匹配:只有当目标资源的地址和url-pattern的地址一模一样时,Filter才会拦截资源
    例子:/2.jsp , 只有当浏览器访问项目根目录下的2.jsp时,才会调用Filter
     
    2.路径匹配:当访问的资源在url-pattern配置的路径下时,Filter就会拦截资源。
    例子1:/hello/* , 只要访问项目根目录下hello下的资源,就会调用Filter。
    例子2:/* , 会拦截项目根目录下所有资源
     
    3.后缀匹配:只要访问的资源地址和url-pattern的后缀一样就会调用Filter
    例子:*.jsp 只要是以jsp结尾的请求都会拦截

    五、Filter生命周期

       1.Filter的创建

                   Filter的创建和销毁由WEB服务器负责。 web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作filter对象只会创建一次(单例模式),init方法也只会执行一次。通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。

    2、Filter的销毁

                   Web容器调用destroy方法销毁Filter。destroy方法在Filter的生命周期中仅执行一次。在destroy方法中,可以释放过滤器使用的资源。

    六、Filter链

           在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。

    多个Filter的执行顺序,有filter-mapping标签的配置顺序决定,
    filter-mappint靠前,则filter先执行,靠后则后执行。
  • 相关阅读:
    Struts2的配置中:Could not find action or result 问题的解决方法
    Oracle 数据库 Record is locked by another user 问题解决办法
    设计模式六大原则(2):里氏替换原则
    在PL/SQL中 自动复制转换StringBuffer的SQL
    反射setAccessible()方法
    对允许任意图片上传的发布内容模式的啊哈的想法
    如果你真的想做一件事,你一定会找到一个方法;如果你不想做一件事,你一定会找到一个借口.
    xaml 的 intellisense失效的解决办法
    Blog技术词汇之Rss篇 什么是Rss以及其定义[翻译]
    多个存储过程之间相互调用的原子性问题
  • 原文地址:https://www.cnblogs.com/Actexpler-S/p/7367931.html
Copyright © 2020-2023  润新知