小编Pit*_*Pit的帖子

如何在提交之前修改 Spring Cloud Gateway 中的响应正文

我在一个项目中使用 Spring Cloud Gateway 和 Spring 5、Spring Reactor 和 Netty。对于发送到网关的每个请求,我想在将响应发送到客户端之前执行一些操作。我发现最好的方法是使用 beforeCommit 方法向响应添加操作。

我首先尝试了这种方法:

        exchange.getResponse().beforeCommit(() -> {
            ServerHttpResponse response = exchange.getResponse();
            try {
                myActionDoneHere();
                response.setStatusCode(OK);
                return Mono.empty();
            } catch (Exception ex) {
                return Mono.error(new MyException(ex));
            }
        });
Run Code Online (Sandbox Code Playgroud)

并尝试在异常处理程序中处理异常:

public Mono<Void> handle(ServerWebExchange exchange, Throwable ex) {
    if (isMyException(ex)) {
     exchange.getResponse().setStatusCode(HttpStatus.INTERNAL_SERVER_ERROR);
        exchange.getResponse().getHeaders().setContentLength(MSG.length());
        exchange.getResponse().getHeaders().setContentType(MediaType.APPLICATION_JSON_UTF8);
        return exchange.getResponse().writeWith(Mono.just(exchange.getResponse().bufferFactory().wrap(MSG.getBytes())));
    }

    return Mono.error(ex);
}
Run Code Online (Sandbox Code Playgroud)

当我这样做时,当我尝试修改内容长度时出现异常。如果我了解清楚情况的话。我无法再在处理程序中修改响应,因为它已经提交了。因此,我尝试了其他解决方案,并尝试修改提交之前执行的操作中的响应:

exchange.getResponse().beforeCommit(() -> {
    ServerHttpResponse response = exchange.getResponse();
    try {
        myActionDoneHere();
        response.setStatusCode(OK);
        return Mono.empty();
    } catch (Exception ex) {
        response.setStatusCode(HttpStatus.INTERNAL_SERVER_ERROR);
        response.getHeaders().setContentLength(MSG.length());
        response.getHeaders().setContentType(MediaType.APPLICATION_JSON_UTF8);
        return exchange.getResponse().writeWith(Mono.just(exchange.getResponse().bufferFactory().wrap(MSG.getBytes()))); …
Run Code Online (Sandbox Code Playgroud)

spring project-reactor spring-cloud-gateway

7
推荐指数
1
解决办法
1万
查看次数