表单重复提交解决办法
表单重复提交
表单重复提交的发生场景
- 成功之后,直接刷新页面(每次刷新就是重复上一次请求)
- 网速,服务器性能等原因导致处理请求很慢,导致用户狂点注册。
- 用户成功以后点击后退,再次提交。
表单重复提交的危害
- 数据库多次保存相同数据;
- 安全问题;
- 服务器性能问题;
表单重复提交的具体原因
服务器不知到是否为同意请求,Http为无状态协议。
因为每次Http请求过来都会创建一个新的tcp连接。
表单重复提交的解决方法
对于场景1,将转发修改为重定向即可。因为重定向不会再次将请求与中的数据发送给其他页面(请求转发与重定向的区别。)
对于场景2,将递交按钮设置为点击后不可用。然后手动提交表单。
对于场景1,2,3 采用令牌机制(token)每次提交表单,带上令牌,服务器验证口令,口令合法处理请求,口令不合法,打回。
解决思路:
服务器和页面有一个相同的令牌,页面提交的时候,带上令牌,服务端验证是否跟他一致。如果一致则处理请求,如果不一致不处理请求。
再处理请求后把session中的token变一下,这样session中的token和页面提交的令牌不一样,也可以直接将服务器中的令牌移除。这样第二次请求火来,服务器中的token没值,服务器中的token和页面中的token就不一样了。
- 用户再第一次请求页面时,页面会生成一个不重复的令牌,放在session中,第一次提交表单会带上令牌.
- 服务器端从session中取出令牌。
- 服务端对照令牌,如果令牌相同,和验证成功提交表单,处理数据。
- 把服务端的session移除
- 用户点击后对按钮,页面会有一个缓存的token
- 提交表单会带上令牌,但是这时候服务器session中的令牌已经被移除了,所以验证失败,不会提交数据。
具体过程如下图所示: