aop记录用户操作

转载 2017年09月18日 15:53:07

转载: http://www.cnblogs.com/guokai870510826/p/5981015.html


使用标签来设置需要的记录

实例:@ISystemLog()

@Controller
@RequestMapping("test")
public class TestController {
    @RequestMapping(value = "test.do", method = RequestMethod.GET)
    @ISystemLog(module = "TestController",methods = "test")
    public ModelAndView test(HttpServletRequest request, HttpServletResponse response) throws Exception {
        HttpServletRequest request1 = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        return new ModelAndView("/login");
    }
}



创建ISystemLog

package com.helka.cmis.common.utils.log;

import java.lang.annotation.*;
@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ISystemLog {
    String module()  default "";
    String methods()  default "";
}

创建LogAopAction

package com.helka.cmis.common.utils.log;

import com.helka.cmis.common.utils.LogEntity;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.context.request.ServletWebRequest;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;

@Aspect
public class LogAopAction {

//    @Resource(name="logService")
//    private LogServiceImpl logservice;

    //配置接入点,如果不知道怎么配置,可以百度一下规则
    @Pointcut("execution(* com.kintech.*.controller..*.*(..))")
    private void controllerAspect(){}
//    @Autowired
//    private  HttpServletRequest request;

    //@Around("execution(* org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(..))")
    @Around("controllerAspect()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        //常见日志实体对象
        LogEntity log = new LogEntity();
        //获取登录用户账户
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();

        ServletWebRequest servletWebRequest=new ServletWebRequest(request);
        HttpServletResponse response=servletWebRequest.getResponse();

        String name = (String) request.getSession().getAttribute("USER_ID");
        log.setAccount(name);
        //获取系统时间
        String time = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss").format(new Date());
        log.setCreatetime(time);

        String ip = request.getHeader("X-Real-IP");
        log.setIp(ip);

        long start = System.currentTimeMillis();
        // 拦截的实体类,就是当前正在执行的controller
        Object target = pjp.getTarget();
        // 拦截的方法名称。当前正在执行的方法
        String methodName = pjp.getSignature().getName();
        // 拦截的方法参数
        Object[] args = pjp.getArgs();
        // 拦截的放参数类型
        Signature sig = pjp.getSignature();
        MethodSignature msig = null;
        if (!(sig instanceof MethodSignature)) {
            throw new IllegalArgumentException("该注解只能用于方法");
        }
        msig = (MethodSignature) sig;
        Class[] parameterTypes = msig.getMethod().getParameterTypes();

        Object object = null;
        // 获得被拦截的方法
        Method method = null;
        try {
            method = target.getClass().getMethod(methodName, parameterTypes);
        } catch (NoSuchMethodException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (SecurityException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        if (null != method) {
            // 判断是否包含自定义的注解,说明一下这里的SystemLog就是我自己自定义的注解
            if (method.isAnnotationPresent(ISystemLog.class)) {
                ISystemLog systemlog = method.getAnnotation(ISystemLog.class);
                log.setModule(systemlog.module());
                log.setMethod(systemlog.methods());
                try {
                    object = pjp.proceed();
                    long end = System.currentTimeMillis();
                    //将计算好的时间保存在实体中
                    log.setUsedtime(end-start);
                    log.setCommit("Success!");
                    //保存进数据库
                    //logservice.saveLog(log);
                } catch (Throwable e) {
                    // TODO Auto-generated catch block
                    long end = System.currentTimeMillis();
                    log.setUsedtime(end-start);
                    log.setCommit("Failed");
                    //logservice.saveLog(log);
                }
            } else {//没有包含注解
                object = pjp.proceed();
            }
        } else { //不需要拦截直接执行
            object = pjp.proceed();
        }
        return object;
    }
}

创建数据库的映射实体

public class LogEntity {

    private int id;
    private String account;
    private String module;
    private String method;
    private long usedtime;
    private String ip;
    private String createtime;
    private String commit;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getAccount() {
        return account;
    }

    public void setAccount(String account) {
        this.account = account;
    }

    public String getModule() {
        return module;
    }

    public void setModule(String module) {
        this.module = module;
    }

    public String getMethod() {
        return method;
    }

    public void setMethod(String method) {
        this.method = method;
    }

    public long getUsedtime() {
        return usedtime;
    }

    public void setUsedtime(long usedtime) {
        this.usedtime = usedtime;
    }

    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip;
    }

    public String getCreatetime() {
        return createtime;
    }

    public void setCreatetime(String createtime) {
        this.createtime = createtime;
    }

    public String getCommit() {
        return commit;
    }

    public void setCommit(String commit) {
        this.commit = commit;
    }


}

配置文件:

springmvc-servlet.xml

<aop:aspectj-autoproxy proxy-target-class="true" />
    <bean id="logAopAction" class="com.helka.cmis.common.utils.log.LogAopAction" />




AOP实现用户操作日志记录

一、自定义注解在使用aop切面拦截的时候需要统一的日志描述,这个日志描述,我们使用自定义注解来为每个方法添加日志自定义描述内容。创建一个自定义注解类@Target({ElementType.PARAM...
  • qq_32657581
  • qq_32657581
  • 2017-10-16 14:55:21
  • 292

spring aop 实现用户操作日志记录功能

LogAspect.javapackage com.yangjf.commons; import java.lang.reflect.Method; import java.util.Date; ...
  • qq_27242475
  • qq_27242475
  • 2016-04-14 15:41:22
  • 5031

使用Spring AOP使用注解记录用户操作日志

1.自定义注解,记录操作日志 1.自定义注解 package com.jay.demo3.aop1.myannotation; import java.lang.annotation.Docum...
  • he90227
  • he90227
  • 2015-03-10 14:57:08
  • 13939

SpringAOP注解方式记录操作日志(操作模块,操作功能,调用方法,主键信息等)支持多笔操作时记录

使用AOP切入的方式记录操作日志,本代码主要采用枚举作为记录方式,具体代码如下. 首先先定义先关枚举: /** * 枚举公共接口 * @author LeiYong * */ public i...
  • leiyong0326
  • leiyong0326
  • 2016-07-26 20:11:22
  • 1125

springMVC +Mybatis +spring aop 实现用户系统操作日志记录

业务场景:业务要求记录用户在系统的操作行为,并保存到数据库当中。 1、自定义注解,记录操作日志 import java.lang.annotation.Documented; import jav...
  • zhouzhiwengang
  • zhouzhiwengang
  • 2017-02-18 10:15:38
  • 2041

《web工程aop实现前台操作日志记录》初稿

写日志功能很繁琐,博主废了一些时间写出来分享,用的ssm框架,后期会设置优先级,避免所有方法都会被记录到日志。开始: 1、首先定义一个自定义注解@controllerLog和@serviceLog ...
  • zhou183911029
  • zhou183911029
  • 2017-05-04 16:41:11
  • 2478

spring aop 操作日志

  • 2014年06月04日 00:14
  • 364KB
  • 下载

Spring AOP 自定义注解记录操作日志

1.自定义注释 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Inherited public @interface...
  • ab7253957
  • ab7253957
  • 2016-03-16 13:24:05
  • 3312

Spring AOP 实现系统操作日志记录

AOP的相关术语: 1. 通知(Advice): 通知定义了切面是什么以及何时使用。描述了切面要完成的工作和何时需要执行这个工作。 2. 连接点(Joinpoint): 程序能够应用通知的一个“时...
  • fenghai22
  • fenghai22
  • 2016-07-06 17:10:24
  • 7475
收藏助手
不良信息举报
您举报文章:aop记录用户操作
举报原因:
原因补充:

(最多只允许输入30个字)