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 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 ""; } } }