在Web开发中,当用户提交表单后,如果刷新页面(例如按下F5或CTRL+R),浏览器会重新发送上次提交的请求,这可能导致数据重复插入数据库或其他不期望的行为。这种现象称为“表单重复提交”。
防止表单重复提交的优势包括:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>防止表单重复提交</title>
<script>
function onSubmit() {
document.getElementById('submitBtn').disabled = true;
return true;
}
</script>
</head>
<body>
<form action="/submit" method="post" onsubmit="return onSubmit()">
<input type="text" name="data">
<button type="submit" id="submitBtn">提交</button>
</form>
</body>
</html>
前端代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>防止表单重复提交</title>
</head>
<body>
<form action="/submit" method="post">
<input type="hidden" name="csrfToken" value="{{ csrfToken }}">
<input type="text" name="data">
<button type="submit">提交</button>
</form>
</body>
</html>
后端代码(Node.js + Express):
const express = require('express');
const bodyParser = require('body-parser');
const crypto = require('crypto');
const app = express();
app.use(bodyParser.urlencoded({ extended: true }));
let csrfToken = crypto.randomBytes(16).toString('hex');
app.get('/', (req, res) => {
res.send(`
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>防止表单重复提交</title>
</head>
<body>
<form action="/submit" method="post">
<input type="hidden" name="csrfToken" value="${csrfToken}">
<input type="text" name="data">
<button type="submit">提交</button>
</form>
</body>
</html>
`);
});
app.post('/submit', (req, res) => {
const { csrfToken: token, data } = req.body;
if (token !== csrfToken) {
return res.status(403).send('Invalid token');
}
// 处理表单数据
res.send('提交成功');
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
通过上述方法,可以有效防止表单在页面刷新时重复提交,提升系统的稳定性和用户体验。
领取专属 10元无门槛券
手把手带您无忧上云