在Spring中AOP为面向切面编程,可以通过AOP记录用户访问的接口次数,AOP可以不影响原有的代码。
@Component
@Aspect
public class LogAop {
@Resource
private HttpServletRequest request;
@Resource
private ISysLogService sysLogService;
private Date visitTime;//开始访问的时间
private Class clazz;//访问的类
private Method method;//访问的方法
//前置通知
@Before("execution(* com.gcu.panda.controller.*.*(..))")
public void doBefore(JoinPoint jp) throws NoSuchMethodException {
visitTime = new Date();
clazz = jp.getTarget().getClass();
String methodName = jp.getSignature().getName();
Object[] args = jp.getArgs();
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();
}
clazz.getMethod(methodName,classArgs);
}
}
//后置通知
@After("execution(* com.gcu.panda.controller.*.*(..))")
public void doAfter(JoinPoint pt) {
//获取访问时长
long time = System.currentTimeMillis() - visitTime.getTime();
String url="";
//获取url
if(clazz!=null&&method!=null&&clazz!=LogAop.class){
//1.获取类上的RequestMapping值
RequestMapping classAnnotation =(RequestMapping) clazz.getAnnotation(RequestMapping.class);
if(classAnnotation!=null){
String[] classValue=classAnnotation.value();
//2.获取mapping值
RequestMapping methodAnnotation = method.getAnnotation(RequestMapping.class);
if(methodAnnotation!=null){
String[] methodValue=methodAnnotation.value();
url=classValue[0]+methodValue[0];
//获取访问的ip地址
String ip=request.getRemoteAddr();
//获取当前操作用户
String username= UserHolder.getUser().getUsername();
//封装日志信息
SysLog sysLog=new SysLog();
sysLog.setExecutionTime(time);
sysLog.setIp(ip);
sysLog.setUrl(url);
sysLog.setUsername(username);
sysLog.setMethod("[类名] "+clazz.getName() +"[方法名] "+method.getName() );
//记录操作
sysLogService.save(sysLog);
}
}
}
}
}
首先在类上定义@Aspect注解和@Component,通过@Before前置通知可以记录开始访问的时间,@After后置通知记录访问的接口,时间,ip。