import java.lang.annotation.Retention; import java.lang.annotation.Target; import static java.lang.annotation.ElementType.METHOD; import static java.lang.annotation.RetentionPolicy.RUNTIME; /** * @author Yang * @version 1.0 * @date 2021/2/22 10:28 */ @Retention(RUNTIME) @Target(METHOD) public @interface AccessLimit { int seconds(); int maxCount(); boolean needLogin() default true; }
import com.alibaba.fastjson.JSON; import com.mengxiangnongfu.payment.annotation.AccessLimit; import com.mengxiangnongfu.payment.commons.RedisUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.stereotype.Component; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.OutputStream; /** * @author Yang * @version 1.0 * @date 2021/2/22 10:29 */ @Component public class FangshuaInterceptor extends HandlerInterceptorAdapter { @Autowired private RedisUtil redisUtil; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //判断请求是否属于方法的请求 if (handler instanceof HandlerMethod) { HandlerMethod hm = (HandlerMethod) handler; //获取方法中的注解,看是否有该注解 AccessLimit accessLimit = hm.getMethodAnnotation(AccessLimit.class); if (accessLimit == null) { return true; } int seconds = accessLimit.seconds(); int maxCount = accessLimit.maxCount(); boolean login = accessLimit.needLogin(); String key = "1"; //如果需要登录 if (login) { //获取登录的session进行判断 //..... key += "" + "1"; //这里假设用户是1,项目中是动态获取的userId } //从redis中获取用户访问的次数 Integer count = (Integer) redisUtil.get(key); if (count == null) { //第一次访问 redisUtil.set(key, 1, seconds); } else if (count < maxCount) { //加1 redisUtil.incr(key, 1); } else { //超出访问次数 render(response, "请求过于频繁~请稍后再试~"); //这里的CodeMsg是一个返回参数 return false; } } return true; } private void render(HttpServletResponse response, String cm) throws Exception { response.setContentType("application/json;charset=UTF-8"); OutputStream out = response.getOutputStream(); String str = JSON.toJSONString(cm); out.write(str.getBytes("UTF-8")); out.flush(); out.close(); } }
Das obige ist der detaillierte Inhalt vonSo implementieren Sie Interface-Anti-Brushing im SpringBoot-Projekt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!