Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gateway webflux 装饰器模式下提示未成功初始化上下文 #121

Closed
llm163520 opened this issue Aug 15, 2021 · 7 comments
Closed

Comments

@llm163520
Copy link

error
参考图例
伪代码
@OverRide
public Mono filter(ServerWebExchange exchange, WebFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
Long requestStartTime = System.currentTimeMillis();
ServerRequest serverRequest = ServerRequest.create(exchange, codecConfigurer.getReaders());
Mono modifiedBody = serverRequest.bodyToMono(String.class).flatMap(body -> Mono.just(body));
BodyInserter bodyInserter = BodyInserters.fromPublisher(modifiedBody, String.class);
HttpHeaders headers = new HttpHeaders();
headers.putAll(request.getHeaders());
CachedBodyOutputMessage outputMessage = new CachedBodyOutputMessage(exchange, headers);
// 写入全局上下文 (同步)
SaReactorSyncHolder.setContent(exchange);
return bodyInserter.insert(outputMessage, new BodyInserterContext()).then(Mono.defer(() -> {
return chain.filter(exchange.mutate().request(new ServerHttpRequestDecorator(exchange.getRequest()) {
@OverRide
public Flux getBody() {
return outputMessage.getBody();
}

                @Override
                public HttpHeaders getHeaders() {
                    return super.getHeaders();
                }
            }).response(new ServerHttpResponseDecorator(exchange.getResponse()){
                @Override
                public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
                    //异常代码
                    StpUtil.getTokenInfo();
                    Flux<? extends DataBuffer> fluxBody = (Flux<? extends DataBuffer>) body;
                    return super.writeWith(fluxBody.buffer().map(dataBuffers -> {
                        //异常代码
                        StpUtil.getTokenInfo();
                        DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory();
                        DataBuffer join = dataBufferFactory.join(dataBuffers);
                        byte[] content = new byte[join.readableByteCount()];
                        join.read(content);
                        DataBufferUtils.release(join);
                        HttpHeaders headers = getDelegate().getHeaders();
                        headers.putIfAbsent(HttpHeaders.CONTENT_LENGTH, Lists.newArrayList(content.length + ""));
                        return getDelegate().bufferFactory().wrap(content);
                    })).subscriberContext(ctx -> {
                        // 写入全局上下文 (异步)
                        ctx = ctx.put(SaReactorHolder.CONTEXT_KEY, exchange);
                        return ctx;
                    }).doFinally(r -> {
                        // 清除上下文
                        SaReactorSyncHolder.clearContent();
                    });
                }
            }).build()).subscriberContext(ctx -> {
                // 写入全局上下文 (异步)
                ctx = ctx.put(SaReactorHolder.CONTEXT_KEY, exchange);
                return ctx;
            }).doFinally(r -> {
                // 清除上下文
                SaReactorSyncHolder.clearContent();
            });
        }).subscriberContext(ctx -> {
            // 写入全局上下文 (异步)
            ctx = ctx.put(SaReactorHolder.CONTEXT_KEY, exchange);
            return ctx;
        }).doFinally(r -> {
            // 清除上下文
            SaReactorSyncHolder.clearContent();
        }));
}
@click33
Copy link
Collaborator

click33 commented Aug 15, 2021

贴的代码太乱了 你重新整理一下

@llm163520
Copy link
Author

@OverRide
public Mono filter(ServerWebExchange exchange, WebFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
Long requestStartTime = System.currentTimeMillis();
ServerRequest serverRequest = ServerRequest.create(exchange, codecConfigurer.getReaders());
Mono modifiedBody = serverRequest.bodyToMono(String.class).flatMap(body -> Mono.just(body));
BodyInserter bodyInserter = BodyInserters.fromPublisher(modifiedBody, String.class);
HttpHeaders headers = new HttpHeaders();
headers.putAll(request.getHeaders());
CachedBodyOutputMessage outputMessage = new CachedBodyOutputMessage(exchange, headers);
// 写入全局上下文 (同步)
SaReactorSyncHolder.setContent(exchange);
return bodyInserter.insert(outputMessage, new BodyInserterContext()).then(Mono.defer(() -> {
return chain.filter(exchange.mutate().request(new ServerHttpRequestDecorator(exchange.getRequest()) {
@OverRide
public Flux getBody() {
return outputMessage.getBody();
}

		@Override
		public HttpHeaders getHeaders() {
			return super.getHeaders();
		}
	}).response(new ServerHttpResponseDecorator(exchange.getResponse()){
		@Override
		public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
			//异常代码
			StpUtil.getTokenInfo();
			Flux<? extends DataBuffer> fluxBody = (Flux<? extends DataBuffer>) body;
			return super.writeWith(fluxBody.buffer().map(dataBuffers -> {
				//异常代码
				StpUtil.getTokenInfo();
				DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory();
				DataBuffer join = dataBufferFactory.join(dataBuffers);
				byte[] content = new byte[join.readableByteCount()];
				join.read(content);
				DataBufferUtils.release(join);
				HttpHeaders headers = getDelegate().getHeaders();
				headers.putIfAbsent(HttpHeaders.CONTENT_LENGTH, Lists.newArrayList(content.length + ""));
				return getDelegate().bufferFactory().wrap(content);
			})).subscriberContext(ctx -> {
				// 写入全局上下文 (异步)
				ctx = ctx.put(SaReactorHolder.CONTEXT_KEY, exchange);
				return ctx;
			}).doFinally(r -> {
				// 清除上下文
				SaReactorSyncHolder.clearContent();
			});
		}
	}).build()).subscriberContext(ctx -> {
		// 写入全局上下文 (异步)
		ctx = ctx.put(SaReactorHolder.CONTEXT_KEY, exchange);
		return ctx;
	}).doFinally(r -> {
		// 清除上下文
		SaReactorSyncHolder.clearContent();
	});
}).subscriberContext(ctx -> {
	// 写入全局上下文 (异步)
	ctx = ctx.put(SaReactorHolder.CONTEXT_KEY, exchange);
	return ctx;
}).doFinally(r -> {
	// 清除上下文
	SaReactorSyncHolder.clearContent();
}));

}

@llm163520
Copy link
Author

QQ图片20210815151951
调整好的,上传上来格式不对呢

@click33 click33 closed this as completed Aug 15, 2021
@Xiong-qi
Copy link

Xiong-qi commented Sep 6, 2022

请一下问解决方案是? @llm163520 @click33

@llm163520
Copy link
Author

请一下问解决方案是? @llm163520 @click33

我这边也暂时未解决

@Xiong-qi
Copy link

Xiong-qi commented Sep 8, 2022

请一下问解决方案是? @llm163520 @click33

我这边也暂时未解决

我的场景和你类型,在gateway的filter中获取登录的用户。我现在的解决的思路是,获取头的token,注入satoken的SaTokenDaoRedisJackson。通过redis存储获取。

@llm163520
Copy link
Author

请一下问解决方案是? @llm163520 @click33

我这边也暂时未解决

我的场景和你类型,在gateway的filter中获取登录的用户。我现在的解决的思路是,获取头的token,注入satoken的SaTokenDaoRedisJackson。通过redis存储获取。

这样也是一直办法,如果原生API能支持的话就更好了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants