这几天公司业务需求要弄一个操作日志,需要获取到用户请求的参数,在网上看了很多方法,在我这都没用,无奈看去别人写好的源码,总算找出来了。
因为要转化成JSON字符串,所以需要 用到JSON包,这里用的是阿里巴巴的:
<!-- 阿里JSON解析器 -->
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.26</version>
</dependency>
废话不多说,直接上源码(帮到各位请点赞支持一下吧):
/**
* 通过JoinPoint 获取请求参数JSON字符串并返回
*/
private String argsArrayToString(JoinPoint joinPoint)
{
Object[] paramsArray = joinPoint.getArgs();
String params = "";
if (paramsArray != null && paramsArray.length > 0)
{
for (Object o : paramsArray)
{
if (StringUtils.isNotNull(o) && !isFilterObject(o))
{
try
{
String jsonObj = JSON.toJSONString(o);
params += jsonObj.toString() + " ";
}
catch (Exception e)
{
}
}
}
}
return params.trim();
}
/**
* 忽略敏感属性
*/
public PropertyPreExcludeFilter excludePropertyPreFilter(String[] excludeParamNames)
{
return new PropertyPreExcludeFilter().addExcludes(ArrayUtils.addAll(PropertyPreExcludeFilter.EXCLUDE_PROPERTIES, excludeParamNames));
}
/**
* 判断是否需要过滤的对象。
*
* @param o 对象信息。
* @return 如果是需要过滤的对象,则返回true;否则返回false。
*/
@SuppressWarnings("rawtypes")
public boolean isFilterObject(final Object o)
{
Class<?> clazz = o.getClass();
if (clazz.isArray())
{
return clazz.getComponentType().isAssignableFrom(MultipartFile.class);
}
else if (Collection.class.isAssignableFrom(clazz))
{
Collection collection = (Collection) o;
for (Object value : collection)
{
return value instanceof MultipartFile;
}
}
else if (Map.class.isAssignableFrom(clazz))
{
Map map = (Map) o;
for (Object value : map.entrySet())
{
Map.Entry entry = (Map.Entry) value;
return entry.getValue() instanceof MultipartFile;
}
}
return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse
|| o instanceof BindingResult;
}
其中 isFilterObject 方法用来过滤掉不用的参数,比如用户的密码等,根据业务需求可以删除。
拿到的数据样子如下:
{"id":1,"level":50,"name":"决热快","pageIndex":10,"pageSize":1,"pageSorts":[],"parentId":75,"sort":49,"type":37}