热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用Post/Redirect/Get实现Asp.net防止表单重复提交

前面的Post有提到解决Web中表单重复提交的方法,实际上表单重复提交的问题不单是Asp.net,其它动态Page都有。让我们看下面的图示:然后在刷新页

      前面的Post有提到解决Web中表单重复提交的方法,实际上表单重复提交的问题不单是Asp.net,其它动态Page都有。让我们看下面的图示:

PostRedirectGet_DoubleSubmitProblem
    

然后在刷新页面时经常看到提示框在IE中:

IE_3

Google Chrome:

Chrome_3

Firefox:

Firefox_thumb_1

 

最简单的解决方法就是使用Post-Redirect-Get模式,就是Http-Post完后,马上做Redirect操作,接下来那个页面是Get。这时用户强制按F5刷新也没有用了。最终实现的效果图:

PostRedirectGet_DoubleSubmitSolution

 

那在Asp.net MVC中如何去做呢,看下面简单View代码:

一个包含两个Input的表单:

<form method&#61;"post" id&#61;"form1" action&#61;"/Security/LoginVerify"><p> UserName:<input type&#61;"text" id&#61;"fusername" name&#61;"fusername" /><br />Password:<input type&#61;"password" id&#61;"fpassword" name&#61;"fpassword" /><input type&#61;"submit" value&#61;"Sign-in" />p>form>

Index Action 在这里做Get的操作, LoginVerify 在这里是Post的目标Action

[HttpPost]
public ActionResult LoginVerify(string fusername, string fpassword)
{return this.RedirectToAction("Index", "Security", new { fusername &#61; fusername });
}

public ActionResult Index(string fusername)
{ViewBag.UserName &#61; fusername &#43; " login success!";return View();
}

对应请求时的HTTP Request RAW是这样的:

POST http://localhost:91/Security/LoginVerify HTTP/1.1
Accept: text/html, application/xhtml&#43;xml, */*
Referer: http://localhost:91/Security/Login
Accept-Language: en-US,zh-CN;q&#61;0.5
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: localhost:91
Content-Length: 71
Connection: Keep-Alive
Pragma: no-cache
COOKIE: ASP.NET_SessionId&#61;qwwlp4rmjnzbsq3ob4dmcg3q

 

Http Response RAW:

HTTP/1.1 302 Found
Cache-Control: private
Content-Type: text/html; charset&#61;utf-8
Location: /Security?fusername&#61;admin
Server: Microsoft-IIS/7.5
X-AspNetMvc-Version: 3.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Sat, 24 Mar 2012 02:54:26 GMT
Content-Length: 142


Object moved to here.


在现在大多数的Web应用程序中都使用是Http 302的重定向。Http 1.1说明书中引用HTTP 303就是用来应对这种用户提交表单后可以在浏览器安全的刷新场景。 HTTP 303 意义是这样的&#xff1a;

Used to tell the client that the resource should be fetched using a different URL. This
new URL is in the Location header of the response message. Its main purpose is to
allow responses to POST requests to direct a client to a resource.

 

在Asp.net MVC可以这些去实现一个自定义ActionResult:

///


/// SeeOtherRedirectResult
///

public class SeeOtherRedirectResult : ActionResult
{private string _url;/// /// Initializes a new instance of the class./// /// Target URL.public SeeOtherRedirectResult(string url){_url &#61; url;}/// /// Enables processing of the result of an action method by a custom type that inherits from the class./// /// The context in which the result is executed. The context information includes the controller, HTTP content, request context, and route data.public override void ExecuteResult(ControllerContext context){context.HttpContext.Response.StatusCode &#61; 303;context.HttpContext.Response.RedirectLocation &#61; _url;}
}


然后Action中使用它&#xff0c;来实现Http 303的重定向。&#xff1a;

[HttpPost]
public ActionResult LoginVerify(string fusername, string fpassword)
{return new SeeOtherRedirectResult(Url.Action("Index", "Security", new { fusername &#61; fusername }));
}


运行时&#xff0c;我们来看Http Response RAW:

HTTP/1.1 303 See Other
Cache-Control: private
Location: /Security?fusername&#61;admin
Server: Microsoft-IIS/7.5
X-AspNetMvc-Version: 3.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Sat, 24 Mar 2012 03:05:37 GMT
Content-Length: 0


完了&#xff0c;希望对您Web开发有帮助。如有任何问题请留言!

您可能感兴趣的文章&#xff1a;

Asp.net MVC中防止HttpPost重复提交
JQuery防止退格键网页后退

 


作者&#xff1a;Petter Liu
出处&#xff1a;http://www.cnblogs.com/wintersun/
本文版权归作者和博客园共有&#xff0c;欢迎转载&#xff0c;但未经作者同意必须保留此段声明&#xff0c;且在文章页面明显位置给出原文连接&#xff0c;否则保留追究法律责任的权利。
该文章也同时发布在我的独立博客中-Petter Liu Blog。

转:https://www.cnblogs.com/wintersun/archive/2012/03/24/2415349.html



推荐阅读
  • 如何在HTML中获取鼠标的当前位置
    本文介绍了在HTML中获取鼠标当前位置的三种方法,分别是相对于屏幕的位置、相对于窗口的位置以及考虑了页面滚动因素的位置。通过这些方法可以准确获取鼠标的坐标信息。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • 本文介绍了Sencha Touch的学习使用心得,主要包括搭建项目框架的过程。作者强调了使用MVC模式的重要性,并提供了一个干净的引用示例。文章还介绍了Index.html页面的作用,以及如何通过链接样式表来改变全局风格。 ... [详细]
author-avatar
明诺新源研_889
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有