@Component
@Aspect //表明这是一个切面类
public class LogAop {
@Autowired
// 注入的是一个代理对象,spring 能保证它的线程安全
private HttpServletRequest request;
@Autowired
private ISysLogService sysLogService; //自定义的service类,用于存储日志信息到数据库
// ip 地址的获得,需要在 tomcat 启动时添加一个 虚拟机参数:-Djava.net.preferIPv4Stack=true
@Around("execution(* com.itheima.ssm.controller.*.*(..))")
//环绕通知,切点表达式表示匹配 controller包下任意返回值,任意类,任意方法,任意参数
public Object around(ProceedingJoinPoint pjp) {
System.out.println("========================>");
// 开始时间
Date visitTime = new Date();
System.out.println(visitTime);
// 安全上下文
SecurityContext securityContext = SecurityContextHolder.getContext();
// 获取令牌对象
Authentication authentication = securityContext.getAuthentication();
// 获取用户详情
UserInfo userInfo = (UserInfo) authentication.getPrincipal();
// 获取用户名
String username = userInfo.getUsername();
System.out.println(username);
// 获取 ip 地址
String ip = request.getRemoteAddr();
System.out.println(ip);
// 获取 uri
String url = request.getRequestURI();
System.out.println(url);
// 获取控制器方法名
String methodName = pjp.getSignature().getName();
// 获取控制器类名
String className = pjp.getTarget().getClass().getSimpleName();
methodName= className+"." +methodName;
System.out.println(methodName);
try {
// 调用目标方法(目标就是控制器类)
Object result = pjp.proceed();
return result;
} catch (Throwable throwable) {
throwable.printStackTrace();
throw new RuntimeException(throwable);
} finally {
// 结束时间
Date end = new Date();
// 花费时间
long executionTime = end.getTime() - visitTime.getTime();
System.out.println(executionTime);
SysLog log = new SysLog();
log.setIp(ip);
log.setExecutionTime(executionTime);
log.setVisitTime(visitTime);
log.setUrl(url);
log.setUsername(username);
log.setMethod(methodName);
//调用方法存入数据进数据库
sysLogService.save(log);
}
}
}
将日志信息写入数据库,基于springsecurity日志类详解
最新推荐文章于 2023-12-21 15:36:29 发布