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处理之后,返回的顺序是从最后一个开始进行返回,直到返回给客户端。