表单重复提交解决办法

表单重复提交

表单重复提交的发生场景

  1. 成功之后,直接刷新页面(每次刷新就是重复上一次请求)
  2. 网速,服务器性能等原因导致处理请求很慢,导致用户狂点注册。
  3. 用户成功以后点击后退,再次提交。

表单重复提交的危害

  • 数据库多次保存相同数据;
  • 安全问题;
  • 服务器性能问题;

表单重复提交的具体原因

服务器不知到是否为同意请求,Http为无状态协议。
因为每次Http请求过来都会创建一个新的tcp连接。

表单重复提交的解决方法

对于场景1,将转发修改为重定向即可。因为重定向不会再次将请求与中的数据发送给其他页面(请求转发与重定向的区别。)
对于场景2,将递交按钮设置为点击后不可用。然后手动提交表单。
对于场景1,2,3 采用令牌机制(token)每次提交表单,带上令牌,服务器验证口令,口令合法处理请求,口令不合法,打回。
解决思路:
服务器和页面有一个相同的令牌,页面提交的时候,带上令牌,服务端验证是否跟他一致。如果一致则处理请求,如果不一致不处理请求。
再处理请求后把session中的token变一下,这样session中的token和页面提交的令牌不一样,也可以直接将服务器中的令牌移除。这样第二次请求火来,服务器中的token没值,服务器中的token和页面中的token就不一样了。

  1. 用户再第一次请求页面时,页面会生成一个不重复的令牌,放在session中,第一次提交表单会带上令牌.
  2. 服务器端从session中取出令牌。
  3. 服务端对照令牌,如果令牌相同,和验证成功提交表单,处理数据。
  4. 把服务端的session移除
  5. 用户点击后对按钮,页面会有一个缓存的token
  6. 提交表单会带上令牌,但是这时候服务器session中的令牌已经被移除了,所以验证失败,不会提交数据。

具体过程如下图所示:

表单重复提交解决办法