spring-boot - 如何使 WebFilter 在非 WebFlux/非反应式 Spring Boot 应用程序中工作?
问题描述
我正在尝试解决这个问题:How to rewrite URLs with Spring (Boot) via REST Controllers? 通过创建某种“过滤器”,该过滤器将应用于每个传入的 HTTP 请求。
这个问题的一些答案涵盖了这个问题:Spring Boot添加Http请求拦截器
,但接口HandlerInterceptor
处理javax' HttpServletRequest
,HttpServletResponse
它不如Spring引入的新类实用,即ServerWebExchange
(参见setLocation()
下面代码中的使用)出现在一个名字听起来很有希望的界面中org.springframework.web.server.WebFilter
:
所以我以类似的方式结束:
@Component
public class LegacyRestRedirectWebFilter implements WebFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
URI origin = exchange.getRequest().getURI();
String path = origin.getPath();
if (path.startsWith("/api/")) {
ServerHttpResponse response = exchange.getResponse();
response.setStatusCode(HttpStatus.MOVED_PERMANENTLY);
URI location = UriComponentsBuilder.fromUri(origin).replacePath(path.replaceFirst("/api/", "/rest/")).build().toUri();
response.getHeaders().setLocation(location);
}
return chain.filter(exchange);
}
}
...以同样的方式人们正在做类似的事情:
唉,我的过滤器从来没有被调用过!!!
问题是:我不在“WebFlux”上下文中(与上述问题相反),因为:
- 我不需要,而且
- 我尝试并遇到了以下问题:
当我们在类路径中有 spring-boot-starter-web 依赖项时,Reactive Webfilter 不起作用(但没有明确的答案);标记的重复项: 不 spring-boot-starter-web 和 spring-boot-starter-webflux 一起工作?
具有传统 Web 安全性的 Spring WebFlux(我的“传统”
spring-boot-starter-security
依赖项在我的pom.xml
加上一个@Configuration
扩展类WebSecurityConfigurerAdapter
- 但不愿意将其迁移到......顺便说一句?)
另外我不明白为什么我需要在 WebFlux 上下文中,因为org.springframework.web.server.WebFilter
既不处理reactive
也不处理Webflux
,对吧?..或者是吗?这在 Javadoc 中不是很清楚。
解决方案
事实上,我没有找到WebFilter
在非 WebFlux 上下文中工作的方法,但我可以成功实现这样的过滤器,它既实现了javax.servlet.Filter
(非反应式)又实现了(org.springframework.web.server.WebFilter
反应式)。
这是我对另一个相关问题的回答:https ://stackoverflow.com/a/63780659/666414
推荐阅读
- django - 我如何告诉 Django 永远不要使用(并且完全忽略)SqlLite?
- python - python regex 将模式与 AND 和 group 结合起来
- asp.net - 令牌处理程序无法将令牌转换为 jwt 令牌
- javascript - ASP.NET MVC 在部分视图和主机视图中的脚本之间共享数据
- python - 使用列值删除部分重复行
- r - 通过R中的大数据框根据间隔对行进行分组
- shopify - Shopify - 带参数的产品过滤器
- javascript - 连接四个游戏逻辑
- html - 响应式标头断点
- javascript - 刷新时如何使用 select onchange 保留值?