1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        一個(gè)注解搞定 Spring Boot 接口防刷

        共 7972字,需瀏覽 16分鐘

         ·

        2021-07-21 23:57

        點(diǎn)擊下方“IT牧場(chǎng)”,選擇“設(shè)為星標(biāo)”

        一,技術(shù)要點(diǎn):Spring Boot的基本知識(shí),Redis基本操作,

        首先是寫(xiě)一個(gè)注解類:

        import java.lang.annotation.Retention;
        import java.lang.annotation.Target;
         
        import static java.lang.annotation.ElementType.METHOD;
        import static java.lang.annotation.RetentionPolicy.RUNTIME;
         
        @Retention(RUNTIME)
        @Target(METHOD)
        public @interface AccessLimit {
         
            int seconds();
            int maxCount();
            boolean needLogin()default true;
        }

        接著就是在Interceptor攔截器中實(shí)現(xiàn):

        import com.alibaba.fastjson.JSON;
        import com.example.demo.action.AccessLimit;
        import com.example.demo.redis.RedisService;
        import com.example.demo.result.CodeMsg;
        import com.example.demo.result.Result;
        import org.springframework.beans.factory.annotation.Autowired;
        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;
         
        @Component
        public class FangshuaInterceptor extends HandlerInterceptorAdapter {
         
            @Autowired
            private RedisService redisService;
         
            @Override
            public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
         
                //判斷請(qǐng)求是否屬于方法的請(qǐng)求
                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 = request.getRequestURI();
                    //如果需要登錄
                    if(login){
                        //獲取登錄的session進(jìn)行判斷
                        //.....
                        key+=""+"1";  //這里假設(shè)用戶是1,項(xiàng)目中是動(dòng)態(tài)獲取的userId
                    }
         
                    //從redis中獲取用戶訪問(wèn)的次數(shù)
                    AccessKey ak = AccessKey.withExpire(seconds);
                    Integer count = redisService.get(ak,key,Integer.class);
                    if(count == null){
                        //第一次訪問(wèn)
                        redisService.set(ak,key,1);
                    }else if(count < maxCount){
                        //加1
                        redisService.incr(ak,key);
                    }else{
                        //超出訪問(wèn)次數(shù)
                        render(response,CodeMsg.ACCESS_LIMIT_REACHED); //這里的CodeMsg是一個(gè)返回參數(shù)
                        return false;
                    }
                }
         
                return true;
         
            }
            private void render(HttpServletResponse response, CodeMsg cm)throws Exception {
                response.setContentType("application/json;charset=UTF-8");
                OutputStream out = response.getOutputStream();
                String str  = JSON.toJSONString(Result.error(cm));
                out.write(str.getBytes("UTF-8"));
                out.flush();
                out.close();
            }
        }

        再把Interceptor注冊(cè)到springboot中

        import com.example.demo.ExceptionHander.FangshuaInterceptor;
        import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.context.annotation.Configuration;
        import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
        import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

        @Configuration
        public class WebConfig extends WebMvcConfigurerAdapter {
         
            @Autowired
            private FangshuaInterceptor interceptor;
         
         
            @Override
            public void addInterceptors(InterceptorRegistry registry) {
                registry.addInterceptor(interceptor);
            }
        }

        接著在Controller中加入注解

        import com.example.demo.result.Result;
        import org.springframework.stereotype.Controller;
        import org.springframework.web.bind.annotation.RequestMapping;
        import org.springframework.web.bind.annotation.ResponseBody;
         
        @Controller
        public class FangshuaController {
         
            @AccessLimit(seconds=5, maxCount=5, needLogin=true)
            @RequestMapping("/fangshua")
            @ResponseBody
            public Result<String> fangshua(){
         
         
                return Result.success("請(qǐng)求成功");
         
            }

        本文有參考其他視頻的教學(xué),希望可以幫助更多熱愛(ài)it行業(yè)的人,

        文章來(lái)源:https://blog.csdn.net/weixin_42533856/article/details/82593123

        干貨分享

        最近將個(gè)人學(xué)習(xí)筆記整理成冊(cè),使用PDF分享。關(guān)注我,回復(fù)如下代碼,即可獲得百度盤(pán)地址,無(wú)套路領(lǐng)?。?/p>

        ?001:《Java并發(fā)與高并發(fā)解決方案》學(xué)習(xí)筆記;?002:《深入JVM內(nèi)核——原理、診斷與優(yōu)化》學(xué)習(xí)筆記;?003:《Java面試寶典》?004:《Docker開(kāi)源書(shū)》?005:《Kubernetes開(kāi)源書(shū)》?006:《DDD速成(領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)速成)》?007:全部?008:加技術(shù)群討論

        加個(gè)關(guān)注不迷路

        喜歡就點(diǎn)個(gè)"在看"唄^_^

        瀏覽 66
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            一级免费大奶片 | 国产精品白虎 | 免费看逼逼 | 偷拍视频免费在线观看 | 打飞机免费网站 | 国产精品成人a免费观看 | 操人黄片 | 偷偷碰偷偷鲁免费视频一区 | 男女一进一出免费视频 | 国产成人一区二区三区A片免费 |