GO—-防止多次提交表单

不知道你是否曾经看到过一个论坛或者博客,在一个帖子或者文章后面出现多条重复的记录,这些大多数是因为用户重复递交了留言的表单引起的。由于种种原因,用户经常会重复递交表单。通常这只是鼠标的误操作,如双击了递交按钮,也可能是为了编辑或者再次核对填写过的信息,点击了浏览器的后退按钮,然后又再次点击了递交按钮而不是浏览器的前进按钮。当然,也可能是故意的——比如,在某项在线调查或者博彩活动中重复投票。那我们如何有效的防止用户多次递交相同的表单呢?

解决方案是在表单中添加一个带有唯一值的隐藏字段。在验证表单时,先检查带有该惟一值的表单是否已经递交过了。如果是,拒绝再次递交;如果不是,则处理表单进行逻辑处理。另外,如果是采用了Ajax模式递交表单的话,当表单递交后,通过javascript来禁用表单的递交按钮。

GO代码

package main

import (
	"fmt"
	"html/template"
	"log"
	"math/rand"
	"net/http"
	"time"
)

func saygo(w http.ResponseWriter, r *http.Request) {
	if r.Method == "GET" {
		time := time.Now().Unix()
		num := rand.Int63n(900000)
		token := time + num
		t, _ := template.ParseFiles("form.html")
		t.Execute(w, token)

	} else {
		w.Header().Set("Content-Type", "text/html;charset=utf-8")
		r.ParseForm()
		token := r.Form.Get("token")
		if token != "" {
			//验证token的合法性 比如:token是否已处理过,可以通过memcached,file,db来检查
		} else {
			fmt.Fprintf(w, "token为空<br/>")
		}
		fmt.Fprintf(w, "<br/>")
		t, _ := template.ParseFiles("form.html")
		t.Execute(w, nil)
	}
}

func main() {
	http.HandleFunc("/", saygo)
	err := http.ListenAndServe(":9090", nil)
	if err != nil {
		log.Fatal("ListenAndServe: ", err)
	}
}

模板

<html>
<head>
<title>重复提交</title>
</head>
<body>
<form action="" method="post">
    唯一值:<input type="text" size="40" value="{{.}}" name="token"><br/>
    <input type="submit" value="提交">
</form>
</body>
</html>

我们看到token已经有输出值,你可以不断的刷新,可以看到这个值在不断的变化。这样就保证了每次显示form表单的时候都是唯一的,用户递交的表单保持了唯一性。
我们的解决方案可以防止非恶意的攻击,并能使恶意用户暂时不知所措,然后,它却不能排除所有的欺骗性的动机,对此类情况还需要更复杂的工作

We suggest the guillotine
quick weight loss How to Get the Grunge Fashion Look

Having experienced the gothic scene and fashion from its early stages
how to lose weight fastShopping List on the Bag of 8 Classic
how to lose weight fast
此条目发表在 网站开发 分类目录,贴了 标签。将固定链接加入收藏夹。

评论功能已关闭。