上期回顾: Java Seckill Module:Redis pre-reduced inventory and Rabbitmq asynchronous order

在服务端对系统做一层保护。

秒杀接口地址隐藏:在秒杀开始之前,地址不是写死的,而是从服务端获取动态生成一个地址,就是说秒杀开始之前是不知道访问哪一个地址的。

数学公式验证码:防止恶意用户刷秒杀接口,用机器人或者其他手段,并且输入验证码可以拉长了访问系统的时间,这是有效的削峰的情况。

接口限流防刷:做一个限制,例如一分钟限制用户最多访问系统十次,这样的限流手段,不是单单针对秒杀的应用场景,而是通用的


例如在页面秒杀按钮,前端已经做秒杀的限制,但是这种判断只是为了防止用户输入错误,用户体验的js逻辑,前端是http协议的,数据是明文的,地址以及传递的参数都能被拿到,如果是恶意的用户,就可能出现危险,所以对于安全的验证还是在服务端中进行的。

思路:秒杀开始之前,先去请求接口获取秒杀地址
1.接口改造,带上PathVariable参数
2.添加生成地址的接口
3.秒杀收到请求,先验证PathVariable

页面需要修改,不是直接去请求秒杀地址,而是先从服务端获取秒杀地址:

<button class="btn btn-primary" type="button" id="buyButton"οnclick="getMiaoshaPath()">立即秒杀</button>
function getMiaoshaPath(){var goodsId = $("#goodsId").val();g_showLoading();$.ajax({url:"/miaosha/path",type:"GET",data:{goodsId:goodsId,verifyCode:$("#verifyCode").val()},success:function(data){if(data.code == 0){var path = data.data;doMiaosha(path);}else{layer.msg(data.msg);}},error:function(){layer.msg("客户端请求有误");}});
}

解读:拿到秒杀Path之后,就进行doMiaosha(path):

function doMiaosha(path){$.ajax({url:"/miaosha/"+path+"/do_miaosha",type:"POST",data:{goodsId:$("#goodsId").val()},success:function(data){if(data.code == 0){getMiaoshaResult($("#goodsId").val());}else{layer.msg(data.msg);}},error:function(){layer.msg("客户端请求有误");}});
}

服务端秒杀接口中添加:

