购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

6.1 Spring Boot使用过滤器Filter

6.1.1 过滤器Filter介绍

过滤器英文名称为Filter,是处于客户端与服务器资源文件之间的一道过滤网,它是Servlet技术中最激动人心的技术之一。Web开发人员通过Filter技术管理Web服务器的所有资源,例如JSP、Servlet、静态图片文件或静态HTML文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

Filter接口源代码如下:

Filter的创建和销毁由Web服务器负责。Web应用程序启动时,Web服务器将创建Filter的实例对象,并调用其init方法,读取web.xml配置,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(Filter对象只会创建一次,init方法也只会执行一次)。开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。

当客户请求访问与过滤器关联的URL时,过滤器将先执行doFilter方法。FilterChain参数用于访问后续过滤器。Filter对象创建后会驻留在内存,当Web应用移除或服务器停止时才销毁。在Web容器卸载Filter对象之前destroy被调用。该方法在Filter的生命周期中仅执行一次。在这个方法中,可以释放过滤器使用的资源。

Filter可以是有很多个,当一个个Filter组合成起来,就形成了一个FilterChain,也就是我们说的过滤链,具体如图6-1所示。

图6-1 Filter链

FilterChain的执行顺序遵循先进后出的原则:当Web客户端发送一个Request请求的时候,这个Request请求会先经过FilterChain,由它利用dofilter()方法调用各个子Filter,至于子Filter的执行顺序如何,则要看客户端是如何制定规则的。当Request请求被第一个Filter处理之后,又通过dofilter()往下传送,被第二个、第三个……Filter截获处理。当Request请求被所有的Filter处理之后,返回的顺序是从最后一个开始进行返回,直到返回给客户端。

6.1.2 过滤器Filter的使用

在Spring Boot中使用Filter过滤器很简单。首先在项目spring-boot-book-v2的目录/src/main/java/com.example.demo.filter下新建AyUserFilter.java类,具体代码如下:

AyUserFilter.java类开发完成之后,我们需要在入口类DemoApplication.java中添加注解@ServletComponentScan,具体代码如下:

事实上,在Spring Boot中添加自己的Servlet、Filter和Listener有两种方法,代码注册和注解自动注册。上面已经讲解了如何用注解自动注册,而代码注册可以通过ServletRegistrationBean、FilterRegistrationBean和ServletListenerRegistrationBean注册Bean。虽然条条大路通罗马,但是希望大家先掌握一种方式,一路走到底,而不是纠结于会有几种写法。

6.1.3 测试

6.1.2节代码开发完成之后,重新启动运行spring-boot-book-v2项目时,Web容器会初始化AyUserFilter对象,并调用init方法,可以在Intellij IDEA控制台看到打印信息,如图6-2所示。在浏览器输入http://localhost:8080/ayUser/test访问应用时,AyUserFilter拦截器会拦截本次的请求,并调用doFilter方法,同时会在控制台打印信息,如图6-3所示。

图6-2 初始化调用init方法打印信息

图6-3 拦截调用doFilter方法打印信息 gGJ+R9XqrHdx0alVFRBUqwNGllAPf3SPRebZ0aAODNpzI4C2laYdvaz960bd7W91

点击中间区域
呼出菜单
上一章
目录
下一章
×