锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. JAVA
  4. SpringBoot+Ajax+redis实现隐藏重要接口地址

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

0
  • JAVA
  • 发布于 2024-08-09
  • 0 次阅读
黄健
黄健

本文由 简悦 SimpRead 转码, 原文地址 blog.csdn.net

🏡浩泽学编程:个人主页

🔥 推荐专栏:《深入浅出 SpringBoot》《java 对 AI 的调用开发》
《RabbitMQ》《Spring》《SpringMVC》《项目实战》

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

文章目录

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

前言

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

一、Ajax 实现

前端代码

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

<button class="btn btn-primary" type="submit" id="buyButton"
	onclick="getSeckillPath()">立即秒杀
  <input type="hidden" >
</button>

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

标签: #JAVA 991
相关文章

Spring 实现 3 种异步接口 2024-10-18 09:07

大家好,我是苏三~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某些场景下,如果需要接口异步处理的同时,还持续不断地

重学SpringBoot3-集成Redis(五)之布隆过滤器 2024-10-08 11:24

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(五)之布隆过滤器 1. 什么是布隆过滤器? * 基本概念 适用场景 2. 使用 Redis 实现布隆过滤器 * 项目依赖 Redis 配置

SpringBoot整合异步任务执行 2024-10-08 11:24

同步任务: 同步任务是在单线程中按顺序执行,每次只有一个任务在执行,不会引发线程安全和数据一致性等 并发问题 同步任务需要等待任务执行完成后才能执行下一个任务,无法同时处理多个任务,响应慢,影响用 户体验 异步任务: 异步任务是在多线程中同时执行,多个任务可以并发执行,同时处理多个请求,响应快,资源

springboot kafka多数据源,通过配置动态加载发送者和消费者 2024-10-08 11:24

前言 最近做项目,需要支持kafka多数据源,实际上我们也可以通过代码固定写死多套kafka集群逻辑,但是如果需要不修改代码扩展呢,因为kafka本身不处理额外逻辑,只是起到削峰,和数据的传递,那么就需要对架构做一定的设计了。 准备test kafka本身非常容易上手,如果我们需要单元测试,引入ja

SpringBoot 集成 Redis 2024-10-08 11:24

一:SpringBoot 集成 Redis ①Redis是一个 NoSQL(not only)数据库, 常作用缓存 Cache 使用。 ②Redis是一个中间件、是一个独立的服务器;常用的数据类型: string , hash ,set ,zset , list ③通过Redis客户端可以使用多种语

SpringBoot整合QQ邮箱 2024-10-08 11:24

SpringBoot可以通过导入依赖的方式集成多种技术,这当然少不了我们常用的邮箱,现在本章演示SpringBoot整合QQ邮箱发送邮件…. 下面按步骤进行: 1.获取QQ邮箱授权码 1.1 登录QQ邮箱 1.2 开启SMTP服务 找到下图中的SMTP服务区域,如果当前账号未开启的话自己手动开启。

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.