Filter生命周期
Filter(过滤器)生命周期各方法执行顺序
- 服务器启动,首先执行构造方法和init方法(这两个方法只执行一次)
- 当有匹配过滤条件的请求时执行doFilter方法(该方法可以执行多次)
- 服务器正常关闭的时候,或者该Filter类重新加载的时候会执行destroy方法(该方法只执行一次)
Filter生命周期各方法执行顺序原理图如下。
各方法执行顺序的代码验证
创建一个Filter类
public class TestFilter implements Filter {
public TestFilter() {
System.out.println("ConstructorMethod");
}
public void init(FilterConfig fConfig) throws ServletException {
System.out.println("initMethod");
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
System.out.println("请求");
chain.doFilter(request, response);
System.out.println("响应");
}
public void destroy() {
System.out.println("destroyMethod");
}
}
创建一个Servlet类
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println(request.getCharacterEncoding());
System.out.println(response.getCharacterEncoding());
String name = request.getParameter("name");
System.out.println(name);
response.sendRedirect("./a.jsp");
}
}
在web.xml中配置Servlet和Filter
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>filter</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>com.zzu.servlet.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/TestServlet</url-pattern>
</servlet-mapping>
<filter>
<filter-name>TestFilter</filter-name>
<filter-class>com.zzu.filter.TestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>TestFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
index.jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>过滤器</title>
</head>
<body>
<a href="TestServlet?name='张三'">链接</a>
</body>
</html>
需要跳转的页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
这是重定向后的页面
</body>
</html>
- 运行Tomcat服务器
- 只执行了构造方法和init方法,其他方法现在并没有执行,在浏览器地址栏中输入web项目地址
- 可以看出来,这个时候已经执行了一次TestFilter中的doFilter方法,这是因为部署描述符中配置的过滤规则为/*所有的请求都会被过滤,也就是当访问index.jsp的时候也会经过这个过滤器,执行doFilter方法。
- 点击页面中的”链接“ a标签,进行跳转
* 控制台打印的信息
- 使用stop按钮停止服务器
- 在服务器正常关闭的时候执行了destroy方法
- Filter生命周期各方法执行的次数
构造方法 | init方法 | doFilter方法 | destroy方法 | |
---|---|---|---|---|
执行次数 | 仅一次 | 仅一次 | 可以执行多次 | 仅一次 |
执行时机 | 服务启动时 | 服务启动时 | 符合过滤规则时 | 服务器正常关闭或者该Filter类重新加载的时候 |