Filter和Servlet很相像,步骤也是一样的。
注意:此处导入的Filter 是Javax Servlet包下的
@WebFilter("/index.jsp") public class DemoFilter01 implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("1.init......."); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("2.放行前....."); chain.doFilter(request,response); System.out.println("4.放行后....."); } @Override public void destroy() { System.out.println("5.destory...."); } }
由上图分析所致,当我们访问index.jsp的时候,会调用Filter,那么我们用代码检验一下上面的流程图。
**按照流程图,正确的输出应该是1、2、3、4、5,**访问一下index.jsp
<html> <body> <h2>Hello World!</h2> <% System.out.println("3. 我是index.jsp ......"); %> </body> </html>
结果证明流程图是正确的!
1、放行后访问对应资源,资源访问完成后,还会回到Filter吗?
会
2、如果回到Filter中,是重头执行还是执行放行后的逻辑呢?
放行后的逻辑
配置在**@WebFilter(“”)**中,主要有以下四类
一个web路径,可以配置多个过滤器,这多个过滤器就被称为过滤器链。
流程图如下:
见图知意:
当web应用有一个A一个B过滤器组成的过滤器链时,A放行后,会来到B过滤器。只有两个过滤器都放行,才会访问到相应的资源。随后,按照怎么来的,怎么返回的方式,执行B、A的放行后逻辑
注意:
为什么是按照A、B,而不是B、A呢?
你以为我瞎说的?其实不然,**排序方式即为按照字符串排序,**先后执行。就是字符串排序小的限制性。
由上面的流程图可知,浏览器会按照DemoFilter01 DemoFilter02 的方式 访问过滤器链,所以我们配置了两个过滤器类。
@WebFilter("/index.jsp") public class DemoFilter01 implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("DemoFilter01 init......."); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("1.DemoFilter01 doFilter....."); chain.doFilter(request,response); System.out.println("5.DemoFilter01 doFilter end....."); } @Override public void destroy() { System.out.println("DemoFilter01 destory...."); } }
@WebFilter("/index.jsp") public class DemoFilter02 implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("DemoFilter02 init......"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("2.DemoFilter02 doFilter...."); chain.doFilter(request,response); System.out.println("4.DemoFilter02 doFilter end...."); } @Override public void destroy() { System.out.println("DemoFilter02 destory....."); } }
<html> <body> <h2>Hello World!</h2> <% System.out.println("3. index.jsp ......"); %> </body> </html>
效果图如下:
@WebListener public class DemoListener01 implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { System.out.println("contextInitialized...."); } @Override public void contextDestroyed(ServletContextEvent sce) { System.out.println("contextDestroyed...."); } }
当启动Tomcat的时候,会自动调用!
ntln(“contextInitialized…”);
}
@Override public void contextDestroyed(ServletContextEvent sce) { System.out.println("contextDestroyed...."); }
}
当启动Tomcat的时候,会自动调用!
![image-20220916172910166](https://img-blog.csdnimg.cn/img_convert/7d4ee33099f9d23fddadcfc5140ab6f4.png)