spring5 webflux模块中的webfilter模型与其他过滤器或拦截器是类似的,众多filter可以组成过滤链,过滤器链的图示就不画了。
webflux filter目前没有servlet filter中的url pattern功能,它对所有请求进行过滤,如果要实现url pattern可以自己在过滤器中匹配url。
过滤器的调用顺序
如果有多个webflux webfliter,那其调用的先后顺序如何确定?在过滤链中的调用顺序遵循如下规则:
1.webfilter实现类上有@Order注解的排在没有该注解的前面.
2. 对有@Order注解的webfliter,order值(为有符号的int)小的排在前面。
3. 对没有@Order注解的,按实现类的全限定类名(含有包名)的字典序升序排列。
4. 过滤器也是spring bean,绝大多数情况下是单例,如果不是单例,这些实例之间
调用顺序估计按照实例化的时间先后排列。
webfliter实现
webflux中的filter要实现org.springframework.web.server.WebFilter接口,该接口只有一个方法filter。
两个过滤器实现:RequestFilter1和RequestFilter2.
@Component
@Order(-5)
public class RequestFilter1 implements WebFilter {
@Override
//返回Mono<Void> 表示该过滤器的处理已经结束。
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
/*ServerWebExchange寓意交换/兑换(exchange):用请求换回响应. 所以ServerWebExchange包含有成对的http请求对象ServerHttpRequest和http响应对象ServerHttpResponse.
ServerHttpRequest是webflux controller中的http请求对象,类似webmvc中的HttpServletRequest
*/
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
//获取请求http头appKey值
String appKey = request.getHeaders().getFirst("appKey");
System.out.println("appKey="+appKey);
//添加请求属性key和value
exchange.getAttributes().put("k1", "v1");
/*过滤器链的概念都是类似的,调用过滤器链的filter方法将请求转到下一个filter,如果该filter是最后一 个filter,那就转到
该请求对应的handler,也就是controller方法或函数式endpoint */
return chain.filter(exchange);
}
}
}
@Component
//@Order(1)
public class RequestFilter2 implements WebFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
// 获取上个filter设置的属性k1
String value = (String)exchange.getAttributes().get("k1");
System.out.println("value="+value);
return chain.filter(exchange);
}
}
}
过滤器的通常用法
过滤器通常用来实现一些横切的逻辑,例如认证授权、日志记录。
下面的过滤器检查http请求头中是否有token头,如果没有则将请求forward转到/auth/error,由对应的controller进行处理。这个也演示了如何用WebFilter来forward请求。
@Component
public class AuthFilter implements WebFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
//ServerHttpResponse response = exchange.getResponse();
String tokenValue = request.getHeaders().getFirst("token");
if(null == token){
/*http头中没有appKey,修改请求的目标url为/auth/error
request.mutate返回一个请求构建器(builder design pattern),path方法修改请求的url,build方法返回新的request
最后调用chain.filter将请求forward到修改后的url:/auth/error
*/
ServerHttpRequest authErrorReq = request.mutate().path("/auth/error").build();
//erverWebExchange.mutate类似,构建一个新的ServerWebExchange
ServerWebExchange authErrorExchange = exchange.mutate().request(authErrorReq).build();
return chain.filter(autherrorExchange);
}
else{
return chain.filter(exchange);
}
}
}
}
也可在过滤器中直接处理请求,跳过后面的filter和controller
@Component
public class AuthFilter implements WebFilter {
@Override
public Mono<Void> filter(ServerWebExchange serverWebExchange, WebFilterChain webFilterChain) {
ServerHttpRequest request = serverWebExchange.getRequest();
ServerHttpResponse response = serverWebExchange.getResponse();
String tokenValue = request.getHeaders().getFirst("token");
if(null == token){
// 直接返回响应结果,跳过后面的filter和controller
response.setStatusCode(HttpStatus.OK);
response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
return response.writeWith(Mono.just(response.bufferFactory().wrap("{\"msg\":\"no token\"}".getBytes())));
}
else {
return webFilterChain.filter(serverWebExchange);
}
}
}
}
过滤器后处理
前面的演示都还是前处理,在后面的filter完成之后,控制流回到本filter。
可以在WebFilterChain的filter方法后面加入后处理逻辑,这个要熟悉spring reactor3的运算符/算子(operator), 例如doFinally、then、thenEmpty、thenMany、map、flatMap等,后处理逻辑分布在这些运算符中,只要最终返回Mono<Void>即可。
@Component
public class PostProcessingFilter implements WebFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
//后处理,打印完成信号的值
return chain.filter(exchange).doFinally(s -> System.out.println("signal="+s.toString()));
/* 其他几种
* or 1: 建议尽量采用链式的fluent连贯写法
* Mono<Void> completeMono = chain.filter(exchange);
* return completeMono.doFinally(s -> System.out.println("signal="+s.toString()));
*/
//or 2: return chain.filter(exchange).thenEmpty(other);
//or 3: return chain.filter(exchange).thenMany(other).map(..)....then();
}
}
相关推荐
以上就是Spring WebFlux的基本使用和关键概念,结合提供的"boot-webflux"项目,你可以进一步探索更多细节,包括路由定义、过滤器、中间件、自定义异常处理、反应式数据访问等功能,从而全面掌握Spring WebFlux在实际...
**Spring WebFlux 演示项目** Spring WebFlux 是 Spring Framework 的一个模块,它引入了一种响应式编程模型,用于构建非阻塞式的Web应用程序。与传统的基于Servlet的Spring MVC不同,WebFlux旨在优化性能,提高...
此外,WebFilter接口用于实现过滤器功能,可以进行请求预处理和响应后处理。 3. **RouterFunction与Controller** 在Spring WebFlux中,你可以使用传统的注解式Controller或者函数式编程的RouterFunction来定义路由...
首先,SpringCloud是基于Spring Boot的微服务治理框架,它提供了包括服务注册与发现、负载均衡、熔断器、配置中心、API Gateway等一系列功能,使得构建分布式系统变得更加简单。在本项目中,我们将利用Eureka进行...
- `WebFilter`:过滤器接口,允许在请求和响应处理链中插入自定义逻辑。 - `WebSession`:提供了会话管理功能,与传统Web应用中的session类似,但设计上更适合非阻塞环境。 4. **非阻塞I/O与反应式堆栈** Spring...
使用JWT与Spring WebFlux和Spring Security Reactive进行身份验证和授权首先阅读的好文档在开始之前,我建议您先阅读下一份参考启用Spring WebFlux安全性在你的应用程序首先使Webflux安全@EnableWebFluxSecurity...
而Spring Cloud Gateway作为一个API网关,集成了路由、过滤器等功能,可以统一处理跨服务的请求和响应,简化了微服务间的通信。 在数据访问层面,Spring Data JPA为开发者提供了便捷的方式来操作关系型数据库,如...
本文将深入探讨如何在Spring Cloud Gateway中自定义全局过滤器。 首先,我们需要了解Spring Cloud Gateway的基本架构。Gateway基于Spring Framework 5、Project Reactor和Spring WebFlux构建,它提供了一种高效且...
- 类似于Spring MVC的拦截器,WebFlux提供了过滤器机制,可以在请求处理前后进行拦截,如日志记录、安全检查等。 4. **WebFlux配置**: - 可以通过`WebFluxConfigurer`接口自定义配置,如设置编码解码器、路由...
在处理HTTP请求时,Spring WebFlux提供了过滤器(Filter)和拦截器(Interceptor)机制,以实现统一的请求预处理和后处理。`WebFilter`和`WebHandler`接口分别对应于Spring MVC的Filter和Handler。 此外,错误处理...
`WebFilter`是WebFlux中的过滤器概念,类似于Servlet API中的`Filter`,它允许你在处理链中对请求和响应进行拦截。 以下是一个示例`WebFilter`实现,用来获取客户端IP: ```java @Component public class ...
Spring WebFlux是Spring框架的一个重要模块,专为构建反应式Web应用程序而设计。它引入了一种非阻塞、事件驱动的编程模型,用于处理高并发场景,优化服务器资源利用率。在本文中,我们将深入探讨Spring WebFlux REST...
在Spring WebFlux中,路由和过滤器是通过`RouterFunction`和`FilterFunction`来定义的。例如,我们可以创建一个路由函数来处理用户相关的请求: ```java @Bean public RouterFunction<ServerResponse> route...
2. `WebFluxConfigurer`:这是用来配置WebFlux的接口,可以设置路由、过滤器等。 3. `Mono` 和 `Flux`:Reactor中的核心类型,它们代表了可能的单个值或多个值的异步序列。 4. `ControllerAdvice`:类似于Spring MVC...
1.本项目为SpringCloud ...2.由于Gateway采用的是纯Webflux方式,所以原有的Spring基于传统拦截器、过滤器的方式无法正常使用SpringSecurity。 3.因此,本项目根据WebFlux的方式,进行了整合,实现了登录和权限验证。
3. **路由和过滤器**:Spring WebFlux使用`RouterFunction`来定义路由规则,它可以匹配HTTP请求并将其转发给适当的处理函数。同时,`FilterFunction`可以用来对请求和响应进行拦截和修改,实现类似于Spring MVC的...
6. **路由和过滤器**: 在Spring WebFlux中,我们可以定义路由函数来映射HTTP请求到处理函数。同时,过滤器用于在请求处理链中执行预处理和后处理任务,如身份验证、日志记录等。 7. **数据库集成**: 虽然描述中未...
- WebFilter和WebExceptionHandler:处理过滤器和异常处理,与Spring MVC中的拦截器和异常处理器类似。 3. 执行流程: - 客户端发起请求,到达Reactor Netty或Undertow等服务器。 - WebFlux的ServerWebExchange...
它们是反应式版本的 Spring MVC 过滤器和异常处理器。 4. **Reactive Data Access**: Spring Data 的反应式模块(如 Spring Data R2DBC)可以与 WebFlux 结合使用,提供非阻塞的数据访问,如数据库操作。这有助于...
过滤器链分为"pre"和"post"两部分,先执行所有"pre"过滤器,然后执行"post"过滤器。 配置路由、谓词和过滤器可以通过YAML或properties文件进行,有两种方式:简写和完全展开。简写方式直接使用过滤器名称和参数值,...