这篇文章主要为大家详细介绍了Java中的过滤器Filter和监听器Listener的使用以及二者的区别,文中的示例代码讲解详细,需要的可以参考一下
1 Filter
1.1 Filter简介
- Filter表示过滤器,是JavaWeb三大组件(Servlet、Filter、Listener)之一。
- 过滤器可以把资源的请求拦截下来,从而实现一些特殊的功能。
- 过滤器一般完成一些通用的操作,比如权限控制、统一编码处理、敏感字符处理等等
- Filter流程图
1.2 Filter的快速入门
Filter和Servlet很相像,步骤也是一样的。
1.2.1 创建Filter类
- 新建一个Filter.java文件,实现Filter接口
- 实现接口后,重写其三个方法
- 其中都chain.doFilter()是放行的方法
- inti、和destory都是生命周期的函数
- @WebFilter()配置的是拦截的路径,当访问这个路径的时候,Filter会被调用
注意:此处导入的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....");
}
}
1.2.2 访问index.jsp
由上图分析所致,当我们访问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中,是重头执行还是执行放行后的逻辑呢?
放行后的逻辑
1.3 Filter的拦截路径的配置
配置在**@WebFilter(“”)**中,主要有以下四类
- 拦截具体的资源路径:/index.jsp,只有访问index.jsp的时候才会被拦截
- 目录拦截:/user/*,访问/user下的所有资源,都会被拦截
- 后缀名拦截:*.jsp 访问后缀名为jsp的资源,都会被拦截
- 拦截所有:/* 访问所有的资源,都会被拦截
1.4 过滤器链
1.4.1 过滤器链简介
一个web路径,可以配置多个过滤器,这多个过滤器就被称为过滤器链。
流程图如下:
见图知意:
当web应用有一个A一个B过滤器组成的过滤器链时,A放行后,会来到B过滤器。只有两个过滤器都放行,才会访问到相应的资源。随后,按照怎么来的,怎么返回的方式,执行B、A的放行后逻辑
注意:
为什么是按照A、B,而不是B、A呢?
你以为我瞎说的?其实不然,**排序方式即为按照字符串排序,**先后执行。就是字符串排序小的限制性。
1.4.2 过滤器链的例子
由上面的流程图可知,浏览器会按照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>
效果图如下:
2 Listener
2.1 概念
- Listener表示监听器,是JavaWeb三大组件之一。
- 监听器可以监听就是在application,session,request三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件。
- Listener分类:Javaweb提供了8个监听器(接口)
2.2 监听器的使用
@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)
到此这篇关于Java Web开发中过滤器和监听器使用详解的文章就介绍到这了,更多相关JavaWeb过滤器和监听器内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
本文标题为:Java Web开发中过滤器和监听器使用详解
基础教程推荐
- ConditionalOnProperty配置swagger不生效问题及解决 2023-01-02
- java基础知识之FileInputStream流的使用 2023-08-11
- java实现多人聊天系统 2023-05-19
- Java数据结构之对象比较详解 2023-03-07
- springboot自定义starter方法及注解实例 2023-03-31
- Java实现线程插队的示例代码 2022-09-03
- JDK数组阻塞队列源码深入分析总结 2023-04-18
- Java文件管理操作的知识点整理 2023-05-19
- Java并发编程进阶之线程控制篇 2023-03-07
- Java实现查找文件和替换文件内容 2023-04-06