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实现隐藏重要接口地址的实现。

相关推荐
旷野说几秒前
为什么 MyBatis 原生二级缓存“难以修复”?
java·java-ee·mybatis
8***23553 分钟前
【wiki知识库】07.用户管理后端SpringBoot部分
java
bcbnb5 分钟前
iOS 性能测试的工程化方法,构建从底层诊断到真机监控的多工具测试体系
后端
开心就好20258 分钟前
iOS 上架 TestFlight 的真实流程复盘 从构建、上传到审核的团队协作方式
后端
小周在成长16 分钟前
Java 泛型支持的类型
后端
aiopencode16 分钟前
Charles 抓不到包怎么办?HTTPS 抓包失败、TCP 数据流异常与底层补抓方案全解析
后端
阿蔹19 分钟前
JavaWeb-Selenium 配置以及Selenim classnotfound问题解决
java·软件测试·python·selenium·测试工具·自动化
稚辉君.MCA_P8_Java21 分钟前
Gemini永久会员 C++返回最长有效子串长度
开发语言·数据结构·c++·后端·算法
m***119039 分钟前
Windows版Redis本地后台启动
数据库·windows·redis
Penge66640 分钟前
Redis-bgsave浅析
redis·后端