Servlet过滤器(Filter)编写小结

1、Servlet过滤器简介

Servlet过滤器是可用于Servlet编程的java类,主要作用是:在客户端的请求访问后端资源之前,拦截这些请求;在服务器的响应发送到客户端之前,处理这些响应。过滤器被部署在部署描述文件web.xml中,然后映射到部署描述中的Servlet名称或URL模式。当Web容器启动Web应用程序时,它会在部署描述符中声明的每一个过滤器创建一个实例,该过滤器的执行顺序是按它们在部署描述符中声明的顺序。

使用Filter完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。

Filter有如下几个用处:

(1)在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest。

(2)根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据。

(3)在HttpServletRequest到达客户端之前,拦截HttpServletResponse。

(4)根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。

Filter有如下几个种类:

(1)用户授权的Filter:Filter负责检查用户请求,根据请求过滤用户非法请求。

(2)日志Filter:详细记录某些特殊的用户请求。

(3)负责解码的Filter:包括对非标准编码的请求编码。

(4)能改变XML内容的XSLT Filter等。

(5)Filter可负责拦截多个请求或响应,一个请求或响应也可被多个Filter拦截。

创建Filter只需两步:

(1)创建Filter处理类。

(2)web.xml文件中配置Filter。

2、Servlet过滤器方法

Servlet过滤器是实现了javax.servlet.Filter接口的java类,该接口定义了如下三个方法:

方法
描述
public void doFilter (ServletRequest, ServletResponse, FilterChain)该方法在每次一个请求/响应对应客户端在链的末端请求资源而通过链传递时由容器调用。
public void init(FilterConfig filterConfig)该方法由Web容器调用,指示一个过滤器被放入服务。
public void destroy()该方法由 Web 容器调用,指示一个过滤器被取出服务。

3、Servlet过滤器实例

下面的例子简单的实现了输出访问信息,包括国家、地区、时间、访客IP,其中国家和地区直接就从配置文件中读取了,时间故意用了一种不合理的方式取得,访客IP获取正常,示例如下:

package net.yedward.server;

import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class LogFilter implements Filter {
	private String currentDateTime;
	private String country;
	private String area;

	@Override
	public void init(FilterConfig config) throws ServletException {
		// 其实,不应该在init()中获得时间信息,因为该方法只会被执行一次
		Calendar calendar = new GregorianCalendar();
		Date date = calendar.getTime();
		DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		this.currentDateTime = df.format(date);
		this.country = config.getInitParameter("country");
		this.area = config.getInitParameter("area");
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		String ipAddress = request.getRemoteAddr();
		System.out.println("日志信息:" + this.country + this.area
				+ this.currentDateTime + ", " + ipAddress);
		chain.doFilter(request, response);
	}

	@Override
	public void destroy() {
		// 由于是要实现日志功能,记录访客信息,那么可以在init()中添加连接数据库的信息,然后在doFilter()中将信息插入数据库,最后在destroy()中关闭数据库连接,该示例没有这样写了。
	}
}

下面是配置文件web.xml中的内容:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name></display-name>	
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
    <filter>
        <filter-name>LogFilter</filter-name>
        <filter-class>net.yedward.server.LogFilter</filter-class>
        <init-param>
            <param-name>country</param-name>
            <param-value>China</param-value>
        </init-param>
        <init-param>
            <param-name>area</param-name>
            <param-value>Shanghai</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>LogFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

至于index.jsp中的内容不重要,因为配置文件中url-pattern的设置是/*,随便输入一个网址即可。

上面只是添加了一个过滤器,如果要过滤多个规则,要编写好几个过滤器,那么只要在web.xml文件中再添加相应的配置信息即可,过滤器的执行顺序是由在web.xml文件中filter-mapping的先后顺序决定的。

本文标题:Servlet过滤器(Filter)编写小结

本文链接:http://yedward.net/?id=265

本文版权归作者所有,欢迎转载,转载请以文字链接的形式注明文章出处。

相关文章