1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        一個(gè)注解搞定 SpringBoot 接口防刷,還有誰(shuí)不會(huì)?

        共 7869字,需瀏覽 16分鐘

         ·

        2021-03-01 16:34

        作者:CS打贏你

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

        說(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è)的人,

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


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

         注意,一定不要亂回復(fù),對(duì)好暗號(hào)


        沒(méi)錯(cuò),不是機(jī)器人
        記得一定要等待,等待才有好東西


        瀏覽 42
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            国产一级片AV | 日本操逼电影 | 91泡芙 | 超碰免费在线 | 日韩无码黄色视频 | chinese基友gay勾老师 | 轻点好疼你的太大了 | 农村荡女淫春在线观看bd | 国产日韩高清在线 | 女人扒开尿口让男人桶 |