有没有办法在Spring中获取请求URI?

9cbw7uwe  于 2022-10-30  发布在  Spring
关注(0)|答案(3)|浏览(232)

无论何时发出请求,我都需要获取请求URI以进行一些内部计算。一段时间以来,我一直这样做:

public Mono<Response> example(ServerHttpRequest req) { ... }

然后使用req.getURI(),但一旦需要多次传递它,这就变得很麻烦了。我需要URI对象来从中提取schemeschemeSpecificParthostport
有没有一种方法可以在不从请求中提取这些属性的情况下获取它们?

UPD:我发现Web MVC有一些方便的方法来检索请求URI。但我需要相同的方法来检索React堆栈(netty)。

eqqqjvef

eqqqjvef1#

可以通过创建WebFilterServerHttpRequest放入Context中来实现:

@Component
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE)
public class ReactiveRequestContextFilter implements WebFilter {
  @Override
  public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
    ServerHttpRequest request = exchange.getRequest();
    return chain
        .filter(exchange)
        .contextWrite(ctx -> ctx.put(ReactiveRequestContextHolder.CONTEXT_KEY, request));
  }
}

此外,创建提供对请求数据的静态访问的类:

public class ReactiveRequestContextHolder {
  public static final Class<ServerHttpRequest> CONTEXT_KEY = ServerHttpRequest.class;

  public static Mono<ServerHttpRequest> getRequest() {
    return Mono.deferContextual(Mono::just).map(ctx -> ctx.get(CONTEXT_KEY));
  }

  public static Mono<URI> getURI() {
    return getRequest().map(HttpRequest::getURI);
  }
}

方法可以通过类名直接访问,而不必示例化它们。只是要注意不要在过滤器执行之前访问它。
用法示例:

@RestController
@RequestMapping
public class TestController {
  @GetMapping("/test")
  public Mono<URI> test() {
    return ReactiveRequestContextHolder.getURI();
  }
}

参考文献

vq8itlhq

vq8itlhq2#

您可以尝试以下操作:

public Mono<Response> example(WebRequest request){
           System.out.println(request.getDescription(false));
        .......
    }

你可以在getDescription中把false变成true,因为false只会给予你URI,我认为这是你唯一需要的。

64jmpszr

64jmpszr3#

你可以把它注射到任何一个豆子里。

@Autowired
private HttpServletRequest request;

相关问题