Filter的生命周期
来源:互联网 发布:金蝶kis数据字典 编辑:程序博客网 时间:2024/04/29 02:08
Filter的生命周期同servlet的生命周期是一样的。它们都提供了init(FilterConfig arg0)和destroy()方法来控制。当web容器(如Tomcat、Jboss等)启动的时候,就会自动调用init(FilterConfig arg0)来对filter进行初始化,当关闭web容器,关机,或者reload整个应用时,都会调用destroy()来关闭filter。也就是说,当web容器启动时,filter就被加载到内存,并在destroy()调用之前都常驻内存。Filter只会初始化一次,web容器过滤的时候,都是调用同一个Filter!
发送Http请求——》服务器处理——》返回数据到客户端(浏览器),在这个过程中,都是在同一个线程中处理的!所以可以通过ThreadLocal来实现请求上下文,见博客:http://blog.csdn.net/yh_zeng2/article/details/73611819
下面通过demo来看看Filter的生命周期:
TestFilter.java:
package filter;import java.io.IOException;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 TestFilter implements Filter{@Overridepublic void destroy() {System.out.println("调用TestFilter.destroy(),TestFilter对象的HashCode="+this.hashCode()+",当前线程对象HashCode=" + Thread.currentThread().hashCode());}@Overridepublic void doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain arg2) throws IOException, ServletException {System.out.println("调用TestFilter.doFilter(),TestFilter对象的HashCode="+this.hashCode()+",当前线程对象HashCode=" + Thread.currentThread().hashCode());arg2.doFilter(arg0, arg1);}@Overridepublic void init(FilterConfig arg0) throws ServletException {System.out.println("调用TestFilter.init(),TestFilter对象的HashCode="+this.hashCode()+",当前线程对象HashCode=" + Thread.currentThread().hashCode());}}
在web.xml配置Filter:
<?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>TestFilter</filter-name> <filter-class>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" import="java.util.*" pageEncoding="utf-8"%> index 页面 <br> 当前线程HashCode=<%=Thread.currentThread().hashCode()%>
MyJsp.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> MyJsp页面 <br> 当前线程HashCode=<%=Thread.currentThread().hashCode()%>
效果:
控制台的打印信息就可以看到,项目启动的时候,就会初始化Fitler!
2017-6-22 22:07:57 org.apache.catalina.startup.HostConfig deployDirectory信息: Deploying web application directory TestFilter调用TestFilter.init(),TestFilter对象的HashCode=582407851,当前线程对象HashCode=1185721282017-6-22 22:07:57 org.apache.coyote.http11.Http11Protocol start信息: Starting Coyote HTTP/1.1 on http-80802017-6-22 22:07:57 org.apache.jk.common.ChannelSocket init信息: JK: ajp13 listening on /0.0.0.0:80092017-6-22 22:07:57 org.apache.jk.server.JkMain start信息: Jk running ID=0 time=0/24 config=null2017-6-22 22:07:57 org.apache.catalina.startup.Catalina start信息: Server startup in 1480 ms
访问http://localhost:8080/TestFilter/ ,页面效果和后台控制台输出如:
调用TestFilter.doFilter(),TestFilter对象的HashCode=582407851,当前线程对象HashCode=81035498
访问http://localhost:8080/TestFilter/MyJsp.jsp,页面效果和后台控制台输出如下图:
调用TestFilter.doFilter(),TestFilter对象的HashCode=582407851,当前线程对象HashCode=1742602365
停止Tomcat服务,通过后台打印信息,就可以看到会调用Filter的destroy方法,如下图:
2017-6-22 22:15:15 org.apache.coyote.http11.Http11Protocol pause信息: Pausing Coyote HTTP/1.1 on http-80802017-6-22 22:15:16 org.apache.catalina.core.StandardService stop信息: Stopping service Catalina调用TestFilter.destroy(),TestFilter对象的HashCode=582407851,当前线程对象HashCode=1185721282017-6-22 22:15:16 org.apache.catalina.core.ApplicationContext log信息: SessionListener: contextDestroyed()2017-6-22 22:15:16 org.apache.catalina.core.ApplicationContext log信息: ContextListener: contextDestroyed()2017-6-22 22:15:16 org.apache.coyote.http11.Http11Protocol destroy信息: Stopping Coyote HTTP/1.1 on http-8080
- Filter的生命周期
- Servlet/Filter 的生命周期
- Servlet/Filter 的生命周期
- filter的生命周期
- Filter的生命周期
- Filter的生命周期
- Filter的生命周期
- servelt filter listener 的生命周期
- Servlet 和Filter的生命周期
- Servlet 和Filter的生命周期
- Filter生命周期
- 过滤器Filter、Filter的生命周期,以及常用方法
- servlet容器中servlet,filter,listener的生命周期
- Servlet、Filter 和 Listener 调用顺序、生命周期的实验分析
- javaweb中的过滤器学习总结(2)---Filter过滤器链和过滤器的生命周期
- Filter(一)配置及生命周期
- DRP学习之路--Filter生命周期
- Listener,Filter,Servlet执行顺序和生命周期
- android-apt和annotationProcessor的使用以及互换
- win10+Ecplise运行wordcount程序
- Oracle忘记密码怎么办,账户锁定怎么办
- NS3编译时忽略warnings
- Linux网络编程(一)
- Filter的生命周期
- 通过互斥锁Mutex和条件变量Conditions实现动态平衡,模拟生活中卖包子的情景
- Linux网络编程(二)
- POJ 1817 Traffic Jam 笔记
- tensorflow61 《TensorFlow技术解析与实战》13 生成式对抗网络
- 图形变换矩阵
- jeb破解版打开闪退
- 关于在VMware虚拟机上安装Linux操作系统
- java中的反射可以做什么?