*****MiaoshaKey
秒杀地址有效期:
public static MiaoshaKey getMiaoshaPath = new MiaoshaKey(60, "mp");*****MiaoshaController:miaosha
收到path之后,就开始验证path:
public Result<Integer> miaosha(Model model,MiaoshaUser user,
@RequestParam("goodsId")long goodsId,
@PathVariable("path") String path) {
......
boolean check = miaoshaService.checkPath(user, goodsId, path);
if(!check){ return Result.error(CodeMsg.REQUEST_ILLEGAL); }
*****MiaoshaService
验证path
public boolean checkPath(MiaoshaUser user, long goodsId, String path) {if(user == null || path == null) {return false;}String pathOld = redisService.get(MiaoshaKey.getMiaoshaPath, ""+user.getId() + "_"+ goodsId, String.class);return path.equals(pathOld);
}
解读:获取之前存储的path,如何进行比较是否相等。
*****MiaoshaController
秒杀地址接口:
@RequestMapping(value="/path", method= RequestMethod.GET)
@ResponseBody
public Result<String> getMiaoshaPath(HttpServletRequest request, MiaoshaUser user,
@RequestParam("goodsId")long goodsId,
@RequestParam(value="verifyCode", defaultValue="0")int verifyCode) {if(user == null) {return Result.error(CodeMsg.SESSION_ERROR);}String path = miaoshaService.createMiaoshaPath(user, goodsId);return Result.success(path);
}
*****MiaoshaService
生成path:
public String createMiaoshaPath(MiaoshaUser user, long goodsId) {if(user == null || goodsId <=0) {return null;}String str = MD5Util.md5(UUIDUtil.uuid()+"123456");redisService.set(MiaoshaKey.getMiaoshaPath, ""+user.getId() + "_"+ goodsId, str);return str;
}解读:不同用户不同的商品,值是不一样的,同一个用户也是不一样的,这里用了uuid来随机生成,随后将path放入redis中。

Java Seckill Module:Seckill interface address hiding相关推荐

  1. Java Seckill Module:Order details are static and Resolve purchases beyond

    上期回顾: Java Seckill Module:Seckill interface front and rear end separation 一.订单详情页面静态化 获取订单详情:页面传入ord ...

  2. Java 编程问题:七、Java 反射类、接口、构造器、方法和字段

    原文:Java Coding Problems 协议:CC BY-NC-SA 4.0 贡献者:飞龙 本文来自[ApacheCN Java 译文集],自豪地采用谷歌翻译. 本章包括涉及 Java 反射 ...

  3. java学习笔记:全部,txt版本

    java学习笔记:全部,txt版本 笔者注: 1.不知道怎么上传附件,所以就把txt文本内容全部贴在这里吧. 2.已经把txt版本的笔记上传到CSDN了,我没有设置索要积分才能下载,但是不知道为什么C ...

  4. Java学习总结:54(集合输出)

    集合输出 在Java中,集合的输出操作有四种形式:Iterator输出.ListIterator输出.foreach(加强型for循环)输出.Enumeration输出. 迭代输出:Iterator ...

  5. Java学习总结:53(单对象保存父接口:Collection)

    单对象保存父接口:Collection java.util.Collection是进行单对象保存的最大父接口,即每次利用Collection接口都只能保存一个对象信息.单对象保存父接口定义如下: pu ...

  6. Java学习总结:42(字节流和字符流)

    字节流与字符流 上一节我们学习了文件操作类File,但是File类虽然可以操作文件,但是却不能操作文件的内容.如果要进行文件内容的操作,就必须依靠流的概念来完成.流在实际中分为输入流和输出流两种,输入 ...

  7. Java学习总结:37(比较器)

    比较器 Arrays类 No. 方法 类型 描述 1 public static boolean equals(int [] a,int [] a2) 普通 判断两个数组是否相等,此方法被重载多次,可 ...

  8. java培训教程:什么是匿名内部类?怎样创建匿名内部类?

    本期java教程要为大家分享的是关于java中的匿名内部类,相信很多同学在学java技术的时候有了解过,下面我们就来详细的看一下. java培训教程:什么是匿名内部类?怎样创建匿名内部类?匿名内部类是 ...

  9. Java基础篇:反射

    文章目录 Java反射机制概述 Java Reflection 动态语言 VS 静态语言 Java反射机制研究及应用 反射相关的主要API 理解Class类并获取Class实例 Class类 Clas ...

  10. Java基础篇:JDBC核心技术

    文章目录 第1章:JDBC概述 1.1 数据的持久化 1.2 JDBC介绍 1.3 JDBC程序编写步骤 第2章:获取数据库连接 2.1 要素一:Driver接口实现类 2.1.1 Driver接口介 ...

最新文章

  1. CentOS 8 已是绝版?还有后续么?
  2. openstack简易汉化
  3. Hibernate 之单向多对一映射及其衍生问题
  4. java sql string_JAVA String转化成java.sql.date和java.sql.time方法示例
  5. 基于ZooKeeper的Dubbo简单抽样登记中心
  6. 工业物联网发展环境加速形成 中国企业如何突围?
  7. python-函数的定义与调用
  8. 传奇霸业维护服务器,37传奇霸业6月21日部分区服维护计划
  9. Python模拟浏览器向 CSDN发送POST请求的方法
  10. 关于图灵机的三个问题
  11. 计算机英语课堂活动总结,英语活动总结(精选8篇)
  12. 混沌图像---陈氏吸引子的飞蛾
  13. CVPR 2021 论文大盘点-超分辨率篇
  14. PyTorch——device与cuda.device用法
  15. #SAP论坛•上海# 报名启动
  16. 独家解读 | Fisher信息度量下的对抗攻击
  17. TM Forum的TAM中文架构图
  18. 如何制定个人学习计划?
  19. 如何理解D触发器延迟一拍
  20. 教学生用计算机画画,教师资格证美术面试真题《用电脑画画》

热门文章

  1. web安全:通俗易懂,以实例讲述破解网站的原理及如何进行防护!如何让网站变得更安全。
  2. 家居物联网(IoT)接入控制与认证的再思考
  3. 程序猿需要阅览的书籍
  4. 股票放量一定就是好事么,为什么从爆大量的高位开始下跌?
  5. 利用googlemap查询经纬度
  6. 论文写作学习心得体会
  7. 计算机应用研究参考文献格式,参考文献编写规则-计算机应用研究.PDF
  8. skywang的博客目录(持续更新中...)
  9. 记录一下学习EFCore中的基础知识
  10. ae合成设置快捷键_AE基础教学(一)