<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一個(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基本操作,

          首先是寫一個(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ù)如下代碼,即可獲得百度盤地址,無(wú)套路領(lǐng)??!

          ?001:《Java并發(fā)與高并發(fā)解決方案》學(xué)習(xí)筆記;?002:《深入JVM內(nèi)核——原理、診斷與優(yōu)化》學(xué)習(xí)筆記;?003:《Java面試寶典》?004:《Docker開源書》?005:《Kubernetes開源書》?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)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  91视频爱爱| 小泽玛利亚av在线 | 久久国产黄色视频 | 美女日逼视频 | 一级丰满视频 |