springboot aspect 切面获取请求数据

  • Post author:
  • Post category:其他


项目有一个需求就是记录每次接口请求的一些数据。基于项目是springboot所以想到用切面aspect来实现这个功能。前提:

前端post提交数据的方式是:application/json,而且由于接口中一般都是用@RequestBoy +对象 的方式来接收参数的。

所以像一般的方式:

ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
Enumeration<String> enu = request.getParameterNames();
logger.info("====" + enu.hasMoreElements());
 while (enu.hasMoreElements()) {
       String paraName = enu.nextElement();
       logger.info("=========" + paraName + ": " + request.getParameter(paraName));
 }

从request中是无法取到参数到,这是因为参数使用@RequestBoy 那么前端传递的参数是放在请求体里面的。

Signature signature = joinPoint.getSignature();
MethodSignature methodSignature = (MethodSignature) signature;
String[] parameterNames = methodSignature.getParameterNames();
Object[] parameterValues = joinPoint.getArgs();
Map<String,Object> paramMap = new HashMap<>();
for (int i=0;i<parameterValues.length;i++) {
    try {
         String s = JSON.toJSONString(parameterValues[i]);
         paramMap.put(parameterNames[i],s);
     } catch (Exception e) {
         continue;
     }
}

这种情况就要从joinPoint.getArgs()获取参数值,methodSignature.getParameterNames()可以获取参数名。

这里其中涉及到前端POST的传参方式:(application/x-www-form-urlencoded,multipart/form-data,application/json,text/xml),以及@RequestBoy的使用。

参考文档:

@RequestBody的使用


四种常见的 POST 提交数据方式



版权声明:本文为Mwangsheng原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。