zoukankan      html  css  js  c++  java
  • java_第一年_JavaWeb(15)

    Filter过滤器,Servlet API 中提供了一个Filter接口,用于实现用户在访问某个目标资源前对其进行拦截;

    拦截原理:web服务器通过Filter接口调用doFilter方法,会传递一个filterChain对象进来,该对象也提供了doFilter方法,可根据是否调用该方法决定是否调用web服务器web资源的service方法;

    通过Filter过滤器可达到以下目的:

    • 调用目标资源之前,先执行一段代码;
    • 是否让用户访问web资源
    • 调用目标资源后,执行一段代码

    Filter的开发除了要实现doFilter方法外,还需在web.xml文件中编写<filter>和<filter-mapping>元素,对所编写的filter类进行注册并设置其所要拦截的资源,例:

    package lzj.learn;
    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 FilterDemo1 implements Filter{
        @Overvide
        public void init(FilterCinfig filterConfig) throws ServletException{
            System.out,println("----过滤器初始化----");
        }
        @Overvide
        public void doFilter(ServletRequest request,ServletResponse response, FilterChain chain) throws IOException,ServletException{
            chain.doFilter(request,response);//放行
        }
        @overvide
        public void destroy(){
            System,out.println("销毁过滤器");
        }
    }

    在web.xml配置:

    <filter>
          <filter-name>FilterDemo1</filter-name>
          <filter-class>lzj.learn.FilterDemo1</filter-class>
    </filter>
      
      <!--映射过滤器-->
      <filter-mapping>
          <filter-name>FilterDemo1</filter-name>
          <!--“/*”表示拦截所有的请求 -->
          <url-pattern>/*</url-pattern>
      </filter-mapping>

    web服务器可以设置多个Filter过滤器,根据在web.xml文件中的注册顺序形成过滤链,当doFilter方法被调用时,web服务器会创建一个代表Filter过滤链的FilterChain对象传给该方法,在调用FilterChain对象的doFilter方法时,web服务器会检查FilterChain对象是否还有filter,如果有,则继续往下调用,直达结束或被拦截;

    Filter的创建

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

    Filter的销毁:

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

    FilterConfig接口

    在配置filter时使用<init-param>为filter配置初始化参数,通过FilterConfig对象的方法即可得到所设参数;常用方法有:

      String getFilterName():得到filter的名称。
      String getInitParameter(String name): 返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.
      Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。
      public ServletContext getServletContext():返回Servlet上下文对象的引用

    例:

    package me.gacl.web.filter;
    
    import java.io.IOException;
    import java.util.Enumeration;
    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 FilterDemo2 implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            System.out.println("----过滤器初始化----");
        }
            //得到过滤器的名字
            String filterName = filterConfig.getFilterName();
            //得到在web.xml文件中配置的初始化参数
            String initParam1 = filterConfig.getInitParameter("name");
            String initParam2 = filterConfig.getInitParameter("like");
            //返回过滤器的所有初始化参数的名字的枚举集合。
            Enumeration<String> initParameterNames = filterConfig.getInitParameterNames();
            
            System.out.println(filterName);
            System.out.println(initParam1);
            System.out.println(initParam2);
            while (initParameterNames.hasMoreElements()) {
                String paramName = (String) initParameterNames.nextElement();
                System.out.println(paramName);
            }
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chain) throws IOException, ServletException {
            chain.doFilter(request, response);  //让目标资源执行,放行
            System.out.println("FilterDemo02执行后!!!");
    }
    
        @Override
        public void destroy() {
            System.out.println("----过滤器销毁----");
        }
    }

    web,xml文件的设置

    <filter>
              <description>FilterDemo2过滤器</description>
              <filter-name>FilterDemo2</filter-name>
              <filter-class>lzj.learn.FilterDemo2</filter-class>
              <!--配置FilterDemo02过滤器的初始化参数-->
              <init-param>             
                  <param-name>name</param-name>
                  <param-value>lzj</param-value>
              </init-param>
              <init-param>        
                  <param-name>like</param-name>
                  <param-value>learn</param-value>
              </init-param>
    </filter>
    <filter-mapping>
          <filter-name>FilterDemo2</filter-name>
          <!--“/*”表示拦截所有的请求 -->
          <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
       
    <dispatcher>FORWRAD</dispatcher>

    </filter-mapping>
     

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

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

    <filter-name>子元素用于设置filter的注册名称。该值必须是在<filter>元素中声明过的过滤器的名字
    <url-pattern>设置 filter 所拦截的请求路径(过滤器关联的URL样式)

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

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

    1. REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。
    2. INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
    3. FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
    4. ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。
  • 相关阅读:
    jQuery EasyUI API 中文文档 数字框(NumberBox)
    jQuery EasyUI API 中文文档 数值微调器(NumberSpinner)
    jQuery EasyUI API 中文文档 日期时间框(DateTimeBox)
    jQuery EasyUI API 中文文档 微调器(Spinner)
    jQuery EasyUI API 中文文档 树表格(TreeGrid)
    jQuery EasyUI API 中文文档 树(Tree)
    jQuery EasyUI API 中文文档 属性表格(PropertyGrid)
    EntityFramework 数据操作
    jQuery EasyUI API 中文文档 对话框(Dialog)
    jQuery EasyUI API 中文文档 组合表格(ComboGrid)
  • 原文地址:https://www.cnblogs.com/lzj-learn/p/11721032.html
Copyright © 2011-2022 走看看