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

在这里插入图片描述

🏡浩泽学编程:个人主页

 🔥 推荐专栏:《深入浅出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" name="goodsId" id="goodsId">
</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实现隐藏重要接口地址的实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/439827.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

预付费电表的应用和预付费平台的操作方式

*、智能预付费电能表的应用分析 1应用功能的分析 这里主要讲的是与远程抄表系统的结合&#xff0e;如图2所示&#xff0e;为系统工作的程序&#xff0e;在远程抄表中&#xff0c;通信方式多种多样&#xff0e;主要有互联网、电话线通信、有线电视通信、光纤通信、GPRS、卫星通…

关于esp8266的一些经验汇总,新手必看

说实话&#xff0c;esp8266的nodemcu 已经使用了2年多了&#xff0c;各种问题遇到过&#xff0c;就尝试各种解决&#xff0c;而现在回头来看真的是稀里糊涂的在用&#xff0c;当然这个问题也同样涉及到esp32. 因为最近打算自己打一块esp8266的板&#xff0c;之前打的比较多的是…

Hi3516DV500+SC2210 AIISP 黑光相机

1. Hi3516DV500 Hi3516DV500是一颗面向行业市场推出的高清智能网络摄像头SoC。该芯片最高支持2路sensor输入&#xff0c;支持最高5M30fps的ISP图像处理能力&#xff0c;支持2F WDR、多级降噪、六轴防抖、多光谱融合等多种传统图像增强和处理算法&#xff0c;支持通过AI算法对输…

ABAP 内表排序总结

目录 ABAP 内表排序总结需求的场景二分法查找SAP 二分法查找SAP SORT排序 ABAP 内表排序总结 ABAP 内表排序SORT总结&#xff1a; 在创建完内表之后&#xff0c;最好使用sort去排序一下使用read读取内表&#xff0c;如果没有排序的话&#xff0c;可能会读取失败read内表只能读…

Fortran语法介绍(一)

个人专栏—ABAQUS专栏 Abaqus2023的用法教程——与VS2022、oneAPI 2024子程序的关联方法 Abaqus2023的用法教程——与VS2022、oneAPI 2024子程序的关联方法Abaqus有限元分析——有限元网格划分基本原则 Abaqus有限元分析——有限元网格划分基本原则各向同性线弹性材料本构模型…

创维汽车SKYHOME获德国设计奖,中国红设计闪耀世界

祝贺&#xff01;创维汽车SKYHOME以卓越的国潮设计理念和突破性的设计语言强势出圈&#xff0c;荣获被誉为设计界“奥斯卡”德国iF设计奖&#xff01; 创维汽车SYHOME是一款集完美设计理念、出色用户体验及创新实用功能为一体的优秀设计产品。SKYHOME的设计灵感来源于中式亭台楼…

【掌握数学公式的魔法】LatexEasy:让你的数学写作不再是难题!

内容摘要&#xff1a;在学术和研究领域&#xff0c;数学公式的准确表达至关重要。然而&#xff0c;传统的LaTeX编辑过程往往复杂且耗时。幸运的是&#xff0c;有了LatexEasy&#xff0c;一切都变得简单起来。这款工具不仅简化了数学公式的编辑流程&#xff0c;还大大提高了工作…

【梳理】k8s使用Operator搭建Flink集群

文章目录 架构图安装cert-manager依赖helm 安装operator运行集群实例k8s上的两种模式&#xff1a;Native和Standalone两种CRDemo1&#xff1a;Application 单任务Demo2&#xff1a;Session 多任务创建ingress 总结 架构图 参考&#xff1a;部署验证demo 安装cert-manager依赖 …

面试高频 牛群的位置排序---搜索插入位置

题目描述 农场里有一群牛&#xff0c;每头牛都有一个标签值&#xff0c;这些标签值组成一个升序排列的数组 labels。现在农场主想知道&#xff0c;给定一个目标标签值 target&#xff0c;如果在牛群中存在这个标签&#xff0c;返回它的位置&#xff0c;如果不存在&#xff0c;…

