我正在使用Spring Webflux,我通过这种方式处理网络过滤器中的会话:
public class DemoFilter implements WebFilter {
@Override
public Mono<Void> filter(final ServerWebExchange serverWebExchange, final WebFilterChain webFilterChain) {
WebSession webSession = serverWebExchange.getSession().block();
webSession.getAttributes().put("attribute", attributeValue);
return webFilterChain.filter(serverWebExchange);
}
}
我想删除block()
指令并以非阻塞方式获取会话,所以我尝试了这个:
public class DemoFilter implements WebFilter {
@Override
public Mono<Void> filter(final ServerWebExchange serverWebExchange, final WebFilterChain webFilterChain) {
return serverWebExchange.getSession()
.doOnNext(webSession -> {
webSession.getAttributes().put("attribute", attributeValue);
}).then(webFilterChain.filter(serverWebExchange));
}
}
从功能上讲,此代码与上面的代码一样,但它似乎导致会话在测试环境(文件描述符警报)上部署时不会关闭和累积。
这是我的项目上下文:Spring Boot 2.0.0.RELEASE,Tomcat,Webclient连接池已禁用(也导致会话未关闭)。
我在这个实现中做错了吗?很难找到WebFilters的例子,而不仅仅是操纵HTTP头。