java Filter从Request,Response获取traceId,请求,返回参数

@Component
@Slf4j
public class KylinFilter extends OncePerRequestFilter {



  public static final String TRACE_ID = "X-B3-TraceId";


  @Override
  protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
      log.info("doFilter  start ");
      //防止读取一次问题 
      //request = new RequestWrapper(request);
      //response = new ResponseWrapper(response);
      KylinLog kylinLog = new KylinLog();
      try {
        filterChain.doFilter(request, response);
      } finally {
        assembleKylinLog(request, (ResponseWrapper)response,kylinLog);
      }
      log.info("doFilter  end ");
  }

  private void assembleKylinLog(HttpServletRequest request, ResponseWrapper response, KylinLog kylinLog) {
    String traceId = findTraceId(request);
    kylinLog.setTraceId(traceId);
    kylinLog.setMethod(request.getMethod());
    kylinLog.setUrl(request.getRequestURL().toString());
    kylinLog.setCurrService(request.getContextPath());	
    if (request instanceof RequestWrapper && !isMultipart(request) && !isBinaryContent(request)) {
      RequestWrapper requestWrapper = (RequestWrapper) request;
      //请求参数
      String data = "";
      if(requestWrapper.getMethod().toUpperCase().equals("POST")){
        data = getRequestPostBody(requestWrapper);
      }
      kylinLog.setRequest(data);

      //返回参数
      String responseBody = "";
      try {
        String charEncoding = requestWrapper.getCharacterEncoding() != null ? requestWrapper.getCharacterEncoding() : "UTF-8";
        responseBody = new String(response.toByteArray(), charEncoding);
      } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
      }
      kylinLog.setResponse(responseBody);
      log.info("-------------------------------------------------------"+ JSONObject.toJSONString(kylinLog));
    }
  }


 //request中获取traceId
  public String findTraceId(HttpServletRequest request) {
    String traceId = request.getHeader(TRACE_ID);
    if (StringUtils.isEmpty(traceId)) {
      //DONE 如果traceId为空,则从当前项目创建traceId 后期使用同一的util 工具进行封装流水号的产生
      traceId = getSystemTimeFormatMillis() + get16UUID();
    }
    return traceId;
  }

public Map<String, Object> getHeaders() {
    Map<String, Object> headerMap = new HashMap<String, Object>();
    Enumeration<?> er = request.getHeaderNames();//获取请求头的所有name值
    String headerName;
    while(er.hasMoreElements()){
        headerName = er.nextElement().toString();
        headerMap.put(headerName, request.getHeader(headerName));
    }
    return headerMap;
}

	
 //request中获取post参数
 private String getRequestPostBody(HttpServletRequest request) {
    BufferedReader reader = null;
    String wholeStr = "";
      try {
        reader = new BufferedReader(new InputStreamReader(request.getInputStream()));
        String str = "";
        while((str = reader.readLine()) != null){//一行一行的读取body体里面的内容;
          wholeStr += str;
        }
      } catch (IOException e) {
        e.printStackTrace();
      }
      return wholeStr;
  }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java Web应用中,可以使用Filter来对HTTP请求和响应进行过滤和处理。如果你想要获取响应内容,可以在Filter中重写doFilter方法,在该方法中获取响应内容。以下是一种可能的实现方式: ```java public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // 初始化操作 } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { // 获取响应输出流 HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse; ServletOutputStream outputStream = httpServletResponse.getOutputStream(); // 创建缓冲输出流 ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); ServletOutputStream servletOutputStream = new ServletOutputStream() { @Override public void write(int b) throws IOException { outputStream.write(b); byteArrayOutputStream.write(b); } }; // 替换响应输出流 HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper(httpServletResponse) { @Override public ServletOutputStream getOutputStream() throws IOException { return servletOutputStream; } }; // 执行请求处理链 filterChain.doFilter(servletRequest, wrapper); // 获取响应内容 String responseContent = byteArrayOutputStream.toString("UTF-8"); // 处理响应内容 // ... // 输出响应内容 outputStream.write(responseContent.getBytes("UTF-8")); } @Override public void destroy() { // 销毁操作 } } ``` 在上述代码中,重写doFilter方法时,首先获取响应输出流,然后创建一个缓冲输出流,并替换响应输出流。在请求处理链执行完毕后,从缓冲输出流中获取响应内容,并进行相应的处理。最后将处理后的响应内容输出到响应输出流中。需要注意的是,由于HTTP响应可能会被压缩或分块传输,因此需要对响应内容进行相应的解压缩和拼接处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值