SpringBoot+Ajax+redis实现隐藏重要接口地址

🏡浩泽学编程个人主页
🔥 推荐专栏《深入浅出SpringBoot》《java对AI的调用开发》
《RabbitMQ》《Spring》《SpringMVC》《项目实战》

🛸学无止境,不骄不躁,知行合一

文章目录


前言

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


一、Ajax实现

前端代码

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

html 复制代码
<button class="btn btn-primary" type="submit" id="buyButton"
	onclick="getSeckillPath()">立即秒杀
  <input type="hidden" name="goodsId" id="goodsId">
</button>

Ajax逻辑实现

  • 基本逻辑:当页面触发获取秒杀地址的函数,然后ajax异步请求服务器端获取秒杀地址,服务器端返回随机生成的秒杀地址,然后将返回对象作为参数传入秒杀函数,秒杀函数中ajax将秒杀地址拼接获取完整秒杀地址向服务器端发送秒杀请求。
  • 实现:
    • 真正秒杀地址:/seckill/path/doSeckill
    • path是秒杀时随机生成的,存入redis,以便后续访问秒杀地址时比对是否时实时生成的正确秒杀地址
js 复制代码
//获取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()代表返回成功。

获取秒杀地址:

java 复制代码
/**
     * @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);
    }

创建秒杀地址:

java 复制代码
    @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;
    }

真正的秒杀请求:

java 复制代码
	@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);

    }

检查秒杀地址的方法:

java 复制代码
/**
     * @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实现隐藏重要接口地址的实现。

相关推荐
duapple2 小时前
Golang基于反射的ioctl实现
开发语言·后端·golang
字节源流3 小时前
关于maven的依赖下不下来的问题
java·maven
pjx9874 小时前
服务间的“握手”:OpenFeign声明式调用与客户端负载均衡
java·运维·spring·负载均衡
jjkkzzzz4 小时前
Linux下的c/c++开发之操作Redis数据库
数据库·c++·redis
prinrf('千寻)4 小时前
MyBatis-Plus 的 updateById 方法不更新 null 值属性的问题
java·开发语言·mybatis
老华带你飞4 小时前
实习记录小程序|基于SSM+Vue的实习记录小程序设计与实现(源码+数据库+文档)
java·数据库·spring boot·小程序·论文·毕设·实习记录小程序
在未来等你5 小时前
互联网大厂Java求职面试:AI与大模型应用集成及云原生挑战
java·微服务·ai·kubernetes·大模型·embedding·spring ai
my_styles5 小时前
docker-compose部署项目(springboot服务)以及基础环境(mysql、redis等)ruoyi-ry
spring boot·redis·后端·mysql·spring cloud·docker·容器
源码技术栈5 小时前
SaaS基于云计算、大数据的Java云HIS平台信息化系统源码
java·大数据·云计算·云his·his系统·云医院·区域his