美文网首页SpringBoot学习
021-拦截器&过滤器&监听器

021-拦截器&过滤器&监听器

作者: 郭艺宾 | 来源:发表于2018-07-03 18:55 被阅读5次

拦截器

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

相关文章

网友评论

    本文标题:021-拦截器&过滤器&监听器

    本文链接:https://www.haomeiwen.com/subject/vhvjuftx.html