【问题标题】:Spring zuul proxy appends extra json response along with service response jsonSpring zuul 代理附加额外的 json 响应以及服务响应 json
【发布时间】:2020-09-30 16:16:42
【问题描述】:

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代理附加,这是错误还是配置错误

【问题讨论】:

  • zuul 默认不附加任何内容。您能否提供更多信息,例如版本和更多配置?
  • 我可以通过评论 // @Bean // public PostFilter postfilter() { // return new PostFilter(); 来解决这个问题// } 代码
  • PostFilter 是什么?它来自哪里?
  • 代理服务器spring应用程序类,我覆盖了几个方法``` @SpringBootApplication @EnableZuulProxy public class ProxyServerApplication { public static void main(String[] args) { SpringApplication.run(ProxyServerApplication.class,参数); } @Bean public PreFilter prefilter() { return new PreFilter(); } // @Bean // public PostFilter postfilter() { // return new PostFilter(); // } // @Bean public RouteFilter routefilter() { return new RouteFilter(); } } ```
  • 那么如果不是zuul中的代码就不能是zuul中的bug

标签: spring-boot spring-cloud netflix-zuul


【解决方案1】:

在删除该部分时覆盖了 PostFilter。它解决了这个问题

【讨论】:

    【解决方案2】:

    原因是过滤器发生异常。而且response已经写了两次,分别是response data和/error response。

    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();
    }
    

    基本错误控制器.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);
        }
    }
    

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

    这是一个例子:

    @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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-07
      • 2018-09-10
      • 2015-10-09
      • 1970-01-01
      • 2013-08-28
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      相关资源
      最近更新 更多