相关推荐recommended
SpringBoot+Ajax+redis实现隐藏重要接口地址
作者:mmseoamin日期:2024-03-20

SpringBoot+Ajax+redis实现隐藏重要接口地址,在这里插入图片描述,第1张


🏡浩泽学编程:个人主页

 🔥 推荐专栏:《深入浅出SpringBoot》《java对AI的调用开发》
              《RabbitMQ》《Spring》《SpringMVC》《项目实战》
🛸学无止境,不骄不躁,知行合一

文章目录

  • 前言
  • 一、Ajax实现
    • 前端代码
    • Ajax逻辑实现
    • 二、服务器端实现
    • 总结

      前言

      本篇文章主要讲诉使用SpringBoot项目配合Ajax和redis实现隐藏重要接口地址,这里我以隐藏秒杀地址为例。


      一、Ajax实现

      前端代码

      简单实现秒杀按钮,input标签里存入的是秒杀商品的id,不许展示,所以隐藏。可以看到,点击秒杀按钮会触发getSeckillPath函数(获取秒杀地址的函数)。

      
      

      Ajax逻辑实现

      • 基本逻辑:当页面触发获取秒杀地址的函数,然后ajax异步请求服务器端获取秒杀地址,服务器端返回随机生成的秒杀地址,然后将返回对象作为参数传入秒杀函数,秒杀函数中ajax将秒杀地址拼接获取完整秒杀地址向服务器端发送秒杀请求。
      • 实现:
        • 真正秒杀地址:/seckill/path/doSeckill
        • path是秒杀时随机生成的,存入redis,以便后续访问秒杀地址时比对是否时实时生成的正确秒杀地址
      //获取path:秒杀地址的拼接路径
         function getSeckillPath() {
         		//获取秒杀商品id
              var goodsId = $("#goodsId").val();
              $.ajax({
                  url: "/seckill/path",
                  type: "GET",
                  data: {
                      goodsId: goodsId,
                  },
                  success: function (data) {
                      if (data.code == 200) {
                          var path = data.obj;
                          //获取path后调取真正的秒杀地址
                          doSecKill(path);
                      } else {
                          layer.msg(data.message);
                      }
                  },
                  error: function () {
                      layer.msg("客户端请求错误");
                  }
              });
          }
          //真正的秒杀方法
          function doSecKill(path) {
              $.ajax({
              //将获取的path进行拼接得到真正的秒杀地址
                  url: '/seckill/' + path + '/doSeckill',
                  type: "POST",
                  data: {
                      goodsId: $('#goodsId').val()
                  },
                  success: function (data) {
                      if (data.code == 200) {
                      // 获取秒杀结果,这个函数不再贴出,自己根据项目自行实现
                          getResult($("#goodsId").val());
                      } else {
                          layer.msg(data.message);
                      }
                  }, error: function () {
                      layer.msg("客户端请求出错");
                  }
              });
          }
      

      二、服务器端实现

      RespBean、RespBeanEnum是自己封装的错误封装类和错误枚举类型,无需在意,只需要知道RespBean.error代表返回错误,RespBean.success()代表返回成功。

      获取秒杀地址:

      /**
           * @Description: 获取秒杀地址
           * @param user
           * @param goodsId
           * @param captcha
           * @methodName: getPath
           * @return: com.example.seckill.vo.RespBean
           * @Author: dragon_王
           * @Date: 2024-03-03 12:36:46
           */
          @GetMapping(value = "/seckill/path")
          @ResponseBody
          public RespBean getPath(User user, Long goodsId) {
              if (user == null) {
                  return RespBean.error(RespBeanEnum.SESSION_ERROR);
              }
              String str = orderService.createPath(user, goodsId);
              return RespBean.success(str);
          }
      

      创建秒杀地址:

          @Override
          public String createPath(User user, Long goodsId) {
          	//利用UUID随机生成秒杀地址
          	//然后对地址进行简单md5加密
              String str = MD5Util.md5(UUIDUtil.uuid() + "123456");
              //加密后地址存入redis
              redisTemplate.opsForValue().set("seckillPath:" + user.getId() + ":" + goodsId, str, 1, TimeUnit.MINUTES);
              return str;
          }
      

      真正的秒杀请求:

      	@RequestMapping(value = "/seckill/{path}/doSeckill",method = RequestMethod.POST)
          @ResponseBody
          public RespBean doSeckill(@PathVariable String path, User user, Long goodsId){
              if (user == null) {
                  return RespBean.error(RespBeanEnum.SESSION_ERROR);
              }
              //检测秒杀地址是否正确
              boolean check = orderService.checkPath(user, goodsId, path);
              if (!check) {
                  return RespBean.error(RespBeanEnum.REQUEST_ILLEGAL);
              }
              //......
      		//真正秒杀逻辑实现,自己自行实现,不再赘诉
      		//......
              return RespBean.success(0);
          }
      

      检查秒杀地址的方法:

      /**
           * @Description: 检查秒杀地址
           * @param user
           * @param goodsId
           * @param path
           * @methodName: checkPath
           * @return: boolean
           * @Author: dragon_王
           * @Date: 2024-03-03 15:47:55
           */
          @Override
          public boolean checkPath(User user, Long goodsId, String path) {
              if (user == null || goodsId < 0 || StringUtils.isEmpty(path)) {
                  return false;
              }
              String redisPath = (String) redisTemplate.opsForValue().get("seckillPath:" + user.getId() + ":" + goodsId);
              return path.equals(redisPath);
          }
      

      总结

      以上就是SpringBoot+Ajax实现隐藏重要接口地址的实现。