如何防止用户在网站上多次发布数据

Ron*_*ist 16 java-ee double-submit-problem

我正在开发一个Web应用程序(J2EE),我想知道可以从浏览器处理双重帖子的选项.

我过去看过和使用过的解决方案都是客户端的:

  • 用户单击它后立即禁用提交按钮.
  • 按照POST-Redirect-GET模式阻止用户单击后退按钮时的POST.
  • 处理表单的onSubmit事件并使用JavaScript跟踪提交状态.

如果可能的话,我更愿意实现服务器端解决方案.有没有比我上面提到的更好的方法,或者客户端解决方案最好?

Joe*_*ora 9

很难实施一个愚蠢的解决方案(因为他们总是改善白痴). 无论您做什么,客户端都可能被操纵或执行不正确.

您的解决方案必须是服务器端才能可靠和安全. 也就是说,一种方法是检查请求并检查系统/数据库状态或日志以确定它是否已被处理.理想情况下,如果可能的话,服务器端的进程应该是幂等的,并且如果不能,则必须防止欺骗提交.


zig*_*don 8

你可以提供一个"票证"作为表格的一部分,一些随机数 - 并确保它不会被接受两次,在服务器端.

  • 您无法阻止用户使用相同的故障单重新提交新请求,但您可以在服务器端拒绝该请求,并显示"重复请求"错误. (4认同)
  • 当然,如果它是一个合法的模式,你可以添加对它的支持 - 在服务器端,找到他们以前的请求(使用相同的票证),并根据需要更新信息.当然,这是你的愿意,你愿意接受对表格的更改. (2认同)

Jos*_*man 5

我想到了两种服务器端解决方案:

  1. 在隐藏表单字段中创建一次性使用“令牌”。使用令牌后,它将从您存储它的任何数据库或会话上下文对象中删除。第二次,它不会被接受。
  2. 缓存收到的信息,如果在特定时间段内(10 分钟?一个小时?您决定!)收到相同的表单,则会忽略该表单。