go防止多次递交表单
不知道你是否曾经看到过一个论坛或者博客,在一个帖子或者文章后面出现多条重复的记录,这些大多数是因为用户重复递交了留言的表单引起的。由于种种原因,用户经常会重复递交表单。通常这只是鼠标的误操作,如双击了递交按钮,也可能是为了编辑或者再次核对填写过的信息,点击了浏览器的后退按钮,然后又再次点击了递交按钮而不是浏览器的前进按钮。当然,也可能是故意的——比如,在某项在线调查或者博彩活动中重复投票。那我们如何有效的防止用户多次递交相同的表单呢?
解决方案是在表单中添加一个带有唯一值的隐藏字段。在验证表单时,先检查带有该惟一值的表单是否已经递交过了。如果是,拒绝再次递交;如果不是,则处理表单进行逻辑处理。另外,如果是采用了Ajax模式递交表单的话,当表单递交后,通过javascript来禁用表单的递交按钮。
我继续拿4.2小节的例子优化:
<input type="checkbox" name="interest" value="football">足球
<input type="checkbox" name="interest" value="basketball">篮球
<input type="checkbox" name="interest" value="tennis">网球
用户名:<input type="text" name="username">
密码:<input type="password" name="password">
<input type="hidden" name="token" value="{{.}}">
<input type="submit" value="登陆">
我们在模版里面增加了一个隐藏字段token
,这个值我们通过MD5(时间戳)来获取惟一值,然后我们把这个值存储到服务器端(session来控制,我们将在第六章讲解如何保存),以方便表单提交时比对判定。
func login(w http.ResponseWriter, r *http.Request) {fmt.Println("method:", r.Method) //获取请求的方法if r.Method == "GET" {crutime := time.Now().Unix()h := md5.New()io.WriteString(h, strconv.FormatInt(crutime, 10))token := fmt.Sprintf("%x", h.Sum(nil))t, _ := template.ParseFiles("login.gtpl")t.Execute(w, token)} else {//请求的是登陆数据,那么执行登陆的逻辑判断r.ParseForm()token := r.Form.Get("token")if token != "" {//验证token的合法性} else {//不存在token报错}fmt.Println("username length:", len(r.Form["username"][0]))fmt.Println("username:", template.HTMLEscapeString(r.Form.Get("username"))) //输出到服务器端fmt.Println("password:", template.HTMLEscapeString(r.Form.Get("password")))template.HTMLEscape(w, []byte(r.Form.Get("username"))) //输出到客户端}
}
我们看到token已经有输出值,你可以不断的刷新,可以看到这个值在不断的变化。这样就保证了每次显示form表单的时候都是唯一的,用户递交的表单保持了唯一性。
我们的解决方案可以防止非恶意的攻击,并能使恶意用户暂时不知所措,然后,它却不能排除所有的欺骗性的动机,对此类情况还需要更复杂的工作。
go防止多次递交表单相关推荐
- 表单的几个基本常用功能
代码片段1: 在表单中禁用"回车键": $("#form").keypress(function(e) {if (e.which == 13) {return ...
- 【ASP.NET Web API教程】5.2 发送HTML表单数据:URL编码的表单数据
注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本系列教程,请先看前面的内容. 5.2 Sending HTML Form Data 5.2 发送HTML表单数据 本文引 ...
- jQuery实现表单验证
1.基于html表单,利用jQuery实现表单验证功能. 2.html基本结构和样式: 3.html代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHT ...
- 表单中隐藏域的html代码是,JS中input表单隐藏域及其使用方法_心病_前端开发者...
一.表单隐藏域 隐藏域是用来收集或发送信息的不可见元素,对于网页的访问者来说,隐藏域是看不见的.当表单被提交时,隐藏域就会将信息用你设置时定义的名称和值发送到服务器上. 代码格式: <input ...
- ccform 表单的单据打印
为什么80%的码农都做不了架构师?>>> 9.0 特别注意事项 1, 模板里面不要有西文字符. 2, 尽量不要用word来编辑尤其是高版本的word,要用写字板来编辑. 1, ...
- golang表单及验证支持
在Web开发中对于这样的一个流程可能很眼熟: 打开一个网页显示出表单. 用户填写并提交了表单. 如果用户提交了一些无效的信息,或者可能漏掉了一个必填项,表单将会连同用户的数据和错误问题的描述信息返回. ...
- html表单下拉美化教程,用javascript实现select的美化的方法
论坛经常有人会问到用CSS如何美化Select标签,其实但凡你看到很酷的都是用javascript来实现的.昨天试着做了一下,基本实现的初级功能.拿出来和大家一起分享一下.先可以看一下预览效果:htt ...
- php显示html表单内容,HTML表单是什么?HTML表单内容的详细介绍(附代码)
HTML 表单是用于搜集不同类型的用户输入的,表单是一个包含表单元素的区域:表单元素是允许用户在表单中(比如:文本域.下拉列表.单选框.复选框等等)输入信息的元素:表单使用表单标签( )定义. 一.介 ...
- 前端页面与form表单提交:代码分享
今天分享下"前端页面与form表单提交:代码分享"这篇文章,文中根据实例编码详细介绍,或许对大家的编程之路有着一定的参考空间与使用价值,需要的朋友接下来跟着云南仟龙Mark一起学习 ...
最新文章
- 交换网络安全防范系列五之802.1x-基于端口的网络访问控制技术
- python 绘制柱状图-「Python」python绘制图表
- 严定贵:互联网金融的速度与激情
- VS2010下安装配置OpenCV2.4.4
- marquee 移动属性
- InnoDB还是MyISAM?
- 用python将图片写入ppt_用python做ppt服务用于导入图片
- 360浏览器收藏夹_换了一台电脑,浏览器收藏的网站不见了,咋办?
- Dom4j工具--XML的DOM解析(下)--写操作
- 黑马程序员---java基础------------------多线程
- Java实验9 T6.将对象和数组存储在dat文件中
- Docker是什么,有什么用?一看就明白
- python实现对某招聘网接口测试获取平台信息
- 2022年中青杯B题数学建模文档及程序-三孩生育数学建模
- 《FLUENT 14流场分析自学手册》——第2章 流体流动分析软件概述 2.1 CFD软件简介...
- ①读后感之《当我们谈论爱情时我们在谈论什么》┊(美)雷蒙德.卡佛
- 【面向对象-09】子类、父类方法重写和覆盖
- QNX Hypervisor —— 虚拟设备
- PPT:灯塔工厂相关介绍
- Hive基础知识概念