1.过滤器的主要功能是允许我们在request转给某个资源之前(比如:html文件,servlet,JSP文件,图片文件,excel文件等等)做一些事情,然后在response返回给客户端之前做一些事情。功能上有些类似于防火墙,对入口和出口进行严格控制。
public class MyFilter implements Filter {
//tomcat启动,或者context重新加载的时候调用init(先destroy再init)
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("MyFilter init...");
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//request到达的时候执行下面的代码
System.out.println("MyFilter request>>>>>>>>>>>>");
//转给过滤器链中的下一个filter,如果是最后一个filter,调用要访问的资源
chain.doFilter(request,response);
//要访问的资源访问完以后,response到达的时候执行下面的代码
System.out.println("MyFilter response>>>>>>>>>>>>");
}
//tomcat关闭或者context重新加载的时候调用destroy
public void destroy() {
System.out.println("MyFilter destroy...");
}
}
2.filter的配置方法
web.xml
通过url匹配:
<filter>
<filter-name>My Filter</filter-name>
<filter-class>MyFilter</filter-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>My Filter</filter-name>
<!-- url匹配规则 -->
<url-pattern>/*</url-pattern>
<!-- filter对应的请求方式,默认是REQUEST -->
<dispatcher>REQUEST</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
通过servlet名匹配:
<filter>
<filter-name>My Filter</filter-name>
<filter-class>MyFilter</filter-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>My Filter</filter-name>
<!-- 根据url匹配到MyServlet的时候,执行My Filter -->
<servlet-name>MyServlet</servlet-name>
<!-- filter对应的请求方式,默认是REQUEST -->
<dispatcher>REQUEST</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
3.过滤器链
1)request到达以后,实际匹配到的过滤器可能有一个,也可能有多个,多个的时候,会形成一个过滤器链,过滤器的执行顺序和web.xml中filter-mapping的配置的先后顺序一致,写在前面的先执行,写在后面的后执行。
2)每个过滤器执行完以后会调用chain.doFilter(request,response);从而调用下一个过滤器的doFilter方法。(其实此时执行到的只是每个过滤器中chain.doFilter(request,response);之前的代码)
3)当所有的匹配到的过滤器都执行完以后,将调用具体访问的资源,比如servlet,或者jsp。
4)请求的资源执行结束后,response返回的时候,再次调用匹配到的过滤器。调用顺序和request到达时的调用顺序正好相反。(此时执行的是每个过滤器中chain.doFilter(request,response);之后的代码)
如果在过滤器的doFilter前后,以及访问的servlet的doGet中事先写入打印调试信息的话,在浏览器中提交某个get请求的话,在控制台会看到下面的打印信息:
MyFilter1 request>>>>>>>>>>>>
MyFilter2 request>>>>>>>>>>>>
MyFilter3 request>>>>>>>>>>>>
MyServlet doGet>>>>>>>>>>>>
MyFilter3 response>>>>>>>>>>>>
MyFilter2 response>>>>>>>>>>>>
MyFilter1 response>>>>>>>>>>>>
对应的调用顺序如下:
客户端发出request --> MyFilter1 --> MyFilter2 --> MyFilter3 --> MyServlet --> MyFilter3 --> MyFilter2 --> MyFilter1
--> 客户端获得response
分享到:
相关推荐
tomcat-redis-session-manager-1.2-tomcat-7-java-7tomcat-redis-session-manager-1.2-tomcat-7-java-7tomcat-redis-session-manager-1.2-tomcat-7-java-7tomcat-redis-session-manager-1.2-tomcat-7-java-7tomcat-...
tomcat-redis-session-manager源码
Tomcat8亲测可用 tomcat-redis-session-manager的jar包 修改了tomcat-redis-session-manager源码进行的编译生成的jar包
开发工具 apache-tomcat-8.0.41-windows-x86开发工具 apache-tomcat-8.0.41-windows-x86开发工具 apache-tomcat-8.0.41-windows-x86开发工具 apache-tomcat-8.0.41-windows-x86开发工具 apache-tomcat-8.0.41-...
旦容器初始化已经结束,调时就会出现异常:2022/2/23 下午8:40Tomcat 源代码调试笔记 - 看不见的 Shell我看了下这个 if 之后的语句,并
基于tomcat-redis-session-manager源码进行的编译生成的jar包,压缩包中包含Tomcat7和Tomcat8打好的jar包。
Tomcat7下载(apache-tomcat-7.0.85)Tomcat7下载(apache-tomcat-7.0.85)Tomcat7下载(apache-tomcat-7.0.85)Tomcat7下载(apache-tomcat-7.0.85)
apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-...
因tomcat7使用redis共享session,其他的包存在问题,自己编译后处理通过。 该包是在https://github.com/jcoleman/tomcat-redis-session-manager 将源码编译后的包。
文件名写错了,此压缩文件支持tomcat8.5。是否支持8.0请自行测试,本人只测试了8.5,可以使用。压缩文件包括tomcat-redis-session-manager-...apache-tomcat-8.5.33.tar.gz,nginx-1.6.2.tar.gz也打包进去,一步到位。
apache-tomcat-10.0.8.exe、 apache-tomcat-10.0.8.tar.gz、 apache-tomcat-10.0.8.zip、 apache-tomcat-10.0.8-windows-x64.zip、 apache-tomcat-10.0.8-windows-x86.zip、 apache-tomcat-10.0.8-deployer.tar.gz、...
所需的tomcat-redis-session-manager所有的jar包下载。测试环境JDK1.8,Tomact8
使用tomcat-redis-session-manager进行统一session管理所需jar包,包括tomcat6-jdk6、tomcat7-jdk7、tomcat8-jdk8
用于配置 tomcat-redis-session-manager
包括commons-pool-1.6.jar,jedis-2.0.0.jar,tomcat-redis-session-manager-1.2-tomcat-6&7.jar
tomcat-redis-session-manager-2.0.0.jar,可用于Tomcat8下Redis的Session共享,亲测可用,还需要下载另外两个jar包:commons-pool2-2.4.2.jar和jedis-2.9.0.jar,maven仓库有,此处不再上传
tomcat-redis-session-manager-1.2-tomcat-7.jar 和tomcat的context.xml配置文件。 2.7.2版包含 commons-pool2-2.4.1.jar jedis-2.7.2.jar tomcat-redis-session.jar 和tomcat的context.xml配置文件
apache-tomcat-8.5.31-windows-x86 32位,tomcat-8 32位
最新版windows apache-tomcat-8.5.70-windows-x64.zip最新版windows apache-tomcat-8.5.70-windows-x64.zip