• JSP的过滤器


    以下内容引用自http://wiki.jikexueyuan.com/project/jsp/writing-filters.html

    Servlet和JSP过滤器都是Java类,可以在Servlet和JSP编程中用于以下目的:

    • 在请求访问后端资源之前从客户端拦截请求。

    • 在响应发送回客户端之前从服务器操作响应。

    有各种符合规格的过滤器:

    • 身份验证过滤器。

    • 数据压缩过滤器

    • 加密过滤器。

    • 触发资源访问事件的过滤器。

    • 图像转换过滤器。

    • 日志记录和审计过滤器。

    • MIME类型链过滤器。

    • Tokenizing过滤器。

    • 转换XML内容的XSL/T过滤器。

    过滤器是部署在部署描述符文件Web.xml中的,然后映射到应用程序的部署描述符中的Servlet或JSP名称或URL模式。部署描述符文件Web.xml可以在<Tomcat-installation-directory>conf目录下找到。

    当JSP容器启动Web应用程序时,它会为每个在部署描述符中声明的过滤器创建一个实例。过滤器按照它们在部署描述符中声明的顺序执行。

    一、Servlet过滤器方法

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

    方法 描述

    public void doFilter (ServletRequest, ServletResponse, FilterChain)

    由于客户端在链尾请求响应,每次请求/响应对通过链时,容器会调用此方法。

    public void init(FilterConfig filterConfig)

    由Web容器调用此方法,向过滤器表明它将被放置在服务中。

    public void destroy()

    由Web容器调用此方法,向过滤器表明它将从服务中被去掉。

    二、JSP过滤器示例

    下面是JSP过滤器的示例,每次访问任何JSP文件时都会输出客户端IP地址和当前日期时间。这个例子会基本了解JSP过滤器,但是可以使用相同的概念编写更复杂的过滤器应用程序:

    // Import required java libraries
    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.util.*;
    
    // Implements Filter class
    public class LogFilter implements Filter  {
       public void  init(FilterConfig config) throws ServletException{
          // Get init parameter 
          String testParam = config.getInitParameter("test-param"); 
    
          //Print the init parameter 
          System.out.println("Test Param: " + testParam); 
       }
       public void  doFilter(ServletRequest request,  ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException {
    
          // Get the IP address of client machine.   
          String ipAddress = request.getRemoteAddr();
    
          // Log the IP address and current timestamp.
          System.out.println("IP "+ ipAddress + ", Time " + new Date().toString());
    
          // Pass request back down the filter chain
          chain.doFilter(request,response);
       }
       public void destroy( ){
          /* Called before the Filter instance is removed 
          from service by the web container*/
       }
    }

    以通常的方式编译LogFilter.java,把LogFilter.class类文件放在<Tomcat-installation-directory>/webapps/ROOT/web-inf/classes中(POM和Eclipse可以忽略这步)。

    三、在Web.xml中的JSP过滤器映射

    首先定义过滤器,然后将过滤器映射到URL或JSP文件的名字中,这几乎与定义Servlet然后映射到Web.Xml文件的URL模式的方式相同。为在部署描述符文件Web.xml的过滤器标签创建以下条目

    <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,会在Web服务器日志中看到生成的登录。可以使用Log4J日志在一个单独的文件中记录上面的登录。

    四、使用多个过滤器

    Web应用程序可能定义了带有特定目的的不同的过滤器。考虑这个情况,定义两个过滤器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-mapping元素的顺序决定了Web容器把过滤器应用到Servlet或JSP的顺序。想要逆转滤波器的顺序,只需要逆转web.xml文件中的filter-mapping元素。

    例如,上面的例子将首先应用LogFilter,然后应用AuthenFilter到任意Servlet或JSP中,但是下面的例子将逆转这个顺序:

    <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>
  • 相关阅读:
    HTML head 头标签
    p标签text-align:justify以及CSS文字两端对齐
    css雪碧图制作
    ps去掉图片上的文字
    Qt Quick之TableView的使用
    Qt Quick之Canvas
    Qt Quick中的信号与槽
    QT之在QML中使用C++类和对象
    rhel7+apache+c cgi+动态域名实现web访问
    (转载)JDOM/XPATH编程指南
  • 原文地址:https://www.cnblogs.com/EasonJim/p/6953882.html
Copyright © 2020-2023  润新知