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

          一個注解搞定 Spring Boot 接口防刷

          共 7741字,需瀏覽 16分鐘

           ·

          2021-08-09 20:35


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

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

          瀏覽 36
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <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>
                  欧美日韩国产123区 | 91人人干| 97视频手机在线观看 | 色婷婷色婷婷 | 国产丝袜足交视频 |