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

    xiaoxiao2025-01-25  4

    引入项目需要的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"; }
    转载请注明原文地址: https://ju.6miu.com/read-1295751.html
    最新回复(0)