021-拦截器&过滤器&监听器
拦截器
Java里的拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。在AOP(Aspect-Oriented Programming)中拦截器用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。
拦截器以前通常在xml文件里面配置,springboot可以通过@Configuration配置在配置类中。下面演示拦截器。首先创建一个简单的web项目:
然后增加一个接口:
接下来写一个拦截器:
最后添加拦截器并应用到所有的路径:
启动项目,并访问接口:
可以看到控制台打印如下:
下面用拦截器实现一个简单的登录验证,从cookie或者header中获取到token,并验证token,如果验证不通过,跳转到登录页面,下面是拦截器:
重启并访问固定的链接/hello/inceptor,就可以看到拦截器效果,如果想看页面上的输出,可以加一个休眠。
过滤器
Filter也称之为过滤器,它是Servlet技术中最激动人心的技术之一,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp,Servlet, 静态图片文件或静态html文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截,Filter接口源代码:
Filter接口中有一个doFilter方法,当我们编写好Filter,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前,都会先调用一下filter的doFilter方法,因此,在该方法内编写代码可达到如下目的:
调用目标资源之前,让一段代码执行。
是否调用目标资源(即是否让用户访问web资源)。
调用目标资源之后,让一段代码执行。
web服务器在调用doFilter方法时,会传递一个filterChain对象进来,filterChain对象是filter接口中最重要的一个对象,它也提供了一个doFilter方法,开发人员可以根据需求决定是否调用此方法,调用该方法,则web服务器就会调用web资源的service方法,即web资源就会被访问,否则web资源不会被访问。
Filter开发分为2步:
1 编写java类实现Filter接口,并实现其doFilter方法。
2 在web.xml 文件中使用和元素对编写的filter类进行注册,并设置它所能拦截的资源。在springboot中,需要springboot主方法类加入@ServletComponentScan注解。
简单写个例子:
重启项目,可以看到启动和执行都有控制台输出:
监听器
监听器是servlet规范中定义的一种特殊类。用于监听servletContext、HttpSession和servletRequest等域对象的创建和销毁事件。监听域对象的属性发生修改的事件。用于在事件发生前、发生后做一些必要的处理。一般是获取在线人数等业务需求。
写一个简单的例子:
启动和停止就可以看到控制台的输出:
区别
拦截器是基于java的反射机制的,而过滤器是基于函数回调
过滤器依赖与servlet容器,而拦截器不依赖与servlet容器
拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用
拦截器可以访问action上下文、值栈里的对象,而过滤器不能
在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
用途
过滤器,主要的用途是过滤字符编码、做一些业务逻辑判断等。
监听器,做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等
拦截器,在面向切面编程中应用的,就是在你的service或者一个方法前调用一个方法,或者在方法后调用一个方法。是基于JAVA的反射机制
代码地址: https://gitee.com/blueses/spring-boot-demo