<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è)注解搞定 SpringBoot 接口防刷,還有誰(shuí)不會(huì)?

          共 8061字,需瀏覽 17分鐘

           ·

          2021-07-11 07:39

          關(guān)注我們,設(shè)為星標(biāo),每天7:30不見(jiàn)不散,架構(gòu)路上與您共享 

          回復(fù)"架構(gòu)師"獲取資源

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

          一,技術(shù)要點(diǎn):springboot的基本知識(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





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







          這些年小編給你分享過(guò)的干貨

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

          2.ERP系統(tǒng),自帶進(jìn)銷存+財(cái)務(wù)+生產(chǎn)功能,拿來(lái)即用

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

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

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

          瀏覽 62
          點(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>
                  国产女主播在线观看 | 在线免费小黄片 | 久操视频中文在线 | 日v在线| 日本免费的黄色视频 |