登录时网关签发 HttpOnly+Secure+SameSite=Lax 的 q4_token Cookie,前端不再经手 Token;网关代理时支持从 Cookie 验签并向下游注入 Authorization(dnfs 零改动),新增 /logout 清除 Cookie,static 代理路由兼容 Cookie 转 Bearer。
91 lines
3.0 KiB
JavaScript
91 lines
3.0 KiB
JavaScript
const msgTip = document.getElementById('msgTip');
|
|
const pwdTip = document.getElementById('pwdTip');
|
|
const agreeTip = document.getElementById('agreeTip');
|
|
const form = document.getElementById('form');
|
|
const usernameInput = document.getElementById('loginUsername');
|
|
const passwordInput = document.getElementById('loginPassword');
|
|
const agreeBox = document.getElementById('agreeBox');
|
|
const resetUser = document.getElementById('resetUser');
|
|
const registerBtn = document.getElementById('registerBtn');
|
|
const loginButton = document.getElementById('loginBtn');
|
|
|
|
resetUser.addEventListener('click', function() { clearTipStyle(); });
|
|
|
|
function clearTipStyle() {
|
|
msgTip.innerHTML = '';
|
|
pwdTip.innerHTML = '';
|
|
agreeTip.innerHTML = '';
|
|
msgTip.classList.remove('tip-red', 'tip-yellow', 'tip-green');
|
|
pwdTip.classList.remove('tip-red', 'tip-yellow', 'tip-green');
|
|
agreeTip.classList.remove('tip-red');
|
|
}
|
|
clearTipStyle();
|
|
|
|
function checkUsername() {
|
|
const result = FormValidators.username(usernameInput.value);
|
|
msgTip.textContent = result.message;
|
|
msgTip.className = result.className;
|
|
return result.valid ? result.value : false;
|
|
}
|
|
|
|
function checkPwd() {
|
|
const result = FormValidators.password(passwordInput.value);
|
|
pwdTip.textContent = result.message;
|
|
pwdTip.className = result.className;
|
|
return result.valid ? result.value : false;
|
|
}
|
|
|
|
function checkAgree() {
|
|
agreeTip.innerHTML = '';
|
|
agreeTip.classList.remove('tip-red');
|
|
if (!agreeBox.checked) {
|
|
agreeTip.innerHTML = '请同意用户协议!';
|
|
agreeTip.classList.add('tip-red');
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
usernameInput.addEventListener('focus', checkUsername);
|
|
passwordInput.addEventListener('focus', checkPwd);
|
|
usernameInput.addEventListener('input', checkUsername);
|
|
passwordInput.addEventListener('input', checkPwd);
|
|
usernameInput.addEventListener('blur', checkUsername);
|
|
passwordInput.addEventListener('blur', checkPwd);
|
|
agreeBox.addEventListener('change', checkAgree);
|
|
registerBtn.addEventListener('click', function() { location.href = 'register.html'; });
|
|
|
|
form.addEventListener('submit', async function(e) {
|
|
e.preventDefault();
|
|
clearTipStyle();
|
|
const userOk = checkUsername();
|
|
const pwdOk = checkPwd();
|
|
const agreeOk = checkAgree();
|
|
if (!userOk || !pwdOk || !agreeOk) return;
|
|
|
|
const jsonBody = JSON.stringify({ username: userOk, password: pwdOk });
|
|
try {
|
|
loginButton.disabled = true;
|
|
const res = await fetch('/login', {
|
|
method: 'POST',
|
|
headers: {'Content-Type': 'application/json'},
|
|
body: jsonBody
|
|
});
|
|
const responseText = await res.text();
|
|
let result;
|
|
try { result = JSON.parse(responseText); } catch { throw new Error('服务器响应格式异常'); }
|
|
if (!res.ok) throw new Error(result.message || '登录失败');
|
|
if (result.success) {
|
|
// Token 已由网关通过 HttpOnly Cookie 下发,JS 不再经手
|
|
alert('登录成功');
|
|
location.href = '/dnfs.html';
|
|
} else {
|
|
alert(result.message || '登录失败');
|
|
}
|
|
} catch (err) {
|
|
alert(err.message || '接口请求失败');
|
|
} finally {
|
|
loginButton.disabled = false;
|
|
}
|
|
});
|