1. 程式人生 > >springboot實現自定義註解

springboot實現自定義註解

1:引入jar包

<!-- Spring Boot aop 代理 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

2:定義自定義註解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Order
(Ordered.HIGHEST_PRECEDENCE) public @interface RequestLimit { //訪問次數 int count() default 2; //單位分鐘 int time() default 5; }

3:新增切面,定義切點

@Aspect
@Component
public class RequestLimitContract {

    @Autowired
private JedisTemplate jedisTemplate;
@Pointcut("@annotation(com.mryx.gus.annotation.RequestLimit)"
) public void annotationPointCut() { } @Before("annotationPointCut()") public Object before(JoinPoint joinPoint) { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); String comCode = request.getParameterMap().get("com_code"
)[0]; if (StringUtils.isEmpty(comCode)) { request.setAttribute("success", false); request.setAttribute("message", "貨主為空"); return ResponseDto.createFailureResponse("貨主為空"); } MethodSignature sign = (MethodSignature) joinPoint.getSignature(); Method method = sign.getMethod(); RequestLimit annotation = method.getAnnotation(RequestLimit.class); String count = jedisTemplate.get(comCode); Integer timeout; if (StringUtils.isEmpty(count)) { jedisTemplate.setex(comCode, "1", annotation.time() * 60); } else { Integer num = Integer.valueOf(count); if (num == annotation.count()) { request.setAttribute("success", false); request.setAttribute("message", "超出訪問上線"); return ResponseDto.createFailureResponse("超出訪問上線"); } timeout = jedisTemplate.ttl(comCode); jedisTemplate.setex(comCode, String.valueOf(Integer.valueOf(count) + 1), timeout); } request.setAttribute("success", true); request.setAttribute("message", "成功"); return ResponseDto.createSuccessResponse("成功"); } }

4:定義Controller

@RestController
@RequestMapping("url")
public class URLController {

    
@RequestLimit(count = 2,time = 5)
@RequestMapping("/test") public String test(@PathVariable("user") User user,HttpServletRequest request) { return "成功:" + name;}}

5:http://localhost:8080/url/test/xiaoming

直接訪問就OK