SSM框架中对Controller的AOP日志不起作用

今天在做一个对Controller的AOP日志的这么一个操作,因为是分模块开发的(分成了DAO,Service,WEB,等等小模块),所以我是直接在WEB模块(就是Controller模块)中写了一个AOP日志通知类(日志代码在最下面),我采用的是注解的配置方式,但是配置完以后发现我的AOP日志压根就没有执行,然后才发现我没有在配置文件中打开对AOP注解的支持,改完以后再次运行发现还是没有执行。

    想了一下,发现我配置AOP有问题。

      注意:因为我是分模块开发的,我的AOP日志类是写在了Controller中,但是我第一次配置的AOP注解支持是在Service中的spring的配置文件(Application.xml文件),但是这个配置文件扫描的包只有Service下面的才能被扫描到。

     唉,我人都傻了,我竟然犯了个这么低级的错误。

    所以,在SpringMVC的配置文件中引入 对AOP的支持即可,即在SpringMVC的配置文件中先引入SpringAOP的xml约束,

再在SpringMVC的配置文件中开启AOP注解支持即可

 

附:对Controller中的方法、用户操作信息、进行日志监控的代码

//AOP日志信息处理类
public class AOPLog {

    private Date beginTime;     //开始执行的时间
    private Class clazz;        //执行的类
    private Method method;      //执行的方法
    private String URL;         //访问路径

    @Autowired
    private HttpServletRequest request;
    @Resource(name = "sysLogService")
    private SysLogService sysLogService;

    //前置通知,获取执行的开始时间,执行的方法与类
    @Before("execution(* top.zhengry.SM_WH.controller.*.*(..))")
    public void AOPLogBefore(JoinPoint joinPoint) throws NoSuchMethodException {
        beginTime = new Date();                                 //获取开始时间
        clazz = joinPoint.getTarget().getClass();               //获取访问的类对象
        Object[] args = joinPoint.getArgs();                    //获取执行方法的参数列表
        String methodName = joinPoint.getSignature().getName(); //获取执行的方法名
        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);    //获取有参数的方法对象
        }

    }

    //后置通知
    @AfterReturning("execution(* top.zhengry.SM_WH.controller.*.*(..))")
    public void AOPLogAfter() throws Exception {
        //1、获取执行时长
        Date endTime = new Date();                              //执行结束的时间
        //执行时长
        Long excutionTime = endTime.getTime() - beginTime.getTime(); //访问的时长

        //2、获取访问者的真实IP
        //访问者的真实ip
        String IP = GetRealIP.getIpAddress(request);

        //3、获取访问的URL
        if (clazz != null && clazz != AOPLog.class){
            RequestMapping ClazzAnnotation = (RequestMapping)clazz.getAnnotation(RequestMapping.class);
            if (ClazzAnnotation != null){
                String ClazzPath = ClazzAnnotation.path()[0];
                RequestMapping MethodAnnotation = method.getAnnotation(RequestMapping.class);
                if (MethodAnnotation != null){
                    String MethodPath = MethodAnnotation.path()[0];
                    URL = ClazzPath + MethodPath;
                }
            }
        }

        //4、获取访问者的账户名称
        SecurityContext context = SecurityContextHolder.getContext();
        User user = (User)context.getAuthentication().getPrincipal();
        //访问者的账户名称
        String userName = user.getUsername();

        //5、把信息封装到SysLog这个POJO类里
        SysLog sysLog = new SysLog();
        sysLog.setExecutionTime(excutionTime);
        sysLog.setIp(IP);
        sysLog.setUsername(userName);
        sysLog.setUrl(URL);
        sysLog.setMethod("[类名] "+clazz.getName()+"[方法名] "+method.getName());
        sysLog.setVisitTime(beginTime);

        System.out.println(sysLog);

        sysLogService.saveSysLog(sysLog);
    }


}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值