公共类
package com.chinaunicom.standard.product.ucenter.common.utils;
import org.springframework.util.StringUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;
public class ContextUtil {
public static final String APPLET_LOGIN_TOKEN = "token";
private ContextUtil() {
}
public static HttpServletRequest getHttpServletRequest() {
return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
}
public static HttpServletResponse getHttpServletResponse() {
return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
}
public static String getHttpServletRequestParamByKey(String headerName) {
String paramVal = getHttpServletRequest().getHeader(headerName);
if (StringUtils.isEmpty(paramVal)) {
paramVal = getUrlParam(getHttpServletRequest().getQueryString(), headerName);
}
return paramVal;
}
public static String getRequestLoginToken() {
return getHttpServletRequestParamByKey(APPLET_LOGIN_TOKEN);
}
public static void setRequestAttribute(String name, Object value) {
getHttpServletRequest().setAttribute(name, value);
}
public static String getUrlParam(String urlParam, String paramKey) {
if (StringUtils.isEmpty(urlParam)) {
return null;
}
String params = urlParam.substring(urlParam.indexOf("?") + 1, urlParam.length());
String[] paramArray = params.split("&");
if (null != paramArray && paramArray.length > 0) {
Map<String, String> paramMap = new HashMap<>(paramArray.length);
for (String param : paramArray) {
paramMap.put(param.substring(0, param.indexOf("=")), param.substring(param.indexOf("=") + 1));
}
return paramMap.get(paramKey);
}
return null;
}
}
具体实现
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;
import com.alibaba.fastjson.JSON;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.time.LocalDateTime;
@Component
@Aspect
@Order(0)
@Slf4j
public class UcenterLogOperationAspect extends AbstractController {
@Pointcut("@annotation(org.springframework.web.bind.annotation.PostMapping)||@annotation(org.springframework.web.bind.annotation.GetMapping)||@annotation(org.springframework.web.bind.annotation.DeleteMapping)||@annotation(org.springframework.web.bind.annotation.PutMapping)")
public void ApiOperation() {
}
@Autowired
private OperationLogMapper operationLogMapper;
@Around("ApiOperation()")
public Object around(ProceedingJoinPoint proceedingJoinPoint) {
long beginTime = System.currentTimeMillis();
Object o = null;
try {
o = proceedingJoinPoint.proceed();
saveLog(proceedingJoinPoint, beginTime, (byte) 0, JSON.toJSONString(o));
return o;
} catch (Throwable throwable) {
try {
saveLog(proceedingJoinPoint, beginTime, (byte) -1, JSON.toJSONString(throwable.getMessage()));
} catch (Exception e) {
log.error("日志切面未知异常:{}", e);
}
}
return o;
}
private void saveLog(ProceedingJoinPoint proceedingJoinPoint, long time, byte status, String errMsg) {
MethodSignature signature = (MethodSignature) proceedingJoinPoint.getSignature();
Method method = signature.getMethod();
ApiOperation apiOperation = method.getAnnotation(ApiOperation.class);
log.info("operatorType:" + apiOperation);
if (apiOperation != null) {
HttpServletRequest request = ContextUtil.getHttpServletRequest();
String url = request.getRequestURI();
if (!url.contains("/ucenter/logOperation/add") || url.contains("/ucenter/verifyCode")
|| !url.contains("/ucenter/uuser/loginUserAuthInfo")) {
OperationLog operationLog = new OperationLog();
operationLog.setRequestIp(request.getRemoteHost());
operationLog.setRequestTime(System.currentTimeMillis() - time);
operationLog.setRequestStatus(status);
operationLog.setOperation(apiOperation.value());
String token = null;
token = request.getHeader("token");
if (StringUtils.isNotEmpty(token)) {
String accessToken = redisTemplate.opsForValue().get(token);
if (StringUtils.isNotEmpty(accessToken)) {
UserInfoResp userInfoResp = JSON.parseObject(accessToken, UserInfoResp.class);
operationLog.setCreatorName(userInfoResp.getUserName());
}
operationLog.setUserAgent(request.getHeader(HttpHeaders.USER_AGENT));
operationLogMapper.insert(operationLog);
}
}
}
}
}