Asp.net 防止在浏览器刷新时重新提交数据

Asp.net 防止在浏览器刷新时重新提交数据,asp.net,Asp.net,我有一张表格。在提交按钮时,它会将一条记录插入数据库。如果我回到我的浏览器中刷新页面,它会重新提交,导致各种各样的问题,你可以想象得到。我如何确保用户不能刷新上一页,并且该页的状态会在刷新时进行另一次自动提交 我没有使用ViewState。实际上,我在页面指令中禁用了它 不,响应。重定向无法解决此问题。用户仍然可以使用浏览器的“后退”按钮返回,并在提交时刷新,它仍然会运行按钮的事件,将数据发送到my DL insert的下游 最简单的方法是将表单包装在中。这样,所有回发都是通过AJAX完成的,浏

我有一张表格。在提交按钮时,它会将一条记录插入数据库。如果我回到我的浏览器中刷新页面,它会重新提交,导致各种各样的问题,你可以想象得到。我如何确保用户不能刷新上一页,并且该页的状态会在刷新时进行另一次自动提交

我没有使用ViewState。实际上,我在页面指令中禁用了它 不,响应。重定向无法解决此问题。用户仍然可以使用浏览器的“后退”按钮返回,并在提交时刷新,它仍然会运行按钮的事件,将数据发送到my DL insert的下游
最简单的方法是将表单包装在中。这样,所有回发都是通过AJAX完成的,浏览器永远不会要求您重新提交表单。

最简单的方法是将表单包装在中。这样,所有回发都是通过AJAX完成的,浏览器永远不会要求您重新提交表单。

最好的两种方式是:

对数据库的不同字段执行检查

以使用基于时间的salt的形式创建隐藏令牌。如果在脚本中放入逻辑以检查现有时间并将其与令牌进行比较,则可以允许提交或定义提交。例如,如果表单是在某个时间绘制的,则存储令牌,并且可以在30-60秒内提交,但之后不能提交


最好的两种方法是:

对数据库的不同字段执行检查

以使用基于时间的salt的形式创建隐藏令牌。如果在脚本中放入逻辑以检查现有时间并将其与令牌进行比较,则可以允许提交或定义提交。例如,如果表单是在某个时间绘制的,则存储令牌,并且可以在30-60秒内提交,但之后不能提交


我最常用的解决方案是:

当用户第一次访问非回发页面时,生成令牌值GUID很容易。获取此令牌值并将其存储在会话变量和页面中的隐藏字段中。作为一个字段,此值应在未启用ViewState的情况下持续到服务器的往返过程中。我可能会在该计数上出错,因此请检查它!。如果页面被刷新并且表单值丢失,非回发初始化将生成一个新值

当页面发回时,检索隐藏字段值并将其与用户会话变量中的预期值进行比较:

如果令牌匹配,则将提交接受为正版,从会话变量中删除令牌,然后继续您的工作流。 如果会话变量中缺少令牌,则用户正在尝试再次提交表单。-如果令牌不匹配,则用户正在重放表单的旧提交。 实现此类解决方案的示例代码:

public partial class MyPage : Page
{
    protected HiddenField tokenField; 

    protected void Page_Load()
    {
        if(!IsPostBack)
            CreateToken();
    }

    // Call this method to establish a token in session and on the page.
    private void CreateToken()
    {
        string token = new Guid().ToString();
        Session["dupeToken"] = token;
        tokenField.Value = token;
    }

    // Call this method to validate the token before continuing workflow.
    private bool TokenIsValid()
    {
        string expectedToken = (string)Session["dupeToken"];
        if(expectedToken == null)
            return false;

        string actualToken = tokenField.Value;

        return expectedToken == actualToken;
    }

    // Call this method when the page submission is complete to prevent re-submission.
    private void ConsumeToken()
    {
        Session["dupeToken"] = null;
    }
}

我最常用的解决方案是:

