Spring Boot-Filter过滤器使用

Spring Boot-Filter过滤器使用,第1张

1、基础准备

2、编写Filter

此处我们重点关注 doFilter方法 ,编写实现类重写该方法。

Ⅰ 在自定义Filter实现类上使用@WebFilter注解

Ⅱ 自定义filterName(随意,不要与其他Filter重复即可);

Ⅲ 定义urlPatterns此处设置为"/*",表示拦截所有请求;

Ⅰ 将传入的 request 与 response 对象转换为 Http类型 ;

Ⅱ 自定义不需要处理的URI数组

Ⅲ 获取请求URI

Ⅳ 判断本次请求

封装checkURI方法,如下:

a、注入PATH_MATCHER,用于路径比较,如下:

b、方法体,如下:

Ⅴ 不需要拦截,则直接放行

Ⅵ 其余路径,判断登录状态

a、已登录,则放行

BaseContext是自定义存储线程userId的类

b、未登录,拦截

自定义常量

拦截,此处使用response向前端返回响应数据R.error(NOT_LOGIN)

3、扫描Filter

在启动类上添加 @ServletComponentScan注解 ,用于扫描 @WebFilter 注解 ,如下:

4、测试

编写Controller类,启动测试。

以上即为Filter基础使用的内容,感谢阅读。

Filter是request/response执行过滤任务的对象,资源可以是一个servlet或者静态资源。Filter在 doFilter 方法中执行过滤逻辑。每个Filter都有一个FilterConfig对象,可以从FilterConfig对象获取初始化参数和ServletContext引用。

Filter工作在客户端和Servlet之间,可以对客户端request以及服务器的response进行处理,基于此Filter可以用于实现以下功能:

定义一个Filter需要 javax.servlet.Filter 接口, Filter 有如下三个方法:

下面定义一个简单的Filter,在 init() 方法中初始化Filter的名字,在 doFilter 方法中简单的记录Filter被调用, destroy() 简单的记录方法被调用。

FirstFilter:

在完成Filter的创建后,还需要将Filter注册到Web容器(添加到Filter chain)才能对request/response进行过滤。在Spring Boot中注册Filter非常简单,下面是一个简单注册Filter的样例:

启动Spring Boot并调用一个测试接口,测试接口可从 这里 获取。

应用的输出如下:

从输出中可以看出Filter完成了初始化,Filter的名字是“first filter”。

如果定义了多个Filter,并期望request/response可以按照设定的顺序依次经过各个Filter(例如:request需要先经过鉴权Filter,鉴权通过后再进入参数校验Filter等),这种情况如何保证Filter的执行顺序呢?在注册Filter的时候可以给每个Filter设置一个数字表示的order,值越小Filter在chain中的位置越靠前。为了严重Filter的执行顺序,我们定义第二个Filter:SecondFilter,源码可从 这里 获取。然后将两个Filter添加到Web容器中:

启动Spring Boot并调用一个测试接口,测试接口可从 这里 获取。

应用的输出如下:

request依次经过first filter ->second filter,response依次经过second filter - >first filter,Filter的执行顺序满足我们的期望。

通过上面学习的知识,我们实现一个鉴权的Filter。假设客户端访问资源时需要在请求的header中携带两个参数:user和password(生成环境携带账号密码是十分危险的,应该考虑基于Token的鉴权),如果有一个参数没有携带则返回客户端错误的请求(400 Bad Request),如果user和password不匹配或系统不存在用户则返回无权访问 (403 Forbidden)。客户端每成功一次,系统都会记录用户的访问次数。

Filter的实现如下:

过滤步骤:

完整的源码可以从 这里 获取。

在实际的web应用程序中,经常需要在请求(request)外面增加包装用于:记录调用日志、排除有XSS威胁的字符、执行权限验证等等。除了上述提到的之外,Spring Boot自动添加了OrderedCharacterEncodingFilter和HiddenHttpMethodFilter,并且我们在自己的项目中还可以增加别的过滤器

Spring Boot、Spring Web和Spring MVC等其他框架,都提供了很多servlet 过滤器可使用,我们需要在配置文件中定义这些过滤器为bean对象。现在假设我们的应用程序运行在一台负载均衡代理服务器后方,因此需要将代理服务器发来的请求包含的IP地址转换成真正的用户IP。Tomcat 8 提供了对应的过滤器:RemoteIpFilter。通过将RemoteFilter这个过滤器加入过滤器调用链即可使用它。

How Do

一般在写简单的例子时,不需要单独定义配置文件,只需要将对应的bean对象定义在Application类中即可。正式的项目中一般会有单独的web配置文件,我们在项目的com.test.bookpub(与BookpubApplication.java同级)下建立WebConfiguration.java文件,并用@Configuration注解修饰。

package com.test.bookpub

import org.apache.catalina.filters.RemoteIpFilter

import org.springframework.context.annotation.Bean

import org.springframework.context.annotation.Configuration

@Configuration

public class WebApplication {

@Bean

public RemoteIpFilter remoteIpFilter() {

return new RemoteIpFilter()

}

}

通过mvn spring-boot:run启动项目,可以在终端中看到如下的输出信息,证明RemoteIPFilter已经添加成功。

RemoteIPFilter

分析

项目的主类——BookPubApplication,可以看到由@SpringBootApplication注解修饰,这包含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。在Spring Boot的自动配置、Command-line Runner一文中曾对这个三个注解做详细解释,@ComponentScan让Spring Boot扫描到WebConfiguration类并把它加入到程序上下文中,因此,我们在WebApplication中定义的Bean就跟在BookPubApplication中定义一样。

方法@Beanpublic RemoteIpFilter remoteIpFilter() { ... }返回一个RemoteIPFilter类的spring bean。当Spring Boot监测到有javax.servlet.Filter的bean时就会自动加入过滤器调用链。从上图中还可以看到,该Spring Boot项目一次加入了这几个过滤器:characterEncodingFilter(用于处理编码问题)、hiddenHttpMethodFilter(隐藏HTTP函数)、httpPutFormContentFilter、requestContextFilter(请求上下文),以及我们刚才自定义的RemoteIPFilter。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11400653.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存