zoukankan      html  css  js  c++  java
  • 过滤器Filter

    在web项目中就只有三大组件:

                  Filter过虑器

                  监听器.

                  Servlet   

    在web中过虑器就是一个类javax.servlet.Filter。

    过虑器是用于在执行时,过虑用户的请求(request),或是过虑从请求的资源中返回的响应(response).

    4、实现一个最基本的过虑器 

      1:过虑器只对url(路径)进行过虑。

           2:过虑器开发人员来实现。

           3:过虑器由于是web的核心组,所以这个filter的实现者也必须要配置到web.xml中。

           4:三个生命周期方法:init,destory,doFilter(执行过虑任务)。用户的每次请求,都会执行doFIlter方法,而

                  Init,destory只会执行一次。

                  Init方法执行的时间:在项目启动时,直接初始化Filter的对象,所以会在tomcat启动时执行init方法。

    第一步:书写一个类实现Filter接口

    public class OneFilter implements Filter {
    
      //启动tomcat时候执行一次
      @Override
      public void init(FilterConfig conf) throws ServletException {
        System.err.println("过滤器初始化-----:"+this);
      }
    
      @Override
      public void destroy() {
        System.err.println("------>过滤器destory");
      }
    
      /**
       * FilterChain:过滤器链
       */
      @Override
      public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
          throws IOException, ServletException {
          System.err.println("1,正在执行过滤------>"+this);
          //执行下一个过滤器,如果没有下一个过滤器执行目标的Servlet
          chain.doFilter(req, resp);
          System.err.println("3,------>目标组件执行完了");
      }
     
    }

    写一个要过滤的Servlet:

      

    @WebServlet(name="OneServlet",urlPatterns="/One")
    public class OneServlet extends HttpServlet{
    
      @Override
      protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=UTF-8");
        System.err.println("One Servlet");
        PrintWriter pw = resp.getWriter();
        pw.print("这是OneServlet:"+this+",  request:"+req);
        
        System.err.println("2,----->这是Servlet的doGet方法");
      }
    }

    第二步:在web.xml中配置这个过虑器

    <!-- 配置Filter的类 -->
      <filter>
          <filter-name>one</filter-name>
          <filter-class>com.lhy.filter.OneFilter</filter-class>
      </filter>
      <!-- 配置这个过滤器对哪一个url进行过滤 -->
      <filter-mapping>
          <filter-name>one</filter-name>
          <url-pattern>/One</url-pattern><!-- servlet或jsp的url -->
      </filter-mapping>

    第三步:测试执行

     index.jsp:  通过a标签访问 OneServlet:<a href="One">OneServlet</a>,控制台,可以看到:

    1,正在执行过滤------>com.lhy.filter.OneFilter@59662735

    One Servlet
    2,----->这是Servlet的doGet方法
    3,------>目标组件执行完了

     执行顺序和doFilter方法里说的一致。

    5、filter的filter-mapping中的url-pattern的设置

    url-pattern的设置:

    /*  = 对所有url都请求这个servlet。| 都被这个filter过虑.

    *.jspx = 所有以jspx结束都请求到这个Servlet或是被某个Filter拦截。如http://local:8080/proj/abc.jspx

     /jsps/*  = 所有路径中以/jsps/开头的都请求到这个servlet或是被某个filter拦截到。

    /jsps/*.jspx  错误的:SUN规定*两边不可以同时出现字符。

    /  = 只可以给servlet。 - 所有其他的servlet不处理的url都由这个url所指定的servlet处理。默认servlet。

    过滤器也可以指定多个url-pattern,一个Servlet可以有多个url-pattern,还可以指定对哪个Servlet进行过滤,则它所有的url都会被过滤,例如:OneServlet的url有:

    @WebServlet(name="OneServlet",urlPatterns={"/One","/one"}),怎filter-mapping可以这么写:

    <!-- 配置这个过滤器对哪一个url进行过滤 -->
      <filter-mapping>
          <filter-name>one</filter-name>
          <!-- 拦截这个servlet上的所有url设置 -->
          <servlet-name>OneServlet</servlet-name>
      </filter-mapping>

     


    6、过虑器中的其他配置

    <filter-mapping>
          <filter-name>one</filter-name>
          <url-pattern>/jsps/*</url-pattern>
          <!-- 默认是REQUEST,可以配置多个,如果只配置成 FORWARD,只对转发的请求过滤,
              则直接访问jsps/abc.jsp就不会经过过滤器了-->
          <dispatcher>FORWARD</dispatcher>
      </filter-mapping>

    如果有jsps/abc.jsp这个页面,则显示这个页面有两种方式:

           1:在地址栏请求:http://local:8080/project/jsps/abc.jsp   -- 可以被拦截到的,因为:路径符合/jsp/abc.jsp

           2:req.getRequestDispathcer(“/jsps/abc.jsp”).forward(req,resp);

    -通过转发到jsps/abc.jsp页面,默认情况<dispatcher>FORWARD</dispatcher>是REQUEST,转发的是不会经过过滤器的,要想过滤转发的请求,需要配置为FORWARD 。

        Dipatcher属性:

           Request – 默认值,只拦截用户的新的请求。

           Forward – 对转发进行拦截。

           Include – 对include拦截。

           Error  - 对错误进行拦截。

    <!-- 设置对转发拦截 -->

        <dispatcher>REQUEST</dispatcher>

        <dispatcher>FORWARD</dispatcher>


    默认情况下,不用配置就是request.

    web.xml配置404页面:

    <error-page>
          <error-code>404</error-code>
          <location>/jsps/404.jsp</location>
      </error-page>

    注意如果404页面字节数少于1024个,IE这个土鳖将不显示你定义的404页面,会显示他自己的404,所以很多网站弄个图片放那,够用。

    7、配置过虑器的初始化参数

    在filter类中有一个方法:init(FilterConfig config); 而filtetrConfig中包含了从web.xml中读取初始化参数值。

    <filter>
          <filter-name>one</filter-name>
          <filter-class>cn.itcast.filter.OneFilter</filter-class>
          <init-param>
              <param-name>name</param-name>
              <param-value>张三Jack</param-value>
          </init-param>
          <init-param>
              <param-name>age</param-name>
              <param-value>88</param-value>
          </init-param>
      </filter>

    在filter类中获取值:

    //声明为成员变量 以便于在doFilter中读取配置信息。
      private FilterConfig conf;
      
      //启动tomcat时候执行一次
      @Override
      public void init(FilterConfig conf) throws ServletException {
        this.conf = conf;
        System.err.println("过滤器初始化-----:"+this);
        
        //1,知道参数name,直接 获取初始化参数值
        String name = conf.getInitParameter("name");
        System.err.println("name----->"+name);
        
        //2,直接遍历参数
        Enumeration<String> en = conf.getInitParameterNames();
        while(en.hasMoreElements()){
          String paramName = en.nextElement();
          String val = conf.getInitParameter(paramName);
          System.err.println("初始化参数:"+paramName+"------>"+val);
        }
        
      }

     8、过虑器链FilterChain

    当一个web项目中有多个连接器,且这些过虑器对同个url进行过虑。这时就形成了过虑器链/。

    <filter>
          <filter-name>first</filter-name>
          <filter-class>com.lhy.filter.FirstFilter</filter-class>
      </filter>
      <filter>
          <filter-name>second</filter-name>
          <filter-class>com.lhy.filter.SecondFilter</filter-class>
      </filter>
      <!-- filter-mapping在前边的先执行 -->
      <filter-mapping>
          <filter-name>second</filter-name>
          <url-pattern>/FourServlet</url-pattern>
      </filter-mapping>
      <filter-mapping>
          <filter-name>first</filter-name>
          <url-pattern>/FourServlet</url-pattern>
      </filter-mapping>
  • 相关阅读:
    sql行列互换
    转: 在hibernate中查询使用list,map定制返回类型
    拦截器和过滤器的区
    hibernate 实体对象的三种状态以及转换关系。
    如何理解Hibernate的延迟加载机制?在实际应用中,延迟加载与Session关闭的矛盾是如何处理的?
    Hibernate常见优化策略
    Hibernate的一级缓存、二级缓存和查询缓存。
    关于java Collections.sort 排序
    常用颜色,正则表达式工具
    java正则表达式
  • 原文地址:https://www.cnblogs.com/lihaoyang/p/7372720.html
Copyright © 2011-2022 走看看