在前后端分離的架構(gòu)中,前端的驗證碼驗證是非常必要的,一般會結(jié)合后端的驗證機制使用。比如,我們可以在前端頁面中提供一個輸入框讓用戶輸入驗證碼,然后通過Ajax向后端發(fā)送請求,在后端進行驗證后返回驗證結(jié)果。常見的驗證碼有圖形驗證碼、手機驗證碼、郵箱驗證碼等。
// 圖形驗證碼提交函數(shù) function submitCaptcha() { var captcha = document.getElementById('captcha').value; if (captcha.length <= 0) { alert('請輸入驗證碼'); return; } var params = "captcha=" + captcha; var xhr = new XMLHttpRequest(); xhr.open('POST', '/check_captcha', true); xhr.setRequestHeader('Content-type','application/x-www-form-urlencoded'); xhr.onreadystatechange = function() { if (xhr.readyState == XMLHttpRequest.DONE) { if (xhr.status == 200) { var res = JSON.parse(xhr.responseText); if (res.code == 0) { alert('驗證通過'); } else { alert(res.msg); } } else { alert('服務器錯誤'); } } }; xhr.send(params); }
如上代碼所示,我們首先獲取驗證碼輸入框的值,然后對其進行判斷,如果值為空,則彈出提示框。接著,我們通過XMLHttpRequest對象向后端發(fā)送POST請求,攜帶驗證碼參數(shù)。同時,我們要設(shè)置請求頭的Content-type為application/x-www-form-urlencoded,這樣后端才能正常解析請求參數(shù)。在服務器響應后,我們通過XMLHttpRequest.DONE判斷響應是否完成,狀態(tài)碼是否為200,以此判斷是否驗證通過。
具體的驗證碼驗證邏輯由后端實現(xiàn),此處不做贅述。下面我們來看一個基于Canvas的圖形驗證碼:
// Canvas圖形驗證碼生成函數(shù) function generateCaptcha() { var canvas = document.getElementById('captchaCanvas'); var ctx = canvas.getContext('2d'); ctx.clearRect(0, 0, canvas.width, canvas.height); var code = ""; var codeLength = 4; var fontStyle = 'bold 30px Arial, sans-serif'; var fontColor = ['#000', '#fff', '#ccc', '#f00', '#0f0', '#00f']; var bgColor = ['#f5f5f5', '#eee', '#ddd', '#ffc', '#cfc', '#ccf']; var chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; for (var i = 0; i < codeLength; i++) { var char = chars[Math.floor(Math.random() * chars.length)]; code += char; ctx.fillStyle = bgColor[Math.floor(Math.random() * bgColor.length)]; ctx.fillRect(0, i * 60, canvas.width, 60); ctx.fillStyle = fontColor[Math.floor(Math.random() * fontColor.length)]; ctx.font = fontStyle; ctx.fillText(char, 10 + i * 50, 42); } return code; }
如上代碼所示,我們通過Canvas對象在前端繪制圖形驗證碼。首先,我們獲取Canvas元素及其上下文對象,接著清空畫布。然后,我們隨機生成一個長度為4的字符,生成隨機顏色和背景色,并在畫布上繪制出字符。最后,我們返回生成的驗證碼即可。
綜上所述,基于JavaScript的驗證碼提交和驗證,是前端頁面保障數(shù)據(jù)安全的一種重要手段。我們可以根據(jù)實際需求,結(jié)合后端驗證機制,采用不同類型的驗證碼驗證,保障客戶端數(shù)據(jù)安全。