Servlet过滤器是Java类,可用于Servlet编程用于以下目的:
为了拦截来自客户端的请求访问后端资源之前。
处理来自服务器的响应之前,将他们发送回客户端。
各种类型的规范建议要通过过滤器:
过滤器被部署在部署描述符文件web.xml,然后映射到您的应用程序的部署描述符是servlet的名称或URL模式。
当Web容器启动Web应用程序,它在部署描述符中声明的每一个过滤器,创建一个实例。该过滤器执行的顺序是由他们在部署描述符中声明。
过滤器是一个简单的Java类,实现了javax.servlet.Filter接口。 javax.servlet.Filter接口定义了三个方法:
S.N. | Method & Description |
---|---|
1 |
public void doFilter (ServletRequest, ServletResponse, FilterChain) 这种方法被称为由容器每次链由于资源的客户机请求在链的末端通过一个请求/响应对。 |
2 |
public void init(FilterConfig filterConfig) 这种方法被称为由Web容器,以指示一个过滤器,它被放入服务。 |
3 |
public void destroy() 这种方法被称为由Web容器,一个过滤器,以指示它正被取出的服务。 |
以下是Servlet过滤器的示例将打印出客户端的IP地址和当前日期时间。这个例子给你基本的了解,Servlet过滤器,但你可以编写更复杂的过滤器的应用程序使用相同的概念:
// Import required java libraries import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; // Implements Filter class - by www.gitbook.net 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或Servlet,在大致相同的方式作为Servlet的定义,然后映射到一个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,因为我们指定/ *在我们的配置。您可以指定一个特定的servlet的路径,如果你想申请只有少数的servlet过滤器。
现在试着调用任何servlet中常用的方法,将会看到在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过滤器。若要反转过滤器的顺序,你只需要在web.xml文件中反转过滤器-映射元素。
例如,上面的例子中,将适用于LogFilter第一个位置,那么这将适用于AuthenFilter任何servlet,但下面的例子将顺序颠倒:
<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>