golang-web框架revel一个表单提交的总结

简介: 这里要介绍好是revel框架的表单post提交的列子,主要是用于入门学习,和一些知识点的讲解; 首先:   来了解一个问题那就是重复提交表单,做过form表单提交的同学都知道,如果表单提交后不做处理,那么直接在浏览器按下F5,会再次提交表单内容到服务器,这就是重复提交,当然要防止这个有多种方法,...

这里要介绍好是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)
}
View Code

  第一次进来路由指向这个页面的时候是get请求,此时使用cookie保存一下生成的token,revel框架是mvc模式,可以通过c.Render(token)把参数输出到页面上,在使用模板直接绑定到hidden元素上面

  <input type="hidden" name="add_token" value="{{.token}}"/>这里把token输出到了影藏域里面,

  下面就是填写表单内容,再执行保存提交按钮,post到后台的地址,这里的代码知识点有

 

  1.c.Request.Method:获取请求的http方式;

  2.c.Params.Get("txtName"):获取页面元素name为txtName名字的参数值;

  3.fmt.Printf("%v","我爱祖国"):这里的print就是打印信息在后台,%v是占位符,类似于C#{0}效果;

  4.c.Validation.Required(token).Message("token验证失败,请重新打开页面"):c.Validation.Required是revel框架封装的验证方法,Message("xxxx")是不符合验证格式了,就返回的提示信息;

  5.c.FlashParams():revel框架的验证错误信息是一次性的,类似于.net mvc中的tempdata效果,只能被读取一次;

  6.ck_Token, ck_err := c.Request.Cookie(ck_name):Request.Cookie是获取对应名称的cookie信息,这里看到的:=是go语言的语法,此语法的作用很大,具体请去了解go基础;

  7.bbNew := []byte(bstr):这里[]byte()直接吧字符串信息转化成了byte[]看起来是不是很方便

  8.WriteFileAppend:是自定义的记录文本信息的方法,里面最重要的是defer fl.Close(),这个defer意思就是等待方法执行完后,在调用这个close释放资源,这里有点像finally的感觉

 

  再发下html模板代码

{{set . "title" "搜-学校-加入圈子"}}
{{template "header.html" .}}

    <form action="/app/add" method="post" style="margin-bottom:20px">
          <div class="form-group">
            <label for="txtName">学校-名称(<font style="color:#337ab7">必填</font>)</label>
            <input type="text" class="form-control"  maxlength="50" id="txtName" name="txtName" required placeholder="学校名称">
          </div>
          <div class="form-group">
            <label for="txtLink">学校-网站地址</label>
            <input type="text" class="form-control" maxlength="200" id="txtLink" name="txtLink" placeholder="http://xxx">
          </div>
          <div class="form-group">
            <label for="txtHeader">学校-申请人(<font style="color:#337ab7">必填</font>)</label>
            <input type="text" class="form-control"  maxlength="10" id="txtHeader" name="txtHeader" required placeholder="申请人名字">
          </div>
          <div class="form-group">
            <label for="txtTel">申请-电话(<font style="color:#337ab7">必填</font>)</label>
            <input type="text" class="form-control"  maxlength="20" id="txtTel" name="txtTel" required placeholder="申请人联系电话号码">
          </div>
          <div class="form-group">
            <label for="txtEmail">申请-邮箱(<font style="color:#337ab7">必填</font>)</label>
            <input type="Email" class="form-control"  maxlength="50" id="txtEmail" name="txtEmail" required placeholder="申请人邮箱如:8123@qq.com">
          </div>
          <!--<div class="form-group">
            <label for="exampleInputFile">File input</label>
            <input type="file" id="exampleInputFile">
            <p class="help-block">Example block-level help text here.</p>
          </div>-->
          <!--<div class="checkbox">
            <label>
              <input type="checkbox"> Check me out
            </label>
          </div>-->
          <button type="submit" class="btn btn-success">保 存</button>
          <input type="hidden" name="add_token" value="{{.token}}"/>
          <span>{{.result}}</span>
    </form>
<div class="container">
  <div class="row">
  <div class="span6">
    {{template "flash.html" .}}
  </div>
  </div>
</div>
{{template "footer.html" .}}
View Code

  最后,以上是一些知识点的个人认识和描述,有疑问或者有错误地方,欢迎来稿。

    

 

  

  

目录
相关文章
|
2月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
60 4
|
2月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
166 3
|
2月前
|
SQL 安全 PHP
PHP 自发布以来一直在 Web 开发领域占据重要地位,PHP 8 更是带来了属性、刚性类型等新特性。
【10月更文挑战第1天】PHP 自问世以来,凭借其易用性和灵活性,在 Web 开发领域迅速崛起。从简单的网页脚本语言逐步演进为支持面向对象编程的现代语言,尤其自 PHP 5.3 引入命名空间后,代码组织和维护变得更加高效。PHP 7 的性能优化和 PHP 8 的新特性(如属性和刚性类型)进一步巩固了其地位。框架如 Laravel、Symfony、Yii2 和 CodeIgniter 等简化了开发流程,提高了效率和安全性。
54 2
|
1月前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
182 45
|
1月前
|
开发框架 搜索推荐 数据可视化
Django框架适合开发哪种类型的Web应用程序?
Django 框架凭借其强大的功能、稳定性和可扩展性,几乎可以适应各种类型的 Web 应用程序开发需求。无论是简单的网站还是复杂的企业级系统,Django 都能提供可靠的支持,帮助开发者快速构建高质量的应用。同时,其活跃的社区和丰富的资源也为开发者在项目实施过程中提供了有力的保障。
|
1月前
|
开发框架 JavaScript 前端开发
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
38 2
|
1月前
|
中间件 Go API
Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架
本文概述了Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架。
85 1
|
1月前
|
缓存 前端开发 中间件
go语言中Web框架
【10月更文挑战第22天】
48 4
|
1月前
|
SQL 安全 PHP
探索PHP的现代演进:从Web开发到框架创新
PHP是一种流行的服务器端脚本语言,自诞生以来在Web开发领域占据重要地位。从简单的网页脚本到支持面向对象编程的现代语言,PHP经历了多次重大更新。本文探讨PHP的现代演进历程,重点介绍其在Web开发中的应用及框架创新,如Laravel、Symfony等。这些框架不仅简化了开发流程,还提高了开发效率和安全性。
35 3
|
1月前
|
前端开发 JavaScript 开发工具
从框架到现代Web开发实践
从框架到现代Web开发实践
46 1