运用Aop的特性对访问接口的进行记录打印输出,分别记录用户的名称,访问功能,请求参数,请求Url,请求IP,请求结果,返回参数
package com.vimochina.vimo.config;
import cn.hutool.json.JSONUtil;
import eu.bitwalker.useragentutils.UserAgent;
import io.jsonwebtoken.Claims;
import lombok.extern.slf4j.Slf4j;
import net.sf.json.JSONObject;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import com.vimochina.vimo.basic.dao.SysUserDao;
import com.vimochina.vimo.basic.entity.SysMenu;
import com.vimochina.vimo.basic.entity.SysSaveLog;
import com.vimochina.vimo.basic.entity.SysUser;
import com.vimochina.vimo.basic.service.SysMenuService;
import com.vimochina.vimo.basic.service.SysSaveLogService;
import com.vimochina.vimo.basic.service.SysUserService;
import com.vimochina.vimo.jjwt.JwtHelper;
import javax.servlet.http.HttpServletRequest;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.Objects;
/**
* <p>
* 使用 aop 切面记录请求日志信息
* </p>
*
* @package: com.xkcoding.log.aop.aspectj
* @description: 使用 aop 切面记录请求日志信息
* @author: yangkai.shen
* @date: Created in 2018/10/1 10:05 PM
* @copyright: Copyright (c) 2018
* @version: V1.0
* @modified: yangkai.shen
*/
@Aspect
@Component
@Slf4j
public class AopLog {
@Autowired
private SysMenuService sysMenuService;
@Autowired
private SysUserService sysUserService;
@Autowired
private SysUserDao sysUserDao;
@Autowired
private SysSaveLogService sysSaveLogService;
private static final String START_TIME = "request-start";
/**
* 切入点
*/
@Pointcut("execution(public * com.vimochina.vimo.tower.controller.*Controller.*(..))")
public void log() {
}
/**
* 前置操作
*
* @param point 切入点
* @throws ParseException
*/
@Before("log()")
public void beforeLog(JoinPoint point) throws ParseException {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = Objects.requireNonNull(attributes).getRequest();
Long start = System.currentTimeMillis();
request.setAttribute(START_TIME, start);
}
/**
* 环绕操作
*
* @param point 切入点
* @return 原方法返回值
* @throws Throwable 异常信息
*/
@Around("log()")
public Object aroundLog(ProceedingJoinPoint point) throws Throwable {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = Objects.requireNonNull(attributes).getRequest();
String name = point.getSignature().getName();
String userName = "test";
String menuName = "test";
String openId = "test";
String loginFlag = "1";
String delFlag = "0";
Integer deptId = 0;
Map<String, String[]> parameterMap = request.getParameterMap();
if("login".equals(name)) {
loginFlag = "0";
if(parameterMap!=null) {
String[] strings = parameterMap.get("loginName");
if(strings!=null) {
openId = strings[0];
SysUser searchByUserName = this.sysUserService.searchByUserName(openId);
if(searchByUserName!=null) {
userName = searchByUserName.getUserName();
deptId = searchByUserName.getDeptId();
SysMenu searchByUrl = this.sysMenuService.searchByUrl(request.getRequestURI());
if(searchByUrl!=null) {
menuName = searchByUrl.getMenuName();
}
}
}
}
}else {
//String token = request.getHeader("authorization");
String token = "eyJhbGciOiJIUzI1NiJ9.eyJvcGVuSWQiOiJhZG1pbiIsInVzZXJJZCI6ImFkbWluIiwiaWF0IjoxNTc1OTQ5NzY5LCJqdGkiOiJ0b2tlbklkIn0.KrwICjqrQ027sSNrSahMihrRh2aWTaY68ojfqNCPuCM";
Claims claims = JwtHelper.verifyJwt(token);
openId = claims.get("openId").toString();
if(parameterMap!=null) {
SysUser searchByUserName = this.sysUserDao.searchByUserName(openId);
if(searchByUserName!=null) {
userName = searchByUserName.getUserName();
deptId = searchByUserName.getDeptId();
SysMenu searchByUrl = this.sysMenuService.searchByUrl(request.getRequestURI());
if(searchByUrl!=null) {
menuName = searchByUrl.getMenuName();
}
}
}
}
//设置日期格式
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// new Date()为获取当前系统时间
String format = sdf1.format(new Date());
SimpleDateFormat sdf2= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = sdf2.parse(format);
String header = request.getHeader("User-Agent");
UserAgent userAgent = UserAgent.parseUserAgentString(header);
String ip = request.getRemoteAddr();
String url = request.getRequestURL().toString();
String brower = userAgent.getBrowser().toString();
String os = userAgent.getOperatingSystem().toString();
JSONObject result = (JSONObject)point.proceed();
String msg =null;
if(result!=null) {
Integer return_code = (Integer)result.get("return_code");
if(return_code==1) {
msg = result.get("return_msg").toString();
}else if(return_code==0) {
msg = result.get("return_msg").toString();
}else if(return_code==2) {
msg = result.get("return_msg").toString();
}
}
log.info("【用户名称】:{}", userName);
log.info("【访问功能】:{}", menuName);
log.info("【请求参数】:{},", JSONUtil.toJsonStr(parameterMap));
log.info("【请求 URL】:{}", url);
log.info("【请求 IP】:{}", ip);
log.info("【请求结果】:{}", msg);
log.info("【返回值】:{}", JSONUtil.toJsonStr(result));
//log.info("【请求 用户】:{}", request.getHeader("authorization"));
//log.info("【请求类名】:{},【请求方法名】:{}", point.getSignature().getDeclaringTypeName(), point.getSignature().getName());
SysSaveLog sysSaveLog = new SysSaveLog();
sysSaveLog.setUserName(userName);
sysSaveLog.setUserAccount(openId);
sysSaveLog.setRequestTime(date);
sysSaveLog.setIp(ip);
sysSaveLog.setUrl(url);
sysSaveLog.setAccessFunction(menuName);
sysSaveLog.setLoginFlag(loginFlag);
sysSaveLog.setDeptId(deptId);
sysSaveLog.setDelFlag(delFlag);
sysSaveLog.setOs(os);
sysSaveLog.setBrowser(brower);
sysSaveLog.setMsg(msg);
int save = this.sysSaveLogService.save(sysSaveLog);
if(save==0) {
System.out.println("日志插入成功");
}else {
System.out.println("日志插入失败");
}
return result;
}
/**
* 后置操作
*/
@AfterReturning("log()")
public void afterReturning() {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = Objects.requireNonNull(attributes).getRequest();
Long start = (Long) request.getAttribute(START_TIME);
Long end = System.currentTimeMillis();
log.info("【请求耗时】:{}毫秒", end - start);
String header = request.getHeader("User-Agent");
UserAgent userAgent = UserAgent.parseUserAgentString(header);
log.info("【浏览器类型】:{},【操作系统】:{},【原始User-Agent】:{}", userAgent.getBrowser().toString(), userAgent.getOperatingSystem().toString(), header);
}
}