1.引入jar包
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.4</version> </dependency>
2.aop日志类
@Log4j2 @Aspect @Component public class WebLogAspect { @Pointcut("execution(public * io.renren.controller.*.*(..))") public void logCut() { } @Before("logCut()") public void doBefore(JoinPoint joinPoint) { // 接收到请求,记录请求内容 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); log.info("请求地址 : " + request.getRequestURL().toString()); log.info("参数 : " + Arrays.toString(joinPoint.getArgs())); } @Around("logCut()") public Object doAround(ProceedingJoinPoint pjp) throws Throwable { long startTime = System.currentTimeMillis(); Object ob = pjp.proceed();// ob 为方法的返回值 log.info("请求耗时 : " + (System.currentTimeMillis() - startTime) / 1000.0 + "s"); return ob; } }
再次启动项目,控制台将输出日志,并将日志写入到文件中
3.利用aop实现表单防重复提交
方法1:
1.后端生成一个唯一的提交令牌(token),并存储在缓存中。
2.页面提交请求携带这个提交令牌,后端验证并在第一次验证后删除该令牌,保证提交请求的唯一性。
方法2:
1.自定义注解 @NoRepeatSubmit
标记Controller中的提交请求
2.通过AOP 对所有标记了 @NoRepeatSubmit
的方法拦截
3.在业务方法执行前,获取当前用户的 token + 当前请求地址,作为一个唯一 KEY,去获取锁
4.业务方法执行后,释放锁