这里要介绍好是revel框架的表单post提交的列子,主要是用于入门学习,和一些知识点的讲解;
首先:
来了解一个问题那就是重复提交表单,做过form表单提交的同学都知道,如果表单提交后不做处理,那么直接在浏览器按下F5,会再次提交表单内容到服务器,这就是重复提交,当然要防止这个有多种方法,这里简单描述一种常见的:
一种是加入token失效验证,这个token其实就是一个值,验证的原理是第一次客户打开页面时候获取到一个分配的值,每次用户刷新页面的时候这个分配的值都需要变动,并且这个值在用户提交表单时候会进行验证,验证页面传递到后端程序保存的值是否一致,如果提交表单成功后,这个值会失效或者来说被清空。
其次:上代码+分析
package controllers import "github.com/revel/revel" import "fmt" //import "io/ioutil" import "encoding/json" import "os" import "io" import "time" import "net/http" type Concate struct { Name string Link string Concat string Tel string Email string } func WriteFileAppend(filename string, data []byte) error { fl, err := os.OpenFile(filename, os.O_APPEND|os.O_CREATE, 0644) if err != nil { return err } defer fl.Close() n, err := fl.Write(data) if err == nil && n < len(data) { err = io.ErrShortWrite } return err } func (c App) Add() revel.Result { method := c.Request.Method fmt.Printf(method) ck_name := "add_token" if method == "POST" { name := c.Params.Get("txtName") link := c.Params.Get("txtLink") concat := c.Params.Get("txtHeader") tel := c.Params.Get("txtTel") email := c.Params.Get("txtEmail") token := c.Params.Get("add_token") fmt.Printf("学校加入参数:name=%v;link=%v;concat=%v;tel=%v;email=%v;token=%V", name, link, concat, tel, email, token) c.Validation.Required(token).Message("token验证失败,请重新打开页面") c.Validation.Required(name).Message("学校名称,必须填写") c.Validation.Required(concat).Message("申请人名,必须填写") c.Validation.Required(tel).Message("联系电话,必须填写") c.Validation.Required(email).Message("联系邮箱,必须填写") if c.Validation.HasErrors() { // 在flash上下文中保存验证错误并重定向 c.Validation.Keep() c.FlashParams() return c.Render() } result := "加入园子-失败" ck_Token, ck_err := c.Request.Cookie(ck_name) if ck_err != nil { return c.Render(result) } if ck_Token.Value != token { return c.Render(result) } concate := Concate{Name: name, Link: link, Concat: concat, Tel: tel, Email: email} bb, err := json.Marshal(concate) if err != nil { return c.Render(result) } bstr := string(bb) + "," bbNew := []byte(bstr) err = WriteFileAppend(`./WiKiApp/public/js/add.json`, bbNew) if err == nil { result = " 加入园子-成功,稍后会有邮件或客服人员联系您" } return c.Render(result) } //创建token,防止重复提交 token := time.Now().Format("2006-01-02 15:04:05") ck := http.Cookie{Name: ck_name, Value: token} c.SetCookie(&ck) return c.Render(token) }