• JSP 过滤器



    JSP 过滤器

    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文件的日期时间。当然,这只是个简单的例子,让您了解一些简单的过滤器用法,但是可以使用这些概念来自行构造更复杂的程序。

    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,respoonse);
    }

    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程序中的话。

    使用多重过滤器

    您的网络应用程序可以定义很多不同的过滤器。现在,您定义了两个过滤器,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>

  • 相关阅读:
    bootstrap学习笔记
    java-多态
    java-重写
    java-继承
    java-包
    java-封装
    java-可变参数
    java-标准输入
    java-构造方法
    private、public、this关键字
  • 原文地址:https://www.cnblogs.com/Alanf/p/10207304.html
Copyright © 2020-2023  润新知