Spring zuul 代理附加额外的 json 响应以及服务响应 json

Spring zuul proxy appends extra json response along with service response json

Spring zuul 代理附加额外的 json 响应以及服务响应 json

下面是zuul的配置

zuul:
  sensitiveHeaders:
  routes:
    api-gateway:
      url: http://localhost:8099
    abc-management:
      url: http://localhost:8098

下面是回复json

{
    "status": "P200",
    "message": "Orders fetched successfully",
    "timeStamp": "2020-09-30T16:01:42.116275Z",
    "data": {
        "orders": [
            {
                "order_id": "11312553751504",
                "status_reason": null
            }
        ]
    },
    "requestId": 0
}{
    "timestamp": "2020-09-30T16:01:42.122+0000",
    "status": 200,
    "error": "OK",
    "message": "",
    "path": "/api-gateway/orders"
}

额外的json

{
    "timestamp": "2020-09-30T16:01:42.122+0000",
    "status": 200,
    "error": "OK",
    "message": "",
    "path": "/api-gateway/orders"
}

由zuul代理附加,这是错误还是配置错误

正在覆盖 PostFilter,当该部分被删除时。它解决了问题

原因是过滤器出现异常。和响应写入了两次,响应数据和/错误响应。

ApplicationFilterChain.java

        } catch (IOException | ServletException | RuntimeException e) {
            throw e;
        } catch (Throwable e) {
            e = ExceptionUtils.unwrapInvocationTargetException(e);
            ExceptionUtils.handleThrowable(e);
            throw new ServletException(sm.getString("filterChain.filter"), e);
        }

StandardWrapperValve.java

private void exception(Request request, Response response,
                       Throwable exception) {
    request.setAttribute(RequestDispatcher.ERROR_EXCEPTION, exception);
    response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
    response.setError();
}

BasicErrorController.java

@RequestMapping
public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
    HttpStatus status = this.getStatus(request);
    if (status == HttpStatus.NO_CONTENT) {
        return new ResponseEntity(status);
    } else {
        Map<String, Object> body = this.getErrorAttributes(request, this.getErrorAttributeOptions(request, MediaType.ALL));
        return new ResponseEntity(body, status);
    }
}

如果这些是过滤器中发生的错误,则将重定向到 /error 页面。

这是一个例子:

@Component
public class MyFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        filterChain.doFilter(servletRequest, servletResponse);
        throw new RuntimeException("error");
    }
}

@RestController
public class IndexController {

    @GetMapping("/user")
    public User user(@RequestParam int id) {
        return new User(id, "user" + id);
    }
}

邮递员请求,回复:

{
    "id": 2,
    "name": "user2"
}{
    "timestamp": "2022-02-15T11:06:16.094+00:00",
    "status": 200,
    "error": "OK",
    "path": "/user"
}

image