package com.cloudroam.common.interceptor;
|
|
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.json.JSON;
|
import cn.hutool.json.JSONObject;
|
import cn.hutool.json.JSONUtil;
|
import com.cloudroam.service.LogService;
|
import com.cloudroam.util.RequestUtils;
|
import io.github.talelin.autoconfigure.interfaces.LoggerResolver;
|
import io.github.talelin.core.annotation.Logger;
|
import io.github.talelin.core.annotation.PermissionMeta;
|
import io.github.talelin.core.util.BeanUtil;
|
import com.cloudroam.common.LocalUser;
|
import com.cloudroam.model.UserDO;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Component;
|
import org.springframework.util.StringUtils;
|
import org.springframework.web.servlet.HandlerMapping;
|
|
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletResponse;
|
import java.util.Enumeration;
|
import java.util.Map;
|
import java.util.Objects;
|
import java.util.regex.Matcher;
|
import java.util.regex.Pattern;
|
|
/**
|
* @author
|
* @author
|
* @author
|
* 行为日志实现类
|
*/
|
@Slf4j
|
@Component
|
public class LoggerImpl implements LoggerResolver {
|
|
@Autowired
|
private LogService logService;
|
|
private static final String PATH_ID="id";
|
|
/**
|
* 日志格式匹配正则
|
*/
|
private static final Pattern LOG_PATTERN = Pattern.compile("(?<=\\{)[^}]*(?=})");
|
|
@Override
|
public void handle(PermissionMeta meta, Logger logger, HttpServletRequest request, HttpServletResponse response) {
|
String template = logger.template();
|
UserDO user = LocalUser.getLocalUser();
|
template = this.parseTemplate(template, user, request, response);
|
String permission = "";
|
String module="";
|
if (meta != null) {
|
permission = meta.value();
|
module=meta.module();
|
}
|
|
|
Integer userId = user.getId();
|
// String username = user.getUsername();
|
String username = user.getNickname();
|
String method = request.getMethod();
|
String path = request.getServletPath();
|
Integer status = response.getStatus();
|
|
Map<String, Object> params = RequestUtils.getParams(request);
|
|
Map pathVariables = (Map) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
|
String id="";
|
if(!Objects.isNull(pathVariables.get(PATH_ID))){
|
id=String.valueOf(pathVariables.get(PATH_ID));
|
}
|
|
|
|
logService.createLog(template, permission, userId, username, method, path, status,module,id, JSONUtil.toJsonStr(params));
|
}
|
|
private String parseTemplate(String template, UserDO user, HttpServletRequest request, HttpServletResponse response) {
|
// 调用 get 方法
|
Matcher m = LOG_PATTERN.matcher(template);
|
while (m.find()) {
|
String group = m.group();
|
String property = this.extractProperty(group, user, request, response);
|
template = template.replace("{" + group + "}", property);
|
}
|
return template;
|
}
|
|
private String extractProperty(String item, UserDO user, HttpServletRequest request, HttpServletResponse response) {
|
int i = item.lastIndexOf('.');
|
String obj = item.substring(0, i);
|
String prop = item.substring(i + 1);
|
switch (obj) {
|
case "user":
|
if (user == null) {
|
return "";
|
}
|
return BeanUtil.getValueByPropName(user, prop);
|
case "request":
|
return BeanUtil.getValueByPropName(request, prop);
|
case "response":
|
return BeanUtil.getValueByPropName(response, prop);
|
default:
|
return "";
|
}
|
}
|
}
|