0%

Spring系列之SpringWebFlux

Basic Knowledge

Http请求的总入口

org.springframework.web.reactive.DispatcherHandler.handle

HandlerFunction vs RouterFunction

参考自:https://www.baeldung.com/spring-5-functional-web

HandlerFunction

1
2
3
4
@FunctionalInterface
public interface HandlerFunction<T extends ServerResponse> {
Mono<T> handle(ServerRequest request);
}

这个接口的实现其实类似servlet,如果和标准的Servlet.service(ServletRequest req, ServletResponse res)比对的话,HandlerFunction返回的是一个响应,而不是将和Servlet一样,将ServerResponse作为参数,这样子几乎没有副作用,而且更方便测试和重用。

RouterFunction

1
2
3
4
5
6
7
8
9
@FunctionalInterface
public interface RouterFunction<T extends ServerResponse> {
Mono<HandlerFunction<T>> route(ServerRequest request);
// ...
}

public static <T extends ServerResponse> RouterFunction<T> route(
RequestPredicate predicate,
HandlerFunction<T> handlerFunction)

通常使用RouterFunctions.route()来绑定路由和HandlerFunction的实现,可以结合WebTestClient来做测试。

Problem Solution

CSRF Token has been associated to this client

今天出现了个奇葩的前端调用SpringGateway网关的错误,网上搜寻了片刻发现没有别人有过和我类似的案例。
于是我打算从HttpServlet总入口跟进问题,但是我忘了SpringGateway默认是使用SpringWebFlux的,和SpringMVC没有什么关系了。。。
然后全局搜索一下Spring的源码”CSRF Token has been associated to this client”,才意识到要换个入口来跟踪问题。

然而当我把入口换成org.springframework.web.reactive.DispatcherHandler去跟踪发现也不能进入断点,经常一番搜索和研究(因为我对WebFlux基本没用过)
发现是WebFlux的安全校验配置没有放开,为了测试我方面,我暂时先这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@EnableWebFluxSecurity
public class SecurityConfig {

@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
return http
.authorizeExchange()
.anyExchange()
.permitAll()
.and()
.csrf()
.disable()
.build();
}

}

总结得出:当挖掘源码还不能解决的问题,只能硬着头皮翻遍网上的解决方案,如若还不行就只能去通读官方的文档了,当然,有时间和条件还是要先通读官方文档再来上手。