记录接口的请求参数

package com.example.springboot.log;

import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
import org.springframework.validation.BindingResult;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;
import java.util.Map;

@Slf4j
public class RequestInfoUtil {
    private static final ThreadLocal REQUEST_INFO_IS_GOTTEN = new ThreadLocal<>();

    /**
     * 根据切点信息生成请求信息
     *

     */
    public static RequestInfoBO generateRequestInfo(JoinPoint joinPoint) {
        RequestInfoBO result = new RequestInfoBO();
        HttpServletRequest request = getHttpServletRequest();
        if (request != null) {
            result.setUri(request.getServletPath());
            result.setUserIp(request.getRemoteHost());
            result.setHeader(getHeaders(request));
        }
        MethodSignature ms = (MethodSignature) joinPoint.getSignature();
        result.setMethod(ms.toString());
        result.setParam(getParameters(joinPoint, ms));
        return result;
    }

    /**
     * 清理信息,主要清理ThreadLocal信息
     *

     */
    public static void clean() {
        REQUEST_INFO_IS_GOTTEN.remove();
    }

    /**
     * 打印拦截到的参数信息
     *

     * * @param
     */
    public static String printInfo(RequestInfoBO po) {
        StringBuilder sb = new StringBuilder();
        sb.append("==========【请求参数信息】Start======================\n");
        if (StringUtils.isNotBlank(po.getUri())) {
            sb.append("【请求地址(URL)】:" + po.getUri() + "\n");
        }
        if (StringUtils.isNotBlank(po.getMethod())) {
            sb.append("【请求地址(METHOD)】:" + po.getMethod() + "\n");
        }
        if (StringUtils.isNotBlank(po.getParam())) {
            sb.append("【请求参数】:" + po.getParam() + "\n");
        }

        if (StringUtils.isNotBlank(po.getHeader())) {
            sb.append("【请求头】:" + po.getHeader() + "\n");
        }

        if (StringUtils.isNotBlank(po.getUserIp())) {
            sb.append("【请求人IP】:" + po.getUserIp() + "\n");
        }
        sb.append("==========【请求参数信息】End======================\n");
        return sb.toString();
    }

    /**
     * 私有构造函数,禁止其他人创建

     */
    private RequestInfoUtil() {
    }

    /**
     * 获取当前线程的HTTP Request信息,如果已经获取过,就不允许在获取

     */
    private static HttpServletRequest getHttpServletRequest() {
        HttpServletRequest request = null;
        Boolean gotten = REQUEST_INFO_IS_GOTTEN.get();
        if (null == gotten) {
            RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
            if (requestAttributes instanceof ServletRequestAttributes) {
                request = ((ServletRequestAttributes) requestAttributes).getRequest();
            }
            REQUEST_INFO_IS_GOTTEN.set(true);
        }
        return request;
    }

    /**
     * 根据切点获取参数信息
     *

     */
    private static String getParameters(JoinPoint joinPoint, MethodSignature ms) {
        try {
            Object[] args = joinPoint.getArgs();
            LocalVariableTableParameterNameDiscoverer u = new LocalVariableTableParameterNameDiscoverer();
            String[] paramNames = u.getParameterNames(ms.getMethod());
            if (args != null && paramNames != null) {
                JSONObject params = new JSONObject();

                for (int i = 0; i < args.length; i++) {
                    if (args[i] instanceof ServletRequest) {
                        ServletRequest request = (ServletRequest) args[i];
                        JSONObject requestJSON = new JSONObject();
                        Map requestParameterMap = request.getParameterMap();
                        for (Map.Entry paramEntry : requestParameterMap.entrySet()) {
                            requestJSON.put(paramEntry.getKey(), paramEntry.getValue());
                        }
                        params.put(paramNames[i], requestJSON);
                    } else if (args[i] instanceof ServletResponse || args[i] instanceof MultipartFile || args[i] instanceof BindingResult) {
                        continue;
                    } else {
                        params.put(paramNames[i], args[i]);
                    }
                }
                return params.toJSONString();
            }
            return null;
        } catch (Throwable e) {
            log.error("解析请求参数出错", e);
            return null;
        }
    }

    /**
     * 获取请求头
     *

     */
    private static String getHeaders(HttpServletRequest request) {
        if (null == request) {
            return null;
        } else {
            Enumeration headerNames = request.getHeaderNames();
            JSONObject headerJSON = new JSONObject();
            while (headerNames.hasMoreElements()) {
                String header = headerNames.nextElement();
                String headerValue = request.getHeader(header);
                headerJSON.put(header, headerValue);
            }
            return headerJSON.toJSONString();
        }
    }

}

Original: https://www.cnblogs.com/tiancai/p/16520840.html
Author: 甜菜波波
Title: 记录接口的请求参数

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/553649/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球