20 接口防刷
1 添加注解
@AccessLimit(secondes=5, maxCount=5, neeLogin=true)
2 注解类定义

package com.imooc.miaosha.access;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Accesslimit {
int secondes(); int maxCount(); boolean needLogin() default true;}
3 拦截器
@Servicepublic class AccessInteceptor extends HandlerInterceptorAdapter {
@Autowired MiaoshaUserService miaoshaUserService; @Autowired RedisService redisService; public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if(handler instanceof HandlerMethod){
MiaoshaUser miaoshaUser = getUser(request, response); UserContext.setUser(miaoshaUser); HandlerMethod hm = (HandlerMethod) handler; AccessLimit accessLimit = hm.getMethodAnnotation(AccessLimit.class); if(accessLimit == null){
return true; }
int seconds = accessLimit.seconds(); int maxCount = accessLimit.maxCount(); boolean needLogin = accessLimit.needLogin(); String key = request.getRequestURI(); if(needLogin){
if(miaoshaUser == null){
render(response, CodeMsg.SESSION_ERROR); return false; }
key += "_" + miaoshaUser.getId(); }else{
// do nothing }
// 查询访问的次数 String uri = request.getRequestURI(); key = uri + "_" + miaoshaUser.getId(); AccessKey ak = AccessKey.withExpire(seconds); Integer count = redisService.get(ak, key, Integer.class); if(count == null){
redisService.set(ak, key, 1); }else if(count < maxCount){
redisService.incr(ak, key); }else{
render(response, CodeMsg.ACCESS_LIMIT_REACHED); return false; }
}
return true;
}
4 将拦截器添加到配置里面
@Overridepublic void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(accessInteceptor);}
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

浙公网安备 33010602011771号