秒杀下单接口隐藏
当前虽然可以确保用户只有在登录的情况下才可以进行秒杀下单,但是无法防止有一些恶意的用户在登录了之后,猜测秒杀下单的接口地址进行恶意刷单。所以需要对秒杀接口地址进行隐藏。
在用户每一次点击抢购的时候,都首先去生成一个随机数并存入redis,接着用户携带着这个随机数去访问秒杀下单,下单接口首先会从redis中获取该随机数进行匹配,如果匹配成功,则进行后续下单操作,如果匹配不成功,则认定为非法访问。
将随机数工具类放入common工程中
public class RandomUtil { public static String getRandomString() { int length = 15; String base = "abcdefghijklmnopqrstuvwxyz0123456789"; Random random = new Random(); StringBuffer sb = new StringBuffer(); for (int i = 0; i < length; i++) { int number = random.nextInt(base.length()); sb.append(base.charAt(number)); } return sb.toString(); } public static void main(String[] args) { String randomString = RandomUtil.getRandomString(); System.out.println(randomString); } }
秒杀渲染服务定义随机数接口
/** * 接口加密 * 生成随机数存入redis,10秒有效期 */ @GetMapping("/getToken") @ResponseBody public String getToken(){ String randomString = RandomUtil.getRandomString(); String cookieValue = this.readCookie(); redisTemplate.boundValueOps("randomcode_"+cookieValue).set(randomString,10, TimeUnit.SECONDS); return randomString; } //读取cookie private String readCookie(){ HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); String cookieValue = CookieUtil.readCookie(request, "uid").get("uid"); return cookieValue; }
js修改
修改js下单方法
//秒杀下单 add:function(id){ app.msg ='正在下单'; //获取随机数 axios.get("/api/wseckillorder/getToken").then(function (response) { var random=response.data; axios.get("/api/wseckillorder/add?time="+moment(app.dateMenus[0]).format("YYYYMMDDHH")+"&id="+id+"&random="+random).then(function (response) { if (response.data.flag){ app.msg='抢单成功,即将进入支付!'; }else{ app.msg='抢单失败'; } }) }) }
秒杀渲染服务更改
修改秒杀渲染服务下单接口
/** * 秒杀下单 * @param time 当前时间段 * @param id 秒杀商品id * @return */ @RequestMapping("/add") @ResponseBody public Result add(String time,Long id,String random){ //校验密文有效 String randomcode = (String) redisTemplate.boundValueOps("randomcode").get(); if (StringUtils.isEmpty(randomcode) || !random.equals(randomcode)){ return new Result(false, StatusCode.ERROR,"无效访问"); } Result result = secKillOrderFeign.add(time, id); return result; }