每當發出請求時,我都需要獲取請求 URI 以進行一些內部計算。一段時間以來,我一直在這樣做:t
public Mono<Response> example(ServerHttpRequest req) { ... }
然后使用req.getURI(). 但是,一旦您需要多次傳遞它,這就會變得很痛苦。我需要 URI 物件從中提取scheme, schemeSpecificPart, host, port。
有沒有辦法在不從請求中提取它們的情況下獲取這些屬性?
UPD:我看到對于 Web MVC,有一些方便的方法可以檢索請求 URI。但是對于反應式堆疊(netty),我需要相同的東西。
uj5u.com熱心網友回復:
它可以通過創建WebFilter放入ServerHttpRequest來實作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();
}
}
參考
uj5u.com熱心網友回復:
你可以試試這個:
public Mono<Response> example(WebRequest request){
System.out.println(request.getDescription(false));
.......
}
您可以在 getDescription 中將此 false 設定為 true,因為 false 只會給您 Uri,我認為這是您唯一需要的。
uj5u.com熱心網友回復:
您可以將其注入任何 bean。
@Autowired
private HttpServletRequest request;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/511711.html
