【问题标题】:Post/Redirect/Get pattern for HTTP Responses with application/excel MIME Type使用 application/excel MIME 类型的 HTTP 响应的 Post/Redirect/Get 模式
【发布时间】:2011-11-16 13:33:50
【问题描述】:

我想将一些数据发布到服务器,作为响应,我想创建一个 CSV 文件,以application/excel 作为 MIME 类型(最近被识别为 Internet 媒体类型),以强制浏览器打开生成的Microsoft Excel 中的 CSV 文件。但是,我还想防止用户在刷新页面时意外重新提交相同的信息(重新发布表单)。

通过简单的 CRUD 操作,我使用Post/Redirect/Get 模式,因此任何进一步的刷新只会向服务器发送 HTTP Get 请求,不带任何参数,因此不会改变服务器的状态 (Idempotence)。

当响应不是页面而是文件时,阻止用户向服务器重新提交(重新发布)相同信息的公认模式是什么?

有什么想法吗?

【问题讨论】:

  • 请注意,如果您尝试通过刷新浏览器重新发布数据,Firefox(我认为是 IE 和 Safari)会发出警告。我注意到的最常见的(客户端)方法是使用 Javascript 禁用提交按钮。如果您依赖某些浏览器配合,您也可以尝试设置和检查 cookie。

标签: redirect refresh http-post httpresponse


【解决方案1】:

发布/重定向/获取模式是对浏览事件的响应。 这里没有浏览动作(表单提交只打开一个第三方应用程序,即excel),所以任何与浏览相关的模式都是无用的。

我建议您同时使用初始提交的服务器端跟踪(可能使用唯一令牌),这样您可以防止文件生成,以及易于编写的客户端脚本,如 <form onsubmit="this.onsubmit = function(){ return false ; }">

【讨论】:

    【解决方案2】:

    我可以为您提供另一种解决方案。

    • 对您提交的数据进行哈希 (MD5/SHA256 ..)。 hash 将是 [相当] 独一无二的。
    • 将它放在一个有时间限制的会话列表中,比如 5 分钟。
    • 即使您的用户也提交相同的数据。哈希值相同,您可以向用户提供错误消息。

    如果不同的用户可以发布相同的数据,您还可以在列表中保存用户信息。并根据用户给出错误信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-21
      • 1970-01-01
      • 2014-05-04
      • 1970-01-01
      • 2012-03-06
      相关资源
      最近更新 更多