表单提交本身不校验,校验必须由后台接口完成;前端仅负责按约定格式发送数据并处理返回结果,若后端未部署真实接口或契约未对齐(如字段名、格式、错误结构不一致),则直接跳转会因404、405或无响应而失败。

表单提交本身不校验,校验必须由后台接口完成;前端能做的只是把数据按约定格式发过去,并处理返回结果。
为什么 form action 直接跳转会失败
浏览器用 form 提交时,如果后端没部署真实接口,常见现象是:404 Not Found、405 Method Not Allowed,或页面刷新后“什么都没发生”。这是因为 HTML 不会自动解析 JSON 响应,也不处理 token 或错误提示——它只认 HTTP 状态码和重定向。
-
action必须指向一个真实运行的后端路由(比如/api/login),不能是空路径或本地文件 - 后端必须接收
POST请求,并返回明确的业务字段(如{"code": 200, "msg": "登录成功"}),不能只返回200 OK状态码 - 若用
type="password",仅前端掩码,密码仍是明文提交;没配 HTTPS 时,抓包就能看到
用 fetch 发送 JSON 并处理响应
更可控的方式是禁用默认提交,用 JavaScript 手动发请求。关键点不在“怎么发”,而在“怎么判断是否真校验了”:
- 必须显式设置请求头:
Content-Type: application/json - 后端返回体必须含业务字段,例如
{"success": true, "token": "xxx"},不能只靠response.ok判断 - 收到成功响应后,要存
token(推荐localStorage或sessionStorage),再跳转:window.location.href = "/admin" - 错误处理要区分网络失败(
fetch抛异常)、HTTP 错误(4xx/5xx,但fetch不 reject)、业务失败(code !== 200)
示例片段:
submitBtn.addEventListener('click', async () => {
const data = { username: uname.value, password: pwd.value };
try {
const res = await fetch('/api/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data)
});
const json = await res.json();
if (json.code === 200) {
localStorage.setItem('token', json.token);
window.location.href = '/admin';
} else {
alert(json.msg || '登录失败');
}
} catch (e) {
alert('网络错误,请检查服务是否启动');
}
});
后端没配好,前端再怎么写都白搭
很多调试卡在“点不动”“没反应”“控制台空白”,其实问题根本不在前端代码,而是后端没就位:
- 没开服务:用
curl -X POST http://localhost:3000/api/login测试能否通,比反复改 HTML 有效得多 - CORS 被拦:浏览器报
Blocked by CORS policy,说明后端没设响应头Access-Control-Allow-Origin - 字段名不一致:前端传
username,后端却读user_name或login_id,导致校验永远不通过 - 没处理空值或特殊字符:比如密码含
+或空格,application/x-www-form-urlencoded会自动解码出错,而 JSON 不会
真正决定校验成败的,是前后端之间那条“契约”有没有对齐:字段名、数据格式、错误结构、认证方式。前端只是执行者,不是决策者。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











