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

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

          共 8427字,需瀏覽 17分鐘

           ·

          2021-07-11 08:37

          點擊上方 Java后端編程 ,選擇“置頂公眾號”

          優(yōu)質(zhì)文章,第一時間送達

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

          技術(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;
           
          /**
           * @author yhq
           * @date 2018/9/10 15:52
           */

           
          @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;
           
          /**
           * @author yhq
           * @date 2018/9/10 16:05
           */

           
           
          @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;
           
          /**
           * @author yhq
           * @date 2018/9/10 15:58
           */

          @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;
           
          /**
           * @author yhq
           * @date 2018/9/10 15:49
           */

           
          @Controller
          public class FangshuaController {
           
              @AccessLimit(seconds=5, maxCount=5, needLogin=true)
              @RequestMapping("/fangshua")
              @ResponseBody
              public Result<String> fangshua(){
           
           
                  return Result.success("請求成功");
           
              }
              
          }    

          本文有參考其他視頻的教學,希望可以幫助更多熱愛it行業(yè)的人。

          作者:CS打贏你
          本文鏈接:https://urlify.cn/U7rAVj


          —————END—————

          推薦閱讀:

          推薦一款神器,助你秒級定位線上問題!
          代碼中大量的if/else,你有什么優(yōu)化方案?
          你還在用Jenkins?趕快看看這些替代方案吧!
          程序員常用的 15 款Java開發(fā)者工具

          最近面試BAT,整理一份面試資料Java面試BAT通關(guān)手冊,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫、數(shù)據(jù)結(jié)構(gòu)等等。
          獲取方式:關(guān)注公眾號并回復 java 領(lǐng)取,更多內(nèi)容陸續(xù)奉上。
          明天見(??ω??)??
          瀏覽 57
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <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>
                  口爆在线| 青青艹av | 色欧久久| 在线国内精品 | 日本少妇无码精品18p |