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>

        一個注解搞定 SpringBoot 接口防刷,還有誰不會?

        共 8061字,需瀏覽 17分鐘

         ·

        2021-07-11 07:39

        關注我們,設為星標,每天7:30不見不散,架構路上與您共享 

        回復"架構師"獲取資源

        說明:使用了注解的方式進行對接口防刷的功能,非常高大上,本文章僅供參考

        一,技術要點:springboot的基本知識,redis基本操作,

        首先是寫一個注解類:

        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攔截器中實現(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 {
         
                //判斷請求是否屬于方法的請求
                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進行判斷
                        //.....
                        key+=""+"1";  //這里假設用戶是1,項目中是動態(tài)獲取的userId
                    }
         
                    //從redis中獲取用戶訪問的次數(shù)
                    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){
                        //加1
                        redisService.incr(ak,key);
                    }else{
                        //超出訪問次數(shù)
                        render(response,CodeMsg.ACCESS_LIMIT_REACHED); //這里的CodeMsg是一個返回參數(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注冊到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("請求成功");
         
            }

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

        文章來源:https://blog.csdn.net/weixin_42533856/article/details/82593123





        到此文章就結束了。如果今天的文章對你在進階架構師的路上有新的啟發(fā)和進步,歡迎轉發(fā)給更多人。歡迎加入架構師社區(qū)技術交流群,眾多大咖帶你進階架構師,在后臺回復“加群”即可入群。







        這些年小編給你分享過的干貨

        1.第七期打卡送書5本(5月1日-6月1日)

        2.ERP系統(tǒng),自帶進銷存+財務+生產(chǎn)功能,拿來即用

        3.帶工作流的SpringBoot后臺管理項目快速開發(fā)解決方案
        4.最好的OA系統(tǒng),拿來即用,非常方便

        5.SpringBoot+Vue完整的外賣系統(tǒng),手機端和后臺管理,附源碼!

        轉發(fā)在看就是最大的支持??

        瀏覽 62
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        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毛片视频黑人 | 欧美成人在线视频观看 | 青青草成人小视频 | 性色av一区二区三区免费看开蚌 | 日本黄色免费看 | 99re8在线精品视频免费播放 | 午夜福利人人妻人人澡人人爽 | 午夜精品视频一区二区三区在线看 | 大屌操逼网 |