网络知识 娱乐 Spring Boot接口限制访问次数

Spring Boot接口限制访问次数

定义注解

import java.lang.annotation.ElementType;nimport java.lang.annotation.Retention;nimport java.lang.annotation.RetentionPolicy;nimport java.lang.annotation.Target;nn/**n * 接口防刷注解类n * @Author: Cyzn * @Description:n * @Date: create in 2022/6/28 16:55n */n@Retention(RetentionPolicy.RUNTIME)n@Target(ElementType.METHOD)npublic @interface AccessLimit {n int seconds();n int maxCount();n boolean needLogin() default true;n}

编写接口防刷拦截器

import com.cyz.blog.utils.AccessLimit;nimport org.springframework.beans.factory.annotation.Autowired;nimport org.springframework.data.redis.core.RedisTemplate;nimport org.springframework.stereotype.Component;nimport org.springframework.web.method.HandlerMethod;nimport org.springframework.web.servlet.handler.HandlerInterceptorAdapter;nnimport javax.servlet.http.HttpServletRequest;nimport javax.servlet.http.HttpServletResponse;nimport java.io.OutputStream;nn/**n * 接口防刷拦截器n * @Author: Cyzn * @Description:n * @Date: create in 2022/6/28 16:58n */n@Componentnpublic class AntiBrushInterceptor extends HandlerInterceptorAdapter {nn @Autowiredn private RedisTemplate redisTemplate;nnn @Overriden public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {n //判断请求是否属于方法的请求n if(handler instanceof HandlerMethod){n HandlerMethod handlerMethod=(HandlerMethod) handler;nn //获取方法中的注解,看是否有该注解n AccessLimit accessLimit = handlerMethod.getMethodAnnotation(AccessLimit.class);n if(accessLimit==null){n return true;n }n int seconds = accessLimit.seconds();n int maxcount = accessLimit.maxCount();n boolean login = accessLimit.needLogin();n String key = request.getRequestURI();n //如果需要登录n if(login){n //获取登录的session进行判断n //.......n// key+=""+"1"; //用户id userIdn }nn //从redis中获取用户访问的次数n // AccessKey ak = AccessKey.withExpire(seconds);n Integer count= (Integer)redisTemplate.opsForValue().get(key);n if(count==null){n //第一次访问n redisTemplate.opsForValue().set(key,1);n }else if(count<maxcount){n //加1n redisTemplate.opsForValue().set(key,(Integer)redisTemplate.opsForValue().get(key)+1,seconds, TimeUnit.SECONDS);n }else{n //超出访问次数n System.out.println(key+":访问次数超多!!!");n render(response,key+":请您休息片刻再试试!");n return false;n }n }n return true;n }nn private void render(HttpServletResponse response, String message)throws Exception {n response.setContentType("application/json;charset=UTF-8");n OutputStream out = response.getOutputStream();n String data = "{"code":501,"flag":false,"message":"+message+"}";n out.write(data.getBytes("UTF-8"));n out.flush();n out.close();n }n}

将拦截器注册到spring容器中

import org.springframework.beans.factory.annotation.Autowired;nimport org.springframework.context.annotation.Configuration;nimport org.springframework.web.servlet.config.annotation.InterceptorRegistry;nimport org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;nn/**n * @Author: Cyzn * @Description:n * @Date: create in 2022/6/28 17:01n */n@Configurationnpublic class WebConfig extends WebMvcConfigurerAdapter {n @Autowiredn private AntiBrushInterceptor interceptor;nn @Overriden public void addInterceptors(InterceptorRegistry registry) {n registry.addInterceptor(interceptor);n }n}

controller接口编写

@AccessLimit(seconds = 5,maxCount = 5,needLogin = true)

接口防刷测试


Spring Boot接口限制访问次数

参考原文:cyz