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

Jakarta ee 如何防止用户在网站上多次发布数据,jakarta-ee,double-submit-problem,Jakarta Ee,Double Submit Problem,我正在开发一个web应用程序(J2EE),我想知道可用于处理来自浏览器的双帖子的选项 我过去看到和使用的解决方案都是客户端的: 用户单击“提交”按钮后立即禁用该按钮 遵循POST Redirect GET模式,在用户单击“后退”按钮时防止POST 处理表单的onSubmit事件,并使用JavaScript跟踪提交状态 如果可能的话,我更愿意实现服务器端解决方案。有没有比我上面提到的更好的方法,或者客户端解决方案是最好的?您可以在表单中提供一个“票证”作为表单的一部分,一些随机数-并确保它不会

我正在开发一个web应用程序(J2EE),我想知道可用于处理来自浏览器的双帖子的选项

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

  • 用户单击“提交”按钮后立即禁用该按钮
  • 遵循POST Redirect GET模式,在用户单击“后退”按钮时防止POST
  • 处理表单的onSubmit事件,并使用JavaScript跟踪提交状态

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

您可以在表单中提供一个“票证”作为表单的一部分,一些随机数-并确保它不会在服务器端被接受两次。

想到两个服务器端解决方案:

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

  • 实现一个uniqueid来处理请求,并将其与执行一起记录。如果该id已被记录,则不会再次执行该作业。这有点像回退解决方案-您应该尝试禁用按钮或链接客户端,就像您建议自己的那样

    我会使用时间戳并将值与服务器端代码进行比较。如果两个时间戳足够接近并且具有相同的IP地址,则忽略第二次表单提交

    很难实现防白痴的解决方案(因为他们总是在改进白痴)无论您做什么,客户端都可能被操纵或执行错误。


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

    我们使用时间敏感的一次性票据。这就像是一个会话id。但它与表单/页面绑定


    当用户提交页面时,您将丢弃票证,并且您只处理带有有效票证的页面。同时,您可以通过将票证附加到用户来加强安全性,因此,如果用户提交的票证不是提交票证的用户,那么您将拒绝该请求。

    如果您碰巧正在使用Struts,它内置了类似的功能


    op要求服务器端解决方案我没有仔细阅读帖子,但我编辑了我的答案,使其更符合问题。如果用户在这段时间内确实有两位数据要发布,该怎么办?你的答案似乎是运气不好。你如何处理用户按下后退按钮(大多数浏览器不重新请求)、更改表单中的数据并再次提交相同的“票证”的情况?你不能阻止用户使用相同的票证重新提交新请求,但你可以在服务器端拒绝它,并出现“重复请求”错误。对,但人们这样做是有目的的——提交一份表格,因为他们知道他们需要更正某些内容而按下返回键,然后再次提交表格。他们合法使用浏览器的“后退”按钮编辑记录将导致错误。当然,如果这是合法模式,您可以添加对它的支持-在服务器端,查找他们以前的请求(使用相同的票证),并根据需要更新信息。当然,您愿意接受表单更改的时间取决于您的决定。如果提交完全完成,您应该禁用令牌,或者如果提交部分完成,您应该允许令牌重复使用,同时处理部分提交的详细信息。1。如何处理用户按下后退按钮(大多数浏览器不会重新请求)、更改表单中的数据并再次提交相同的令牌?2.如果在提交表单的时间段内,表单的值为a,然后用户将其更改为值B,然后再次将其更改回值a,该怎么办?这难道不会忽略最后的变化吗?链接断了。