主页>技术知识>详情

如何在gateway 中获取 webflux的 RequestContextHolder

villain/2022-02-23/105阅读 /0评论
如何在gateway 中获取 webflux的 RequestContextHolder简介:spring mvc中可以这样拿到request ServletRequestAttributes attrs = (ServletRequestAttributes) RequestCont

如何在gateway 中获取 webflux的 RequestContextHolder

spring mvc中可以这样拿到request

 

ServletRequestAttributes attrs = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();

 

HttpServletRequest request = attrs.getRequest();

那么 请问如何在gateway 中获取 webflux的 request 或其上下文. 

我其实想在spring gateway中调用子组件的一个reset方法(但需要当前请求的header),在zuul中可以这样把header传递出去.但用了gateway就不知道如何操作了.

@Component
public class SecuringRequestInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder
                .getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        Enumeration<String> headerNames = request.getHeaderNames();
        if (headerNames != null) {
            while (headerNames.hasMoreElements()) {
                String name = headerNames.nextElement();
                String values = request.getHeader(name);
                requestTemplate.header(name, values);
            }
        }
    }
}

解决方法:
@GetMapping("/test2")
@ResponseBody
public Mono<String> test2() {
	WebClient webClient = testClient();
	return webClient.get().uri("").retrieve().bodyToMono(String.class);
}

@Bean
public WebClient testClient() {
	return WebClient.builder()
		.filter(testFilterFunction())
		.baseUrl("https://www.baidu.com")
		.build();
}

private ExchangeFilterFunction testFilterFunction() {
	return (request, next) -> ReactiveRequestContextHolder.getRequest()
		.flatMap(r -> {
			ClientRequest clientRequest = ClientRequest.from(request)
				.headers(headers -> headers.set(HttpHeaders.USER_AGENT, r.getHeaders().getFirst(HttpHeaders.USER_AGENT)))
				.build();
			return next.exchange(clientRequest);
		});
}

换 WebClient,亲测好用,可以的话帮我 #mica# 码云点个 star 哦~


大佬你好,我在gateway项目中参考你的方法,结果在调用 `ReactiveRequestContextHolder.getRequest()` 的方法是报错 `Context is empty` ,请问你清楚这是怎么回事嘛
怎么换啊,有点没看懂,feignclient是通过注解来调用其他的服务啊
回复 @如梦技术 : 期待.主要是应用场景.
回复 @烨儿 : 比如说 spring boot 环境划分, url 和 header 版本,异常的统一处理,未知异常发送事件(方便监听并通知),常用的一些工具类等,里面的感觉很多东西我得录几集视频才能跟大家讲清楚 /(ㄒoㄒ)/~~
回复 @如梦技术 : 我也是做企业级管理软件开发的,比如OA,项目管理等,也在用spring cloud 是否能用你这个工具集合?能做到哪些事情呢?

#mica#里实现了这个功能,你可以参考:https://gitee.com/596392912/mica/tree/master/mica-boot/src/main/java/net/dreamlu/mica/reactive/context

使用:https://gitee.com/596392912/mica/blob/master/mica-boot/src/main/java/net/dreamlu/mica/reactive/error/MicaExceptionTranslator.java#L60


引用来自“如梦技术”的评论

#mica#里实现了这个功能,你可以参考:https://gitee.com/596392912/mica/tree/master/mica-boot/src/main/java/net/dreamlu/mica/reactive/context

使用:https://gitee.com/596392912/mica/blob/master/mica-boot/src/main/java/net/dreamlu/mica/reactive/error/MicaExceptionTranslator.java#L60


楼主在图中这地方能拿到数据吗?
回复 @如梦技术 : 确定是不行了是吧?
换 WebClient 吧 /(ㄒoㄒ)/~~
我感觉用 RequestTemplate 可能不行,建议用 WebClient。稍等哈,我写个试试看看。

亲,gateway 中获取 webflux的 request 或其上下文,结果是怎么处理啊。


请问作者,这个问题最后是如何解决的呢,我现在也遇到这个问题

本文用户投稿或网站收集转载,如有侵权请联系本站。