NSSCTF Round#13 WEB

1.flask?jwt? 在忘记密码下面有提示secretkey,那么就可以jwt伪造 自己注册个账号然后登录 点击拿flag提示你不是admin&#xff0c;并且cookie里面有个session,用工具解密一下 python flask_session_cookie_manager3.py decode -s th3f1askisfunny -c .eJwlzjsOAyEMANG7UK…

JavaScript实现小球移动(二)

这次采用了封装函数的方法&#xff0c;将小球向左向右移动封装在同一个函数内。 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wi…

高效办公-浏览器基本操作

日常我们使用电脑&#xff0c;其实很大部分是用于网络功能&#xff0c;这里面除了客户端程序剩余的就是通过我们的浏览器获取信息或者使用业务系统了&#xff0c;这里就简单学习下浏览器基本常识与操作。 一、浏览器是什么&#xff1f; 白话讲浏览器就是一个软件&#xff0c;我…

springboot3.x集成nacos踩坑,并实现多环境配置

一、nacos安装部署 springboot3.x集成Nacos首先需要将Nacos从1.x升级到2.x&#xff0c;建议直接安装2.x版本&#xff0c;手动将1.x的配置信息迁移到2.x中&#xff0c;先并行一段时间&#xff0c;待全部迁移完成稳定运行之后再停掉1.x&#xff0c;升级和安装、操作请查看官方文…

了解开源可视化表单的主要优势

为什么可视化表单深受大家喜爱&#xff1f;这就需要了解开源可视化表单的优势和特点了。在流程化办公深入人心的今天&#xff0c;提高办公协作效率早已成为大家的发展目标&#xff0c;低代码技术平台、开源可视化表单是提升办公协作效率的得力助手&#xff0c;一起来看看它的优…

2024新版微信小程序登录注册功能的实现,授权登录,退出,缓存讲解,小程序个人中心的实现,修改头像 图片上传功能的实现 新版登陆注册,头像上传,修改昵称

新版小程序授权登录注册获取头像昵称文档 一&#xff0c;无法获取用户的微信头像和昵称 最近好多同学在学习石头哥小程序课程的时候&#xff0c;遇到了下面这样的问题&#xff0c;在小程序授权获取用户头像和昵称时&#xff0c;获取到的是下面这样的。 到底是什么原因导致的…

Spring SPI介绍

1.什么是SPI (面试题) SPI全名Service Provider interface&#xff0c;翻译过来就是“服务提供接口”&#xff0c;再说简单就是提供某一个服务的接口&#xff0c; 提供给服务开发者或者服务生产商来进行实现。 Java SPI 是JDK内置的一种动态加载扩展点的实现。 这个机制在一…

docker——启动各种服务

1.Mysql 2.Redis 3.nginx 4.ES 注意&#xff1a;ES7之后环境为 -e ELASTICSEARCH_HOSTS http://ip地址:9200

VS Code引入ECharts

Charts是一个使用 JavaScript 实现的开源可视化库&#xff0c;涵盖各行业图表&#xff0c;提供了丰富的图表类型和交互能力。&#xff08;摘自菜鸟教程&#xff09; 下面我们来介绍一下VS Code引入ECharts的相关操作 检查电脑是否已经安装了Java语言的软件开发工具包 ECharts…

每日一题-环形链表的约瑟夫问题

&#x1f308;个人主页: 会编辑的果子君 &#x1f4ab;个人格言:“成为自己未来的主人~” /*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** * param n int整型 * param m int整型 * return int整型*/ typedef struct…

计算机考研|四个月跨考408详细教程(可实操)

4个月准备408时间是相当的紧张.... 数学也是一大头&#xff0c;所以要做的就是最高效汲取分数&#xff0c;不做无用功&#xff01; 在去年备考期间我自己总结了一套408的复习方法&#xff0c;408和数学同时进行&#xff0c;两不耽误&#xff0c;在这里分享给你&#xff01;&a…
最新文章