当前位置:   article > 正文

SpringBoot自定义注解+Redis+拦截器实现限流_setpathmatcher

setpathmatcher

1.添加redis 依赖包

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-redis</artifactId>
  4. </dependency>

2.自定义注解 AccessLimit

  1. @Inherited
  2. @Documented
  3. @Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD})
  4. @Retention(RetentionPolicy.RUNTIME)
  5. public @interface AccessLimit {
  6. //标识 指定sec时间段内的访问次数限制
  7. int limit() default 5;
  8. //标识 时间段
  9. int seconds() default 5;
  10. }

3. 添加拦截器 AccessLimitInterceptor 

  1. public class AccessLimitInterceptor implements HandlerInterceptor {
  2. @Autowired
  3. private RedisTemplate<String, Integer> redisTemplate;
  4. @Override
  5. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  6. if (handler instanceof HandlerMethod) {
  7. HandlerMethod handlerMethod = (HandlerMethod) handler;
  8. Method method = handlerMethod.getMethod();
  9. if (!method.isAnnotationPresent(AccessLimit.class)) {
  10. return true;
  11. }
  12. AccessLimit accessLimit = method.getAnnotation(AccessLimit.class);
  13. if (accessLimit == null) {
  14. return true;
  15. }
  16. int limit = accessLimit.limit();
  17. int sec = accessLimit.seconds();
  18. String key = IPUtil.getIpAddr(request) + request.getRequestURI();
  19. Integer maxLimit = redisTemplate.opsForValue().get(key);
  20. if (maxLimit == null) {
  21. //set时一定要加过期时间
  22. redisTemplate.opsForValue().set(key, 1, sec, TimeUnit.SECONDS);
  23. } else if (maxLimit < limit) {
  24. redisTemplate.opsForValue().set(key, maxLimit + 1, sec, TimeUnit.SECONDS);
  25. } else {
  26. output(response, "请求太频繁!");
  27. return false;
  28. }
  29. }
  30. return true;
  31. }
  32. public void output(HttpServletResponse response, String msg) throws IOException {
  33. response.setContentType("application/json;charset=UTF-8");
  34. ServletOutputStream outputStream = null;
  35. try {
  36. outputStream = response.getOutputStream();
  37. outputStream.write(msg.getBytes("UTF-8"));
  38. } catch (IOException e) {
  39. e.printStackTrace();
  40. } finally {
  41. outputStream.flush();
  42. outputStream.close();
  43. }
  44. }
  45. @Override
  46. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
  47. }
  48. @Override
  49. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
  50. }
  51. }

 4.方法上加上注解  @AccessLimit(seconds = 60,limit = 3)

 

  1. @Slf4j
  2. @RestController
  3. @RequestMapping("/app/user/login")
  4. @AllArgsConstructor
  5. public class AppUserLoginController {
  6. private final IUserService userService;
  7. @AccessLimit(seconds = 60,limit = 3)
  8. @PostMapping("/getVerificationCode")
  9. public RestResponse getVerificationCode(@RequestParam("mobile") String mobile) {
  10. try {
  11. if (!StringRegexUtils.verifyMobilePhone(mobile)) {
  12. return RestResponse.fail("手机号不正确");
  13. }
  14. if (userService.getVerificationCode(mobile, 0)) {
  15. return RestResponse.success();
  16. }
  17. } catch (Exception e) {
  18. e.printStackTrace();
  19. log.error(e.getMessage());
  20. return RestResponse.fail(e.getMessage());
  21. }
  22. return RestResponse.fail();
  23. }

 }

5.注入拦截器

  1. @Configuration
  2. public class WebInterceptorAdapter implements WebMvcConfigurer {
  3. @Bean
  4. public HandlerInterceptor getInterceptor() {
  5. return new AccessLimitInterceptor();
  6. }
  7. @Override
  8. public void configurePathMatch(PathMatchConfigurer configurer) {
  9. AntPathMatcher pathMatcher = new AntPathMatcher();
  10. pathMatcher.setCaseSensitive(false);
  11. configurer.setPathMatcher(pathMatcher);
  12. }
  13. @Override
  14. public void addInterceptors(InterceptorRegistry registry) {
  15. registry.addInterceptor(getInterceptor());
  16. }
  17. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/413427
推荐阅读
相关标签
  

闽ICP备14008679号