想在SSM框架中进行配置AOP日志,进行数据库记录?不妨看看这篇文章

SSMAOP日志

  • 数据库与表结构
    1、日志表信息描述sysLog:
    在这里插入图片描述2、sql语句:
    在这里插入图片描述3、实体类:
    在这里插入图片描述
  • 基于AOP日志处理
    1、创建切面类处理日志
	
@Component
@Aspect
public class LogAop {
    @Autowired
    private HttpServletRequest httpServletRequest;    //在web.xml中配置RequestContextListener会自动注入
    @Autowired
    private ISysLogService sysLogService;
    private Date visitTime;//开始时间
    private Class clazz; //访问的类
    private Method method; //访问的方法
    /**
     * 前置通知 主要获取开始时间,执行的是哪个类,执行的是哪一个方法
     * @param jp
     */
    @Before("execution(* com.itheima.controller.*.*(..))")
    public void doBefore(JoinPoint jp) throws NoSuchMethodException {
        visitTime=new Date();   //当前时间就是访问的时间
        clazz=jp.getClass();   //具体要访问的类
        String methodName=jp.getSignature().getName();  //获取访问的方法的名称
        Object[] args = jp.getArgs();  //获取访问的方法的参数

        //获取具体执行的方法的Method对象
        if(args==null||args.length==0){
            method=clazz.getMethod(methodName);   //只能获取无参数的方法
        }else{
            Class[] classArgs=new Class[args.length];
            for(int i=0;i<args.length;i++){
                classArgs[i]=args[i].getClass();
            }
            method=clazz.getMethod(methodName,classArgs);
        }
    }


    /**
     * 后置通知
     * @param jp
     */
    @After("execution(* com.itheima.controller.*.*(..))")
    public void doAfter(JoinPoint jp){
        String url=null;
        long time=new Date().getTime()-visitTime.getTime();
        //获取url
        if(clazz!=null&&method!=null&&clazz== LogAop.class){
            //获取类上的@RequestMapping("/orders")
            RequestMapping classAnnotation = (RequestMapping) clazz.getAnnotation(RequestMapping.class);
            if(classAnnotation!=null){
                String[] classValue = classAnnotation.value();
                //获取方法上的@RequestMapping(xxx)
                RequestMapping methodAnnotation=method.getAnnotation(RequestMapping.class);
                if(methodAnnotation!=null){
                    String[] methodValue = methodAnnotation.value();
                    url=classValue[0]+methodValue[0];
                     //获取访问的ip
        String ip=httpServletRequest.getRemoteAddr();
        //获取当前操作的对象
        SecurityContext context= SecurityContextHolder.getContext();  //从上下文中获取当前登录的用户
        User user= (User) context.getAuthentication().getPrincipal();
        String username = user.getUsername();

        //将日志相关信息封装到SysLog对象
        SysLog sysLog=new SysLog();
        sysLog.setExecutionTime(time);//执行时长
        sysLog.setIp(ip);
        sysLog.setMethod("[类名]"+clazz.getName()+"[方法名]"+method.getName());
        sysLog.setUrl(url);
        sysLog.setUsername(username);
        sysLog.setVisitTime(visitTime);
        sysLogService.save(sysLog);
                }
            }
        }
    }
}

2、SysLogController
在这里插入图片描述3、Service

@Service
@Transactional
public class SysLogServiceImpl implements ISysLogService {

    @Autowired
    private ISysLogDao sysLogDao;
    @Override
    public void save(SysLog sysLog) {
        sysLogDao.save(sysLog);
    }
}

4、Dao
在这里插入图片描述注意:如果日志记录记录过程中如果报错无对应的类,我们应该检查该执行方法中的参数,如果整型为int替换为对应的包装类型。

发布了12 篇原创文章 · 获赞 10 · 访问量 426

猜你喜欢

转载自blog.csdn.net/weixin_43193358/article/details/105233332