C# - 如果用户在插入记录后刷新页面,则会创建重复记录。我怎么能阻止这个?

时间:2011-10-19 11:57:02

标签: c# .net web-applications insert postback

页面上的任何其他功能都是如此。我不希望在回发之前发生的最后一次事件再次发生。

5 个答案:

答案 0 :(得分:4)

我相信你应该看看PRG Pattern(发布/重定向/获取)

  

发布/重定向/获取(PRG)是Web开发人员的常见设计模式   帮助避免某些重复的表单提交并允许用户代理   使用书签和刷新按钮更直观地表现

在ASP.NET中:

  1. POST - 提交按钮单击导致HTTP POST
  2. REDIRECT + GET - HttpResponse.Redirect()
  3. MSDN,Redirecting Users to Another Page

      

    在服务器代码中,您可以通过调用来以编程方式重定向   重定向方法。该方法向用户的浏览器发送命令   导致浏览器为目标页面发出HTTP GET命令。

    关于PRG模式的几个重要说明:

      

    !!! PRG模式无法解决重复表单的每个场景   提交。一些已知的重复表单提交,PRG不能   解决的是:

         
        
    • 如果网络用户返回网络表单并重新提交。
    •   
    • 如果Web用户在加载服务器响应之前多次单击提交按钮(可以通过使用JavaScript禁用来阻止)   第一次点击后的按钮。
    •   
    • 如果由于服务器延迟而导致Web用户在初始提交完成之前刷新,则会导致重复的HTTP POST请求   某些用户代理。
    •   
    • 如果恶意Web用户提交表单两次,尽管客户端安全措施和典型的浏览器行为。
    •   

答案 1 :(得分:3)

您应该了解PRG(发布/重定向/获取)模式:

  

发布/重定向/获取(PRG)是Web开发人员的常见设计模式   帮助避免某些重复的表单提交并允许用户代理   使用书签和刷新按钮更直观地表现。

来源:http://en.wikipedia.org/wiki/Post/Redirect/Get

基本上,您需要在用户完成POST后通过GET请求重定向。

答案 2 :(得分:2)

在数据库中插入记录之前,您可以检查已存在的条件。

就像在存储过程中一样,你可以检查

如果不存在(从列名为'test'的表中选择id) 开始   inser声明.. 端

答案 3 :(得分:1)

这是PRG。避免这种情况的简单方法是再次将用户重定向到同一页面:

页面 Update.aspx

void btnUpdate_click(object sender, EventArgs e){
    // do your update here
    Response.Redirect("Update.aspx");
}

这会在redirect-header中创建Resoinse,浏览器会向GET页面创建Update.aspx个请求。如果用户刷新页面,则会发送GET。看:

  1. 用户提交表单: POST
  2. 服务器执行更新,返回重定向标头
  3. 浏览器接收response作为重定向命令: REDIRECT
  4. 浏览器向服务器发送同一页面的GET请求: GET
  5. 浏览器会收到response
  6. 回答的GET
  7. 如果用户刷新页面:浏览器上一个命令为GET,因此不会再次触发submit

答案 4 :(得分:1)

一种简单的方法是在用户点击按钮时使用javascript来禁用该按钮。

我需要一种在需要高安全性时避免刷新的方法是在会话中使用一个小的“令牌”。 比方说,我们在会话中放了一个小的32位整数。

该页面将包含一个包含我们的小整数标记的隐藏输入。 每次收到页面请求时,我们都会将该标记递增1,然后在执行此操作之前,检查与请求中收到的标记是否相等。

如果匹配,则不是刷新。 如果它们不匹配,则刷新。

这也会阻止尝试使用浏览器按钮进行后退操作。

当然,在令牌不匹配时,页面应该更改,否则您将再次遇到刷新问题。 它应该显示“嘿,刷新或下次不允许,按此处继续”。

为了提高安全性,您可以使用常量值对该整数进行xor,例如,取决于会话中常量的其他值。