Hey AOP日志
Sharp tools make good work. – 工欲善其事,必先利其器.
我们开发的每个功能都是提供给客户使用,当客户对某个功能进行操作时,我们是怎么知道该用户在操作什么呢,在执行哪个功能呢,所以我们需要有日志进行记录客户的操作,方便我们管理.
首先导入日志的依赖包 (日志无非就是在操作某个功能是进行拦截,并且记录当前用户,其实就是动态代理)
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
</dependency>
编写一个注解 用于存放操作人和操作目标
/*
* 日志的注解
* */
@Target(value ={ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface LogAnnoation {
// 访问的方法
String operationType();
// 操作的名称
String operationName();
}
在 需要进行操作的controller上面进行加此注解
@LogAnnoation(operationType = "Login",operationName = "管理员登录")
@RequestMapping("/login")
public String Login(String username,String password) throws Exception {
try{
userService.loginUser(username,password);
return "success";
}catch(Exception e){
throw e;
}
}
写一个AOP 工具类进行AOP 操作 当访问功能方法时 进行扫描,记录下来当前的用户与操作
@Aspect
@Component
public class LogAspectUtils {
@Pointcut("execution(* com.master..controller.*.*(..))")
public void pointCut(){
}
// 后置操作 当执行完方法后进行执行此操作
@AfterReturning(pointcut = "pointCut()",returning = "o")
public void afterResult(JoinPoint joinPoint, Object o) throws ClassNotFoundException {
// 得到类的名字
String classname = joinPoint.getTarget().getClass().getName();
// 得到目标方法的名字
String methodname = joinPoint.getSignature().getName();
// 获取参数
Object[] args = joinPoint.getArgs();
// 得到所有的方法
Class<?> aClass = Class.forName(classname);
Method[] methods = aClass.getMethods();
for (Method method : methods) {
// 判断该类的方法与目标方法是否一致
if(method.getName().equalsIgnoreCase(methodname)){
// 获取上面的注解
LogAnnoation annotation = method.getAnnotation(LogAnnoation.class);
if(annotation!=null){
// 得到注解上面的值
String operationName = annotation.operationName();
// 得到 操作的功能
String operationType = annotation.operationType();
SysAdmin user = ((SysAdmin) SecurityUtils.getSubject().getSession().getAttribute("user"));
System.out.println(operationName+"--> 被执行了--("+operationType+"),--> 参数是:-->"+ Arrays.deepToString(args)+(user == null?"":" 操作用户是-->"+user.getName())+" --> 时间是:"+(new Date()));
}
}
}
}
获得日志后,就可以进行放到缓存或者数据库里了,方便查看管理.