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

     

    转自:http://www.w3cschool.cc/jsp/jsp-writing-filters.html

    ————————————————————————————————————————————————————

    Servlet和JSP中的过滤器都是Java类,它们存在的目的如下:

    • 在请求访问后端资源时拦截它
    • 管理从服务器返回给客户端的响应

    下面列出了多种常用的过滤器类型:

    • 认证过滤器
    • 数据压缩过滤器
    • 加密过滤器
    • 触发资源访问事件的过滤器
    • 图像转换过滤器
    • 登录和验证过滤器
    • MIME类型链过滤器
    • 令牌过滤器
    • 转换XML内容的XSL/T过滤器

    过滤器将会被插入进web.xml文件中,然后映射servlet、JSP文件的名字,或URL模式。部署描述文件web.xml可以在 <Tomcat-installation-directory>conf 目录下找到。

    当JSP容器启动网络应用程序时,它会创建每一个过滤器的实例,这些过滤器必须在部署描述文件web.xml中声明,并且按声明的顺序执行。


    Servlet过滤器方法

    一个过滤器就是一个Java类,它实现了javax.servlet.Filter 接口。javax.servlet.Filter接口定义了三个方法:

    序号方法 &描述
    1 public void doFilter (ServletRequest, ServletResponse, FilterChain) 每当 request/response要通过过滤链时容器会调用这个方法,因为客户端请求链尾的资源
    2 public void init(FilterConfig filterConfig) 容器调用这个方法来表明一个过滤器被安置在服务中
    3 public void destroy() 容器调用这个方法来表明一个过滤器正在从服务中移除

    JSP过滤器示例

    这个例子将会打印IP地址和每次访问JSP文件的日期时间。当然,这只是个简单的例子,让您了解一些简单的过滤器用法,但是可以使用这些概念来自行构造更复杂的程序。

    //  引入Java包
    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.util.*;
     
    // 实现 Filter 类
    public class LogFilter implements Filter  {
       public void  init(FilterConfig config) 
                             throws ServletException{
          // 获取初始化参数
          String testParam = config.getInitParameter("test-param"); 
     
          //打印初始化参数
          System.out.println("Test Param: " + testParam); 
       }
       public void  doFilter(ServletRequest request, 
                     ServletResponse response,
                     FilterChain chain) 
                     throws java.io.IOException, ServletException {
     
          // 获取客户端ip地址  
          String ipAddress = request.getRemoteAddr();
     
          // 输出ip地址及当前时间
          System.out.println("IP "+ ipAddress + ", Time "
                                           + new Date().toString());
     
          // 传递请求道过滤器链
          chain.doFilter(request,response);
       }
       public void destroy( ){
          /* 在Filter实例在服务器上被移除前调用。*/
       }
    }
    

    编译LogFilter.java文件,然后将编译后的class文件放在<Tomcat安装目录>/webapps/ROOT/WEB-INF/classes目录下。


    web.xml文件中的JSP过滤器映射

    过滤器被定义,然后映射成一个URL或JSP文件名,与servlet被定义然后映射的方式差不多。在部署描述文件web.xml中,使用<filter>标签来进行过滤器映射:

    <filter>
       <filter-name>LogFilter</filter-name>
       <filter-class>LogFilter</filter-class>
       <init-param>
    	  <param-name>test-param</param-name>
    	  <param-value>Initialization Paramter</param-value>
       </init-param>
    </filter>
    <filter-mapping>
       <filter-name>LogFilter</filter-name>
       <url-pattern>/*</url-pattern>
    </filter-mapping>
    

    上述过滤器将会应用在所有servlet和JSP程序中,因为我们在配置中指定了" /*"。您也可以指定一个servlet或JSP路径,如果您只想要将过滤器应用在少数几个servlet或JSP程序中的话。

    现在,像平常一样访问servlet或JSP页面,您就会发现服务器日志中产生了关于此次访问的记录。您也可以使用Log4J记录器来把日志记录在其它文件中。


    使用多重过滤器

    您的网络应用程序可以定义很多不同的过滤器。现在,您定义了两个过滤器,AuthenFilter和LogFilter,其它的步骤与前面讲的一样,除非要创建一个不同的映射,就像下面这样:

    <filter>
       <filter-name>LogFilter</filter-name>
       <filter-class>LogFilter</filter-class>
       <init-param>
    	  <param-name>test-param</param-name>
    	  <param-value>Initialization Paramter</param-value>
       </init-param>
    </filter>
     
    <filter>
       <filter-name>AuthenFilter</filter-name>
       <filter-class>AuthenFilter</filter-class>
       <init-param>
    	  <param-name>test-param</param-name>
    	  <param-value>Initialization Paramter</param-value>
       </init-param>
    </filter>
     
    <filter-mapping>
       <filter-name>LogFilter</filter-name>
       <url-pattern>/*</url-pattern>
    </filter-mapping>
     
    <filter-mapping>
       <filter-name>AuthenFilter</filter-name>
       <url-pattern>/*</url-pattern>
    </filter-mapping>
    

    过滤器的应用顺序

    在web.xml中<filter>元素的映射顺序决定了容器应用这些过滤器的顺序。要反转应用的顺序,您只需要反转web.xml中<filter>元素的定义顺序就行了。

    比如,上面的例子会首先应用 LogFilter然后再应用AuthenFilter,但是下面这个例子将会反转应用的顺序:

    <filter-mapping>
       <filter-name>AuthenFilter</filter-name>
       <url-pattern>/*</url-pattern>
    </filter-mapping>
     
    <filter-mapping>
       <filter-name>LogFilter</filter-name>
       <url-pattern>/*</url-pattern>
    </filter-mapping>
    ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
    另外:转自:http://www.2cto.com/kf/201210/162383.html

    、概念:
    Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

    二、Filter简介
    Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。简单说,就是可以实现web容器对某资源的访问前截获进行相关的处理,还可以在某资源向web容器返回响应前进行截获进行处理。
    三、快速入门
    1、新建一个类,实现Filter接口
    2、实现doFilter()方法,打印一句话,来证明能够进行拦截
    3、在web.xml中进行配置(参照Servlet配置)
    4、访问一个页面,看看能不能拦截
    1>
    [java] view plaincopy
    package com.test.filter; 
     
    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 Demo1Filter implements Filter { 
        private FilterConfig filterConfig; 
     
        public void doFilter(ServletRequest request, ServletResponse response, 
                FilterChain chain) throws IOException, ServletException { 
            System.out.println("Demo1过滤前"); 
            System.out.println(filterConfig.getInitParameter("param1")); 
            chain.doFilter(request, response);//放行。让其走到下个链或目标资源中 
            System.out.println("Demo1过滤后"); 
        } 
     
        public void init(FilterConfig filterConfig) throws ServletException { 
            System.out.println("初始化了"); 
            this.filterConfig = filterConfig; 
        } 
     
        public void destroy() { 
            System.out.println("销毁了"); 
        } 

    2>在web.xml中进行配置
    [html] view plaincopy
    <filter> 
        <filter-name>Demo1Filter</filter-name> 
        <filter-class>com.itheima.filter.Demo1Filter</filter-class> 
        <init-param> 
            <param-name>param1</param-name> 
            <param-value>value在这里呢</param-value> 
        </init-param> 
    </filter> 
    <filter-mapping> 
        <filter-name>Demo1Filter</filter-name> 
        <url-pattern>/*</url-pattern> 
        <dispatcher>REQUEST</dispatcher> <!-- 没有配置dispatcher就是默认request方式的 --> 
        <dispatcher>FORWARD</dispatcher> 
        <dispatcher>ERROR</dispatcher> 
        <dispatcher>INCLUDE</dispatcher> 
    </filter-mapping> 

    四、Filter的应用场景
    通过对filter过滤器的了解,可以得知在以下三种情况下可以做些处理:
    1> 通过控制对chain.doFilter的方法的调用,来决定是否需要访问目标资源。
    比如,可以在用户权限验证等等。判断用户是否有访问某些资源的权限,有权限放行,没权限不执行chain.doFilter方法。
    2> 通过在调用chain.doFilter方法之前,做些处理来达到某些目的。
    比如,解决中文乱码的问题等等。可以在doFilter方法前,执行设置请求编码与响应的编码。甚至可以对request接口进行封装装饰来处理get请求方式的中文乱码问题(重写相应的request.getParameter方法)。
    3> 通过在调用chain.doFilter方法之后,做些处理来达到某些目的。
    比如对整个web网站进行压缩。在调用chain.doFilter方法之前用类A对response对象进行封装装饰,重写getOutputStream和重写getWriter方法。在类A内部中,将输出内容缓存进ByteArrayOutputStream流中,然后在chain.doFilter方法执行后,获取类A中ByteArrayOutputStream流缓存数据,用GZIPOutputStream流进行压缩下。
    五、Filter实现拦截的原理
    Filter接口中有一个doFilter方法,当开发人员编写好Filter类实现doFilter方法,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前(服务器内部对资源的访问机制决定的),都会先调用一下filter的doFilter方法。
    六、Filter生命周期
    和Servlet一样Filter的创建和销毁也是由WEB服务器负责。不过与Servlet区别的是,它是1>在应用启动的时候就进行装载Filter类(与Servlet的load-on-startup配置效果相同)。2>容器创建好Filter对象实例后,调用init()方法。接着被Web容器保存进应用级的集合容器中去了等待着,用户访问资源。3>当用户访问的资源正好被Filter的url-pattern拦截时,容器会取出Filter类调用doFilter方法,下次或多次访问被拦截的资源时,Web容器会直接取出指定Filter对象实例调用doFilter方法(Filter对象常驻留Web容器了)。4>当应用服务被停止或重新装载了,则会执行Filter的destroy方法,Filter对象销毁。
    注意:init方法与destroy方法只会直接一次。
    七、Filter部署应用注意事项
    1> filter-mapping标签中servlet-name与url-pattern。
    Filter不仅可以通过url-pattern来指定拦截哪些url匹配的资源。而且还可以通过servlet-name来指定拦截哪个指定的servlet(专门为某个servlet服务了,servlet-name对应Servlet的相关配置)。
    2> filter-mapping标签中dispatcher。
    指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置多个<dispatcher> 子元素用来指定 Filter 对资源的多种调用方式进行拦截。
    REQUEST:
    当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问或ERROR情况时,那么该过滤器就不会被调用。
    INCLUDE:
    如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
    FORWARD:
    如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
    ERROR:
    如若在A.jsp页面page指令中指定了error属性=examError.jsp,那么A.jsp中若出现了异常,会跳转到examError.jsp中处理。而在跳转到examError.jsp时,若过滤器配置了ERROR的dispather那么则会拦截,否则不会拦截。

  • 相关阅读:
    列表页无限滚动翻页组件--解决性能问题
    UI组件化介绍
    js请求数据的例子
    移动端bug和优化
    利用字符串路径获取对象集合的值
    n个骰子的和,组成数字m的可能
    算法-回形路径
    学习python-跨平台获取键盘事件
    获取数组中多个相加等于0的一组数字 javascript
    一个矩阵 JavaScript
  • 原文地址:https://www.cnblogs.com/kaikailele/p/3901106.html
Copyright © 2011-2022 走看看