💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# JSP 过滤器 Servlet和JSP中的过滤器都是Java类,它们存在的目的如下: * 在请求访问后端资源时拦截它 * 管理从服务器返回给客户端的响应 下面列出了多种常用的过滤器类型: * 认证过滤器 * 数据压缩过滤器 * 加密过滤器 * 触发资源访问事件的过滤器 * 图像转换过滤器 * 登录和验证过滤器 * MIME类型链过滤器 * 令牌过滤器 * 转换XML内容的XSL/T过滤器 过滤器将会被插入进web.xml文件中,然后映射servlet、JSP文件的名字,或URL模式。部署描述文件web.xml可以在 &lt;Tomcat-installation-directory&gt;\conf 目录下找到。 当JSP容器启动网络应用程序时,它会创建每一个过滤器的实例,这些过滤器必须在部署描述文件web.xml中声明,并且按声明的顺序执行。 ## 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过滤器示例 这个例子将会打印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文件放在&lt;Tomcat安装目录&gt;/webapps/ROOT/WEB-INF/classes目录下。 ## web.xml文件中的JSP过滤器映射 过滤器被定义,然后映射成一个URL或JSP文件名,与servlet被定义然后映射的方式差不多。在部署描述文件web.xml中,使用&lt;filter&gt;标签来进行过滤器映射: ``` <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中&lt;filter&gt;元素的映射顺序决定了容器应用这些过滤器的顺序。要反转应用的顺序,您只需要反转web.xml中&lt;filter&gt;元素的定义顺序就行了。 比如,上面的例子会首先应用 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> ```