如何在gateway 中获取 webflux的 RequestContextHolder

烨儿 发布于 2019/04/03 18:35
阅读 1K+
收藏 0

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);
            }
        }
    }
}
加载中
0
如梦技术
如梦技术
@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 哦~

T
TRY_To_TRY
怎么换啊,有点没看懂,feignclient是通过注解来调用其他的服务啊
烨儿
烨儿
回复 @如梦技术 : 期待.主要是应用场景.
如梦技术
如梦技术
回复 @烨儿 : 比如说 spring boot 环境划分, url 和 header 版本,异常的统一处理,未知异常发送事件(方便监听并通知),常用的一些工具类等,里面的感觉很多东西我得录几集视频才能跟大家讲清楚 /(ㄒoㄒ)/~~
烨儿
烨儿
回复 @如梦技术 : 我也是做企业级管理软件开发的,比如OA,项目管理等,也在用spring cloud 是否能用你这个工具集合?能做到哪些事情呢?
如梦技术
如梦技术
回复 @烨儿 : 简单的可以理解为抽取了一些工具类,然后就是对 Spring boot 一些通用功能做了一点封装,这方面的开源比较少~ 里面其实是有蛮多细节的处理,都是企业开发里总结的经验。
下一页
0
烨儿
烨儿

非常感谢!但我还是有个疑问:
如何将mono的header信息放到 新的RequestTemplate里面去呢?

@Bean
public RequestInterceptor headerInterceptor() {
    return new RequestInterceptor() {
        @Override
        public void apply(RequestTemplate requestTemplate) {
             String abc="";
            Mono<ServerHttpRequest> requestMono = Mono.subscriberContext()
                    .map(ctx -> ctx.get(CONTEXT_KEY))
                    .cast(ServerHttpRequest.class);
           
            requestMono.doOnSuccess(r -> {
                HttpHeaders headers = r.getHeaders();
               //是在此处拿header数据吗? 这样写好像不对.
            });
        }
    };
}
应不识
应不识
楼主在图中这地方能拿到数据吗?
烨儿
烨儿
回复 @如梦技术 : 确定是不行了是吧?
如梦技术
如梦技术
换 WebClient 吧 /(ㄒoㄒ)/~~
如梦技术
如梦技术
我感觉用 RequestTemplate 可能不行,建议用 WebClient。稍等哈,我写个试试看看。
0
O
OLESHI

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

返回顶部
顶部