1、创建与配置
创建实现Filter接口的Java类并实现Filter接口,在web.xml文件中进行注册和设置它所能拦截的资源;
<filter-mapping>
<filter-name>Filter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
上面配置代表拦截所有以.do为结尾的请求;例如:
//发出请求页面index.jsp
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="./DataServlet.do?name=CSDN">链接</a>
</body>
</html>
//请求页面DataServlet
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DataServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
System.out.println(name);
request.getRequestDispatcher("result.jsp").forward(request, response);
}
}
//Filter
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class Filter implements javax.servlet.Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("拦截到请求");
chain.doFilter(request, response);
System.out.println("响应完毕");
}
}
执行结果:
2、Filter中各种方法执行过程
构造方法和init()
//web.xml
<filter>
<display-name>Filter</display-name>
<filter-name>Filter</filter-name>
<filter-class>com.zzu.servlet.Filter</filter-class>
<init-param>
<param-name>name</param-name>
<param-value>Tom</param-value>
</init-param>
</filter>
//Filter
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class Filter implements javax.servlet.Filter {
public Filter() {
System.out.println("构造方法");
}
public void init(FilterConfig fConfig) throws ServletException {
System.out.println(fConfig.getInitParameter("name"));
System.out.println("init");
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("拦截到请求");
chain.doFilter(request, response);
System.out.println("响应完毕");
}
}
执行结果:
web应用程序启动时,web服务器将根据web.xml文件中的配置信息来创建每个注册的Filter实例对象,并保存在服务器内存中。web容器创建Filter对象后,将立即调用该Filter对象的init方法,该方法在Filter生命周期中仅执行一次,filter实例是单例的。Filter对象在Servlet容器加载当前Web应用时即被创建,该方法用于对当前Filter进行初始化操作;FilterConfig用于获取web.xml中对当前Filter的初始化配置参数,配置方式和Servlet相似
destroy()
在Filter中加入下面代码,观察destroy()方法的执行时刻。
public void destroy() {
System.out.println("destroy");
}
在关闭web服务器时执行一次,释放当前Filter所占用的资源,在Filter对象销毁之前被调用。