【问题标题】:Custom Zuul Filter - log Request Body自定义 Zuul 过滤器 - 日志请求正文
【发布时间】:2016-07-10 18:39:01
【问题描述】:

我有一个自定义(预)zuul 过滤器,因为我想记录 API 请求的 requestBody(API 可用于在 Eureka 注册的服务中)但是当我在 ZUUL 中使用以下代码时

HttpServletRequest request.getReader();RequestContext.getCurrentContext().getRequest().getInputStream();

我可以记录 requestBody 但是 -

问题: 拥有 API 的服务无法获取 requestBody,因为它无法再次对同一请求调用 getReader。我知道我需要扩展 HttpServletRequestWrapper 并覆盖 getReader() 方法的东西,但我不确定如何在 ZUUL 上下文中处理,如何在记录后将请求与 requestBody 一起从 ZUUL 转发到服务。

任何建议都会有所帮助。

【问题讨论】:

  • 我能够通过使用 HttpServletRequestWrapper 解决它,将发布代码。

标签: spring-cloud netflix-zuul


【解决方案1】:

您可以直接将传入的请求包装在 HttpServletRequestWrapper 实例中。这是示例代码。希望这会有所帮助。

package com.example.edge.filter.pre;

import com.google.common.io.CharStreams;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.http.HttpServletRequestWrapper;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

@Component
public class RequestPayloadLoggingFilter extends ZuulFilter {

    private static Logger log = LoggerFactory.getLogger(RequestPayloadLoggingFilter.class);

    @Override
    public String filterType() {
        return "pre";
    }

    @Override
    public int filterOrder() {
        return 2;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = new HttpServletRequestWrapper(ctx.getRequest());

        log.info(String.format("%s request to %s", request.getMethod(), request.getRequestURL().toString()));

        String requestData = null;
        JSONParser jsonParser = new JSONParser();
        JSONObject requestJson = null;

        try {
            if (request.getContentLength() > 0 ) {
                requestData = CharStreams.toString(request.getReader());
            }

            if (requestData == null) {
                return null;
            }
            requestJson = (JSONObject) jsonParser.parse(requestData);
        } catch (Exception e) {
            log.error("Error parsing JSON request", e);
            return null;
        }
        log.info(String.format("%s request payload %s", request.getMethod(), requestJson.toJSONString()));
        return null;
    }
}

【讨论】:

  • 知道如何通过 Zuul 网关记录请求正文和 API 调用的响应吗?似乎我可以在同一个过滤器中记录请求或响应,但不能同时记录两者。我希望为我的所有 API 调用(包括响应代码)提供访问日志之类的内容。
猜你喜欢
  • 1970-01-01
  • 2015-09-12
  • 2023-03-04
  • 2018-02-09
  • 2016-09-24
  • 2018-08-06
  • 2018-01-10
  • 2017-06-13
  • 1970-01-01
相关资源
最近更新 更多