流程:前端 AJAX 請求 → 後端用 ZXing 生成圖片 → 以 userId.png 存入 /webapp/qrcode/ → 返回文件名 → 前端 <img src="/qrcode/userId.png">
userId.png),瀏覽器發現 URL 未變,直接讀取緩存圖片。嘗試過的失敗方案:Cache-Control: no-cache(不穩定)、每次生成唯一文件名(磁盤爆炸)、強制用戶清理緩存(不可行)。
核心思路:後端只返回二維碼內容字符串(如帶加密參數的跳轉鏈接),前端用 qrcode.js 即時在 Canvas/Table 中繪製。
qrcode.min.js(官網)。<div id="qrcode"></div>new QRCode(document.getElementById("qrcode"), {
text: data.qrContent, // 後端返回的跳轉鏈接
width: 200,
height: 200,
colorDark: "#000000",
colorLight: "#ffffff",
correctLevel: QRCode.CorrectLevel.H
});
| 維度 | 後端生成+文件存儲 | 前端 qrcode.js 渲染 |
|---|---|---|
| 緩存問題 | 嚴重,難徹底解決 | 無緩存問題,每次重繪 |
| 服務器資源 | 佔用磁盤、CPU、IO | 零佔用,純客戶端計算 |
| 併發擴展性 | 受限於文件系統/磁盤 | 無限水平擴展 |
| 安全性 | 文件可被直接訪問/遍歷 | 內容可加密,無靜態文件洩露 |
| 維護成本 | 需定期清理過期圖片 | 無維護成本 |
大廠(微信、支付寶、抖音)的 Web 端二維碼幾乎均採用前端渲染方案。後端僅負責業務邏輯與簽名,前端按需繪製,完美規避緩存與資源問題。