我的理解如下:
服务器端生成一次性的token保存在用户session中,同时告知客户端。 在接收到客户端请求时,判断请求中的令牌和用户session中的令牌是否相同,相同则认为是初次提交,否则认为是重复提交。
为保证token是一次性的,服务器端需要在每次判断token之后删除旧token。大体流程如下(伪代码):
if (request.token == session.token) {
// 初次提交,执行正常提交处理操作
...
// 删除session中的token
deleteToken();
} else {
// 重复提交, 提示“重复提交”
...
// 生成新token并保存到session
generateToken();
}