您的位置:首页 > 编程语言 > Java开发

基于Spring的AOP实现自定义annotation操作日志

2016-08-13 21:54 615 查看
引入项目需要的AOP包

<!--aop-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.5.3</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.6</version>
</dependency>
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.2.4</version>
</dependency>


要在springmvc的配置文件里加入配置文件,并指明切点类的的包,好被自动扫描

<aop:aspectj-autoproxy/>
<context:component-scan base-package="com..util"/>
<aop:aspectj-autoproxy proxy-target-class="true" />


首先编写一个annotation的注解类

import java.lang.annotation.*;
@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public  @interface SystemControllerLog {

String description()  default "";

}


其次在编写用户管理的切点类,记录用户操作的的时间,ip,操作

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.lang.reflect.Method;
import java.util.Date;

@Aspect
@Component
public class SystemLogAspect {

@Resource
private EwslogDao ewslogDao;

//Controller层切点,也就是上面那个注解的路径
@Pointcut("@annotation(com.util.SystemControllerLog)")
public  void controllerAspect() {
}

/**
* 前置通知 用于拦截Controller层记录用户的操作
*
* @param joinPoint 切点
*/
@Before("controllerAspect()")
public  void doBefore(JoinPoint joinPoint) {

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
HttpSession session = request.getSession();
//读取session中的用户
User user = (User) session.getAttribute("user");
String name ="";
if(user!=null){
name = user.getUsername();
}else
name = "匿名用户";
//请求的IP
String ip = request.getRemoteAddr();
String description="";
try {
description = getControllerMethodDescription(joinPoint);
} catch (Exception e) {
e.printStackTrace();
}
Ewslog ewslog = new Ewslog();
ewslog.setLoginName(name);
ewslog.setLogDate(new Date());
ewslog.setDescription(description);
ewslog.setIpAddr(ip);
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ip"+name);
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ip"+description);
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ip"+ip);
ewslogDao.save(ewslog);

}

public  static String getControllerMethodDescription(JoinPoint joinPoint)  throws Exception {
String targetName = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName();
Object[] arguments = joinPoint.getArgs();
Class targetClass = Class.forName(targetName);
Method[] methods = targetClass.getMethods();
String description = "";
for (Method method : methods) {
if (method.getName().equals(methodName)) {
Class[] clazzs = method.getParameterTypes();
if (clazzs.length == arguments.length) {
description = method.getAnnotation(SystemControllerLog. class).description();
break;
}
}
}
return description;
}
}


在需要记录的切面类上只需要添加一个注解就可以完成aop了。spring真是太强大了。

@RequestMapping("/loginOut")
@SystemControllerLog(description = "用户登出")
public String index(HttpServletRequest request){
HttpSession session = request.getSession();
session.setAttribute("user", null);
return "../index";
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring aop