当用户第一次访问非回发页面时,生成令牌值GUID很容易。获取此令牌值并将其存储在会话变量和页面中的隐藏字段中。作为一个字段,此值应在未启用ViewState的情况下持续到服务器的往返过程中。我可能会在该计数上出错,因此请检查它!。如果页面被刷新并且表单值丢失,非回发初始化将生成一个新值

当页面发回时,检索隐藏字段值并将其与用户会话变量中的预期值进行比较:

如果令牌匹配,则将提交接受为正版,从会话变量中删除令牌,然后继续您的工作流。 如果会话变量中缺少令牌,则用户正在尝试再次提交表单。-如果令牌不匹配,则用户正在重放表单的旧提交。 实现此类解决方案的示例代码:

public partial class MyPage : Page
{
    protected HiddenField tokenField; 

    protected void Page_Load()
    {
        if(!IsPostBack)
            CreateToken();
    }

    // Call this method to establish a token in session and on the page.
    private void CreateToken()
    {
        string token = new Guid().ToString();
        Session["dupeToken"] = token;
        tokenField.Value = token;
    }

    // Call this method to validate the token before continuing workflow.
    private bool TokenIsValid()
    {
        string expectedToken = (string)Session["dupeToken"];
        if(expectedToken == null)
            return false;

        string actualToken = tokenField.Value;

        return expectedToken == actualToken;
    }

    // Call this method when the page submission is complete to prevent re-submission.
    private void ConsumeToken()
    {
        Session["dupeToken"] = null;
    }
}

第二次提交实际上应该是非法的,还是通常是无意的?许多人正在寻找这个问题的答案。我也在名单上。问题是每一个国家的程序,您的代码,所以这可以避免。。。像数据库中的distint字段。。。但是里面有很多如果和但是。到目前为止,我还在搜索…第二次提交是否真的是非法的,还是通常是无意的?许多人正在搜索这个问题的答案。我也在名单上。问题是每一个国家的程序,您的代码,所以这可以避免。。。像数据库中的distint字段。。。但是里面有很多如果和但是。到目前为止,我仍在搜索…如果您点击“后退”按钮并“重播”提交,令牌将匹配:就像任何其他表单元素一样,存储原始令牌的隐藏字段保持不变。它们不应该改变,因为令牌仅在访问表单时生成,而表单中的字段中不存在值
E独特的提交。由于令牌在提交时的会话中被使用,因此它将不会出现在表单的重播中。问题是“后退”按钮被破坏:当您使用“后退”按钮导航到发布的页面时,其所有表单输入元素(包括隐藏字段)都具有您用于原始发布的值。因此,当用户重新提交时,原始令牌仍然存在。页面上可用的令牌应该无关紧要,因为会话变量中不会有令牌。这种方法的关键是在表单和会话中都使用相同的令牌。直到现在,我还没有看到您添加了一个方法consumertoken+1-这很有效,而且比我建议的解决方案简单。可能值得注意的是,您在提交/保存文本时使用了令牌。如果单击“上一步”按钮并“重播”提交,令牌将匹配:与任何其他表单元素一样,存储原始令牌的隐藏字段保持不变。它们不应,因为令牌仅在访问表单时生成,而表单中的值不存在于字段中,即唯一提交。由于令牌在提交时的会话中被使用,因此它将不会出现在表单的重播中。问题是“后退”按钮被破坏:当您使用“后退”按钮导航到发布的页面时,其所有表单输入元素(包括隐藏字段)都具有您用于原始发布的值。因此,当用户重新提交时,原始令牌仍然存在。页面上可用的令牌应该无关紧要,因为会话变量中不会有令牌。这种方法的关键是在表单和会话中都使用相同的令牌。直到现在,我还没有看到您添加了一个方法consumertoken+1-这很有效,而且比我建议的解决方案简单。值得注意的是,您在提交/保存文本时使用了令牌。