发布于 2015-08-17 14:46:24 | 213 次阅读 | 评论: 0 | 来源: 网络整理
Servlet和JSP过滤器是Java类,可用于在Servlet和JSP编程用于以下目的:
拦截来自客户端请求访问资源的后端之前。
要从服务器操作的响应,才传送回客户端。
有各种各样的类型的过滤器由规范建议:
验证过滤器。
数据压缩过滤器
加密过滤器。
过滤器触发资源访问的事件。
图像转换过滤器。
日志记录和审计的过滤器。
MIME类型过滤器链。
标记化的过滤器。
XSL/ T过滤器,转换XML内容。
过 滤器被部署在部署描述符文件web.xml中,然后映射到任何servlet或在您的应用程序的部署描述符中的JSP名称或URL模式。部署描述符文件 web.xml中可以<Tomcat-installation-directory> conf目录下找到。
当JSP容器启动您的Web应用程序,它创建的每个过滤器,您在部署描述符中声明了一个实例。过滤器因为它们在部署描述符中声明的顺序执行。
过滤器是一个简单的实现了javax.servlet.Filter接口的Java类。javax.servlet.Filter接口定义了三个方法:
S.N. | 方法 & 描述 |
---|---|
1 | public void doFilter (ServletRequest, ServletResponse, FilterChain) This method is called by the container each time a request/response pair is passed through the chain due to a client request for a resource at the end of the chain. |
2 | public void init(FilterConfig filterConfig) This method is called by the web container to indicate to a filter that it is being placed into service. |
3 | public void destroy() This method is called by the web container to indicate to a filter that it is being taken out of service. |
以下是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中。
过滤器定义,然后映射到一个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中过滤器映射元素的顺序决定了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>