【SpringBoot商城秒杀系统项目实战22】安全优化 秒杀接口地址隐藏

秒杀接口地址隐藏

每次点击秒杀按钮,才会生成秒杀地址,秒杀地址不是写死的,是从服务端获取,动态拼接而成的地址。(HTTP协议是明文传输,前端是防不住恶意用户的攻击,所以安全校验要放在服务端,从而禁止掉这些恶意攻击。)

实现思路:

在进行秒杀之前,去后端获取一个动态的秒杀地址path(服务端生成随机数作为path),在然后将这个随机数返回给前端,前端用这个path拼接在新的请求url(url : “/miaosha/” + path + “/do_miaosha”)上作为参数,再去发请求到后台开始我们的秒杀

  1. 改造前端秒杀按钮,在发起请求之前,先去获取秒杀地址:
<button class="btn btn-primary" type="button" id="buyButton" onclick="getMiaoshaPath()">立即秒杀</button>
  1. 发起请求/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("请求有误!");
			}
		});
	}
  1. 服务端生成随机数作为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生成对应的秒杀接口地址。

但是,这种情况仍然不能解决利用机器人频繁点击按钮的操作,为了降低点击按钮的次数,以及高并发下,防止多个用户在同一时间内,并发出大量请求,加入数学公式图形验证码以及接口防刷等优化技术。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值