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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容