【SpringBoot商城秒杀系统项目实战22】安全优化 秒杀接口地址隐藏
2019-05-30 17:43
846 查看
秒杀接口地址隐藏
每次点击秒杀按钮,才会生成秒杀地址,秒杀地址不是写死的,是从服务端获取,动态拼接而成的地址。(HTTP协议是明文传输,前端是防不住恶意用户的攻击,所以安全校验要放在服务端,从而禁止掉这些恶意攻击。)
实现思路:
在进行秒杀之前,去后端获取一个动态的秒杀地址path(服务端生成随机数作为path),在然后将这个随机数返回给前端,前端用这个path拼接在新的请求url(url : “/miaosha/” + path + “/do_miaosha”)上作为参数,再去发请求到后台开始我们的秒杀
- 改造前端秒杀按钮,在发起请求之前,先去获取秒杀地址:
<button class="btn btn-primary" type="button" id="buyButton" onclick="getMiaoshaPath()">立即秒杀</button>
-
发起请求/miaosha/getPath去后端获取一个动态的秒杀地址path,然后前端在用这个path拼接在url(url : “/miaosha/” + path + “/do_miaosha”)上作为参数,再去发请求到后台开始我们的秒杀
getMiaoshaPath和doMiaosha(path)代码:
//获取秒杀地址 function getMiaoshaPath() { var goodsId = $("#goodsId").val(); $.ajax({ url : "/miaosha/getPath", type : "GET", data : { goodsId : goodsId, //vertifyCode:$("#vertifyCode").val() }, success : function(data) { if (data.code == 0) { //获取秒杀地址 var path = data.data; //拿到path之后,才去做我的秒杀逻辑,并且在方法传入秒杀地址 doMiaosha(path); } else { layer.msg(data.msg); } }, error : function() { layer.msg("请求有误!"); } }); } function doMiaosha(path) { //alert(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("请求有误!"); } }); }
- 服务端生成随机数作为path,并且存入缓存(设置缓存过期时间60s),然后将这个随机数返回给前端
/** * 获取秒杀的path,并且验证验证码的值是否正确 */ @RequestMapping(value ="/getPath") @ResponseBody public Result<String> getMiaoshaPath(HttpServletRequest request,Model model,MiaoshaUser user, @RequestParam("goodsId") Long goodsId, @RequestParam(value="vertifyCode",defaultValue="0") int vertifyCode) { model.addAttribute("user", user); //如果用户为空,则返回至登录页面 if(user==null){ return Result.error(CodeMsg.SESSION_ERROR); } //生成一个随机串 String path=miaoshaService.createMiaoshaPath(user,goodsId); return Result.success(path); }
注意:写入缓存,是后端接收到这个请求秒杀地址path参数,并且与缓存中的存的path比较,如果一致,进行秒杀逻辑,否则,非法请求。
createMiaoshaPath方法:
/** * 生成一个秒杀path,写入缓存,并且,返回至前台 */ public String createMiaoshaPath(MiaoshaUser user, Long goodsId) { String str=MD5Util.md5(UUIDUtil.uuid()+"123456"); //将随机串保存在客户端,并且返回至客户端。 //String path=""+user.getId()+"_"+goodsId; redisService.set(MiaoshaKey.getMiaoshaPath, ""+user.getId()+"_"+goodsId, str); return str; }
加上了秒杀接口地址隐藏之后可以防止恶意用户登陆之后,通过不断调用秒杀地址接口,骚扰服务器,所以使用动态获取秒杀地址,只有真正点击秒杀按钮,才会根据用户id和商品goodsId生成对应的秒杀接口地址。
但是,这种情况仍然不能解决利用机器人频繁点击按钮的操作,为了降低点击按钮的次数,以及高并发下,防止多个用户在同一时间内,并发出大量请求,加入数学公式图形验证码以及接口防刷等优化技术。
相关文章推荐
- 【SpringBoot商城秒杀系统项目实战24】安全优化 接口限流防刷
- 【SpringBoot商城秒杀系统项目实战23】安全优化 数学图形验证码
- 【SpringBoot商城秒杀系统项目总结】 项目的亮点和难点及问题解决(源码地址)
- 安全优化--秒杀接口地址的隐藏
- 基于微服务的秒杀项目实战使用Spring Boot2.x Actuator监控应用
- 从构建分布式秒杀系统聊聊验证码 给大家推荐8个SpringBoot精选项目
- STS创建Spring Boot项目实战(Rest接口、数据库、用户认证、分布式Token JWT、Redis操作、日志和统一异常处理)
- STS创建Spring Boot项目实战(Rest接口、数据库、用户认证、分布式Token JWT、Redis操作、日志和统一异常处理)
- 基于微服务的秒杀项目实战使用Spring Boot2.x Actuator监控应用
- Springboot+mongo 商城秒杀系统
- STS创建Spring Boot项目实战(Rest接口、数据库、用户认证、分布式Token JWT、Redis操作、日志和统一异常处理)
- 商城项目实战37:订单系统最小实现接口文档及实现
- SpringBoot/Netty+MUI打造聊天系统项目实战(完整)
- Java Spring boot 企业微信点餐系统 项目实战视频教程
- 2019Java秒杀系统方案优化 高性能高并发项目实战
- 第十八章:SpringBoot项目中使用SpringSecurity整合OAuth2设计项目API安全接口服务
- 商城项目实战34:单点登录系统SSO最小实现的接口文档及Cookie工具类
- java架构师、集群、高可扩展、高性能、高并发、性能优化、Spring boot、Dubbo、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战学习架构师之路
- 优效学院 基于微服务的秒杀项目实战 Spring Boot 2.0基础篇01
- SSM实战——秒杀系统之Service层接口设计与实现、Spring托管、声明式事务