浩泽学编程:个人主页

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

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

文章目录

前言一、Ajax实现前端代码Ajax逻辑实现

二、服务器端实现总结

前言

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

一、Ajax实现

前端代码

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

Ajax逻辑实现

基本逻辑:当页面触发获取秒杀地址的函数,然后ajax异步请求服务器端获取秒杀地址,服务器端返回随机生成的秒杀地址,然后将返回对象作为参数传入秒杀函数,秒杀函数中ajax将秒杀地址拼接获取完整秒杀地址向服务器端发送秒杀请求。实现:

真正秒杀地址:/seckill/path/doSeckillpath是秒杀时随机生成的,存入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实现隐藏重要接口地址的实现。

精彩内容

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: