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 接口防刷

        共 7741字,需瀏覽 16分鐘

         ·

        2021-08-09 20:35


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

        首先是寫一個(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 {
         
                //判斷請求是否屬于方法的請求
                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中獲取用戶訪問的次數(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是一個(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注冊到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("請求成功");
         
            }

        本文有參考其他視頻的教學(xué),希望可以幫助更多熱愛it行業(yè)的人,文章來源:https://blog.csdn.net/weixin_42533856/article/details/82593123

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

        瀏覽 36
        點(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片在线观看 | 中国美女操逼的视频 | 日本嗯黄色网址 | 就要爱综合 | 三级黄视频| 亚洲区综合 | 香蕉女久久久久久久久久 | 日逼片一级片 | 日韩不卡中文字幕 |