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;">

posted @ 2021-07-10 22:07  weidalin  阅读(73)  评论(0)    收藏  举报