<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 接口防刷,還有誰不會?

          共 2481字,需瀏覽 5分鐘

           ·

          2021-02-14 23:37

          點擊上方?好好學java?,選擇?星標?公眾號

          重磅資訊,干貨,第一時間送達

          今日推薦:分享一套基于SpringBoot和Vue的企業(yè)級中后臺開源項目,這個項目有點哇塞!

          個人原創(chuàng)100W +訪問量博客:點擊前往,查看更多

          作者:CS打贏你

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

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

          一,技術要點: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攔截器中實現:

          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中獲取用戶訪問的次數
          ????????????AccessKey?ak?=?AccessKey.withExpire(seconds);
          ????????????Integer?count?=?redisService.get(ak,key,Integer.class);
          ????????????if(count?==?null){
          ????????????????//第一次訪問
          ????????????????redisService.set(ak,key,1);
          ????????????}else?if(count?????????????????//加1
          ????????????????redisService.incr(ak,key);
          ????????????}else{
          ????????????????//超出訪問次數
          ????????????????render(response,CodeMsg.ACCESS_LIMIT_REACHED);?//這里的CodeMsg是一個返回參數
          ????????????????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?fangshua(){
          ?
          ?
          ????????return?Result.success("請求成功");
          ?
          ????}

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

          最后,再給大家分享一份很好的算法刷題指南,我們都知道面試的不可避免的就是手撕代碼,而且一般都是很難掌握的,我在前面面試中就是每天刷題,很費時間,也是很辛苦的,今天給大家推薦份來自字節(jié)跳動大佬的算法手冊,我看過,感覺很不錯,大家可以先看一下下面的內容:

          點擊關注下方公眾號,回復「算法」獲取
          瀏覽 78
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <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>
                  www.大香蕉在线 | 无码一级日韩免费 | 亚洲欧美一区二区三区久本道 | 91黄色视频网站 | 福利视频一区 |