<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>

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

          共 7869字,需瀏覽 16分鐘

           ·

          2021-03-01 16:34

          作者:CS打贏你

          blog.csdn.net/weixin_42533856/article/details/82593123

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

          一,技術(shù)要點: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";  //這里假設(shè)用戶是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è)的人,

          最近給大家找了,SSM框架外賣訂餐系統(tǒng)實戰(zhàn)教程 相關(guān)資源


          掃二維碼為,加我微信,回復(fù):SSM框架外賣訂餐系統(tǒng)實戰(zhàn)教程

           注意,一定不要亂回復(fù),對好暗號


          沒錯,不是機器人
          記得一定要等待,等待才有好東西


          瀏覽 42
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <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>
                  欧美美女操逼视频 | 男女啪啪啪啪啪啪网站 | 台湾 成人 国产 | 无码卡一卡二 | 欧美风情第一页 |