zoukankan      html  css  js  c++  java
  • JavaWeb_Filter

    今天来写写关于web技术中的一个入门级的--Filter过滤器的使用,方便以后开发使用,不然这种纯技术类的不多敲的话,真的很容易忘掉的。。。

    Filter 来源 -- 有时候开发中会遇到重复代码的实现,就比如每一次都要写入servlet的转码代码,其次对于登陆的用户才会有的相应权限的逻辑等等,就需要过滤器来过滤掉一些我们不需要的东西和操作...

    Filter 实现原理--首先FIlter是JDK里面就自带的一个接口,所以我们自定义的Filter只需要继承这个接口,并且实现其所有的方法就行,因而也容易想到,它跟servlet一样,只要服务器开启,Filter内部的init方法就会被服务器执行,来创建一个Filter实例,然后就是我们可以自定义的doFilter方法的来解决事物逻辑的问题,最后一个就是destroy的方法,也是随着服务器的停止才会执行。

    Filter 使用步骤 

      1. 在你的工程目录下定义一个Filter类来继承Filter接口,下面我都用实现登陆代码需要使用过滤器来转码,而不是再次写入转码代码的例子,我定义的是EncodingFilter的类,继承Filter接口,你的IDE会立马显示红线,提醒你要实现的虚方法们,init(),前面说过,是服务器一开始就会执行的方法,在这里可以得到一些你定义的Filter的配置信息,这些信息的配置和在哪配置见第二步骤,来说init方法的参数,filterConfig这很明显就是配置参数的一个实体类,在这里面你可以得到初始的参数,反正这种得到配置参数及其值的方法千篇一律,都是那几种,我写一个可以得到所有的,并以枚举的方式列出的代码:

    @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            // TODO Auto-generated method stub
            Enumeration<String> enums = filterConfig.getInitParameterNames();
            while(enums.hasMoreElements()){
                
                System.out.println("[ encodingFilter params have : "+enums.nextElement()+" : "+filterConfig.getInitParameter(enums.nextElement()));
            }
        }

    然后就是doFilter方法,这个是重点后面单讲,最后一个destory,这就没什么好说的了

      2. 既然类已经创建好了,现在就是配置信息的设置,在你的web工程目录下面找到web.xml也就是每次回配置servlet的那个文件,里面写入filter的配置信息,直接看示例吧:

    <!-- encodingFilter set -->
      <filter>
              <filter-name>encodingFilter</filter-name>
              <filter-class>filterCases.EncodingFilter</filter-class>
              
              <init-param>  
                  <param-name>encoding</param-name>
                  <param-value>UTF-8</param-value>
              </init-param>
              <init-param>
                  <param-name>path</param-name>
                  <param-value>c:/...</param-value>
          </init-param>
      </filter>
      <filter-mapping>
              <filter-name>encodingFilter</filter-name>
              <url-pattern>/LoginServlet</url-pattern>
      </filter-mapping>

     <filter-name>是你可以自定义给你的Filter的名字,但最好是通俗易懂;

    然后是<filter-class>这个是你自定义的Filter类的全限名称,也就是你的包名+类名,这样服务器才能加载到你的类文件,这个不能错;

    <init-param>就是初始化的参数列表了,这里面主要是以key-value的形式出现的,也是你可以让服务器去执行的事物参数,比如我这里就定义的是转码的事物参数,定义了filter之后,就需要定义filter-map,里面主要是处理filter的转向的一些逻辑问题的,首先指定filter-name,这个跟你上面定义的那个name要一样,然后是<url-pattern>这里面可以写几种形式 :(1)/* 这种是对所有资源都会进行拦截,也就是都会执行filter的dofilter的方法的, (2)/ixxxx.jsp 这种是对指定的jsp进行拦截,也就是每次在请求这个jsp的前面都会先执行一次dofilter的方法, (3)*.jsp这个是对所有的jsp进行拦截, (4)/xxx 这个没有后缀名的,就是默认对指定的servlet进行拦截 ,同时还有一种就拦截servlet的方式<servlet-name>IndexServlet</servlet-name>根据servlet的内部名称拦截;

    <dispatcher> 这格式指定拦截的类型 :

    默认拦截的类型:(直接访问或者重定向)

    <dispatcher>REQUEST</dispatcher>

    拦截转发:

                       <dispatcher>FORWARD</dispatcher>

    拦截包含的页面(RequestDispatcher.include(/page.jsp);    对page.jsp也执行拦截)

                       <dispatcher>INCLUDE</dispatcher>

    拦截声明式异常信息:

                       <dispatcher>ERROR</dispatcher>

      3.重点讲讲这个dofilter的方法内容,首先从参数讲起,很明显,这里会有request和response的参数,主要来源于将要请求访问的资源和要求,这个毋庸置疑,因为这个是在servlet执行只要要执行的嘛,最核心的是这个filterChain,过滤器链,为什么要叫它链呢,因为它有一个方法是filterChain.doFilter(),一看,怎么又是执行这个方法,感觉像是递归,其实这个就是在放行,将你的这个request请求通过我的过滤后再放给下一个定义的过滤器去执行它的doFilter方法,那这个执行顺序是怎么来的呢,就根据你在配置里面的执行顺序来的,然后当所有的过滤器都执行完了就会将request给你要转到的servlet去,所以是必须要写的一个步骤,不然你请求的任何资源信息都显示不出来,因为资源都会被拦截的。

  • 相关阅读:
    N皇后问题
    SDNU1349.快速幂入门
    SDNU1522.陆历川学数学
    埃氏筛
    快速幂
    string函数
    Golang介绍以及安装
    Promise解决回调地狱(多层调用问题)
    JavaScript动画相关
    ES6简单语法
  • 原文地址:https://www.cnblogs.com/AmoryWang-JavaSunny/p/6880233.html
Copyright © 2011-2022 走看看