目录
- 0. 前言
- 1. 使用Filter实现
- 2. 使用AOP实现
- 1. 导入依赖
- 2. 写一个切面类,实现统计访问次数。
- 3. 开启AOP
- 4. 测试
- 5. plus版本
- (1) 新建一个bean类
- (2) 新增一个controller方法
- (3) 新增一个循环增强方法
- (4) 测试
- 3. 使用springMVC拦截器实现
0. 前言
准备一个Controller,用来测试。
@RestController
@RequestMapping("test")
@Tag(name = "测试",description = "测试springMVC拦截器实现记录访问次数")
public class TestController {@GetMapping("getInfo/{id}")public String test(@PathVariable Integer id) {switch (id){case 1:return "1";case 2:return "2";default:return "3";}}
}
访问次数,记录用户访问的次数,一般有如下几种方案:
1. 使用Filter实现
emm有点麻烦,以后再说。
2. 使用AOP实现
在springboot中使用AOP。
1. 导入依赖
<!-- AOP依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>
2. 写一个切面类,实现统计访问次数。
@Aspect // 表示这是一个切面
@Component // 托管到spring容器中
public class AccessRecordAspect {@Autowiredprivate RedisTemplate<String,Object> redisTemplate;// 定义切点 匹配TestController中的test*方法@Pointcut("execution(* com.huan.web.controllers.TestController.test*(..))")public void a(){}// 使用后置增强,在方法正确执行后执行@AfterReturning("a()")public void record(JoinPoint joinPoint){System.out.println("记录访问记录");// 获取目标方法参数Object[] args = joinPoint.getArgs();System.out.println(args[0]);redisTemplate.opsForValue().increment("访问的数据:"+args[0]);}
}
3. 开启AOP
@Configuration
@ComponentScan
@EnableCaching // 开启缓存功能
@EnableAspectJAutoProxy // 开启aop功能
public class AppConfig {
}
4. 测试
访问http://localhost:8080/test/getInfo/1
进行测试,测试结果。
5. plus版本
使用循环增强实现,并将将redis中的记录的数据返回给前端。
(1) 新建一个bean类
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class TestBean {private Integer id;private Long praise;
}
(2) 新增一个controller方法
在新增的controller方法中,返回一个map,将数据返回给前端。
@GetMapping("getInfo-getPraise/{id}")
public Map<String,Object> testPraise(@PathVariable Integer id) {Map<String,Object> map = new HashMap<>();TestBean testBean = null;testBean.setId(id);map.put("code",1);map.put("obj",testBean);return map;
}
(3) 新增一个循环增强方法
在新增的循环增强方法中,统计访问次数,并将访问次数返回给前端。
@Pointcut("execution(* com.huan.web.controllers.TestController.testPraise*(..))")
public void c(){}
@Around("c()")
public Object showPraise_test(ProceedingJoinPoint joinPoint){System.out.println("showPraise_test显示点赞数");//运行目标方法返回的值Object proceed = null;try {proceed = joinPoint.proceed();} catch (Throwable e) {throw new RuntimeException(e);}Map<String,Object> map = (Map<String, Object>) proceed;TestBean testBean = (TestBean) map.get("obj");testBean.setPraise(redisTemplate.opsForValue().increment("PraiseNumById-test:"+testBean.getId()));return proceed;
}
(4) 测试
3. 使用springMVC拦截器实现
在我之前的文章里写过,这里就不重复了。