将日志信息写入数据库,基于springsecurity日志类详解

@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);
        }
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

干饭两斤半

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值