【商城秒殺項目】-- 秒殺接口地址隱藏

每次點擊秒殺按鈕的時候,才生成秒殺地址,秒殺地址不是寫死的,而是從服務端獲取,動態拼接而成的地址(HTTP協議是明文傳輸,前端是防不住惡意用戶的攻擊,所以安全校驗要放在服務端,從而禁止掉這些惡意攻擊),本篇博客記錄如何進行秒殺接口地址隱藏進行安全優化

實現思路:

在進行秒殺之前,先去後端獲取一個動態的秒殺地址path(由後端生成隨機字符串作爲path),然後將這個隨機字符串返回給前端,前端將這個字符串拼接成新的URL(url : “/miaosha/” + path + “/do_miaosha”)作爲秒殺地址,再發請求到後端開始秒殺

前端代碼邏輯如下:

獲取隨機字符串的接口代碼:

/**
 * 獲取秒殺的path,並且驗證驗證碼的值是否正確
 * 加入註解,實現攔截功能,進而實現限流功能
 */
@AccessLimit(seconds = 5, maxCount = 5, needLogin = true)
@RequestMapping(value = "/path", method = RequestMethod.GET)
@ResponseBody
public Result<String> getMiaoshaPath(MiaoshaUser user,
                                     @RequestParam("goodsId") long goodsId,
                                     @RequestParam(value = "verifyCode", defaultValue = "0") int verifyCode) {
    if (user == null) {
        return Result.error(CodeMsg.SESSION_ERROR);
    }
    boolean check = miaoshaService.checkVerifyCode(user, goodsId, verifyCode);
    if (!check) {
        return Result.error(CodeMsg.REQUEST_ILLEGAL);
    }
    String path = miaoshaService.createMiaoshaPath(user, goodsId);
    return Result.success(path);
}

createMiaoshaPath方法代碼(生成隨機數並加密作爲path,並且存入緩存(設置緩存過期時間60s),然後將這個隨機字符串返回給前端):

/**
 * 創建一個臨時的秒殺地址
 */
public String createMiaoshaPath(MiaoshaUser user, long goodsId) {
    if (user == null || goodsId <= 0) {
        return null;
    }
    String str = MD5Util.md5(UUIDUtil.uuid() + "123456");
    //將生成的隨機字符串保存到redis
    redisService.set(MiaoshaKey.getMiaoshaPath, "" + user.getId() + "_" + goodsId, str);
    return str;
}

保存到redis裏的path如下:

然後在秒殺之前對path進行驗證:

checkPath方法代碼(將前端傳來的path與緩存中的path進行比較,如果一致,則可以進行下面的秒殺邏輯,否則,是非法請求):

/**
 * 驗證秒殺地址
 * @param user
 * @param goodsId
 * @param path
 * @return
 */
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);
}

加上了秒殺接口地址隱藏之後可以防止惡意用戶登陸之後,通過不斷調用秒殺地址接口來騷擾服務器,所以要動態獲取秒殺地址,只有真正點擊秒殺按鈕,纔會根據用戶id和商品id生成對應的秒殺接口地址

但是,這種情況仍然不能解決利用機器人頻繁點擊按鈕的操作,爲了降低點擊按鈕的次數,以及高併發下,防止多個用戶在同一時間內,併發出大量請求,還需加入數學公式圖形驗證碼以及接口防刷等優化技術

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章