Go基础学习记录 - 编写Web应用程 - Web开发输入验证(一)

转载

Go基础学习记录 - 编写Web应用程 - Web开发输入验证(一)

前面的文章分享的部分功能都能正常使用,本次分享分析下 -- 输入验证

为了保持项目的可学习性,我这里将之前分享的代码积累了下,放在github上,想要尽快入手学习的,可以直接clone我的代码,写代码不上手,都等于白搭,光看的话,对于我来说,我是不行的,没办法学会。

项目地址

https://github.com/durban89/wiki_blog
tag: 1.0.1

有些同学可能看不懂,怎么就只给了这些,完全不懂呀。我把使用的命令打出来,照着操作,就应该可以解决了

git clone https://github.com/durban89/wiki_blog /local/path
cd /local/path
git fetch origin
git checkout 1.0.1

这些我觉得 够清晰了。OK!

继续分享的输入验证的逻辑。

Web开发中最重要的原则之一是您不能信任客户端用户表单中的任何内容。
您必须在使用之前验证所有传入数据。
许多网站都受到这个问题的影响,这个问题既简单又至关重要。
有两种方法可以验证常用的表单数据。
第一个是前端的JavaScript验证,第二个是后端的服务器验证。
本次只分享Web开发中的服务器端验证。

必填字段

有时我们要求用户输入一些字段,但他们无法完成该字段。可以使用len函数来获取字段的长度,以确保用户输入了某些内容。在ArticleSave方法中加入如下代码

if len(r.Form["author"][0]) == 0 {
    fmt.Println("author is empty")
    http.Redirect(w, r, "/view/"+title, http.StatusFound)
}

当提交的时候我们不给author赋值,然后点击Submit提交,会看到输出如下内容

author: []
author is empty

r.Form在空白时对待不同的表单元素类型。
对于空文本框,文本区域和文件上传,它返回一个空字符串;
对于单选按钮和复选框,它甚至不会创建相应的项目。
相反,如果您尝试访问它,您将收到错误。
因此,使用r.Form.Get()获取字段值更安全,因为如果该值不存在,它将始终返回空。
另一方面,r.Form.Get()一次只能获得一个字段值,因此您需要使用r.Form来获取值的映射。我们修改下刚才那段代码如下

if len(r.Form.Get("author")) == 0 {
    fmt.Println("author is empty")
    http.Redirect(w, r, "/view/"+title, http.StatusFound)
}

当提交的时候我们不给author赋值,然后点击Submit提交,会看到输出如下内容

author: []
author is empty

得到的结果跟上段代码是一致的

数字

有时我们需要提交过来的数据是数字而不是字段值等其他文本。
例如,假设我们只需要整数形式的用户年龄,即50或10,而不是“足够老”或“年轻人”。
如果我们需要一个正数,我们可以先将值转换为int类型,然后再处理它。下面我们在ArticleSave方法中加入如下代码

getint, err := strconv.Atoi(r.Form.Get("author"))
if err != nil {
    fmt.Println(err)
    http.Redirect(w, r, "/view/"+title, http.StatusFound)
}
fmt.Println("getint:", getint)

当提交的时候我们给author赋值durban,然后点击Submit提交,会看到输出如下内容

author: [durban]
strconv.Atoi: parsing "durban": invalid syntax

当提交的时候我们给author赋值10,然后点击Submit提交,会看到输出如下内容

author: [10]
getint: 10

另一种方法是使用正则表达式。
代码如下,我们将上面的代码段更换如下

if m, _ := regexp.MatchString("^[0-9]+$", r.Form.Get("author")); !m {
    fmt.Println("非整数")
    http.Redirect(w, r, "/view/"+title, http.StatusFound)
    return
}
fmt.Println("get author:", r.Form.Get("author"))

当提交的时候我们给author赋值10,然后点击Submit提交,会看到输出如下内容

author: [10]
get author: 10

出于高性能目的,正则表达式效率不高,但简单的正则表达式通常足够快。
如果您熟悉正则表达式,那么这是验证数据的一种非常方便的方法。
请注意,Go使用[RE2],因此支持所有UTF-8字符。

RE2是一种快速,安全,线程友好的替代方法,用于回溯正则表达式引擎,如PCRE,Perl和Python中使用的那些。
它是一个C ++库。

项目更新地址

https://github.com/durban89/typescript_demo.git
tag: 1.0.2
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,637评论 18 139
  • HTML 5 HTML5概述 因特网上的信息是以网页的形式展示给用户的,因此网页是网络信息传递的载体。网页文件是用...
    阿啊阿吖丁阅读 3,875评论 0 0
  • 三十岁之前我很少赶集。因为感觉讨价还价是一件极无趣的事情。卖家要三元一斤,应该还到多少?给多了,是不是就买贵了?给...
    郭晓光阅读 345评论 0 5
  • ~~~义不掌财,慈不掌兵!是很有道理的,于是乎,我们很容易走向反面! 所以,对于我们生活而言,最困难的也是最至关重...
    乾小龙阅读 110评论 0 0
  • 15-1-40-项鲽-南京 实践原创/Lesson Plan:A taste of the moon 首先在此衷心...
    Yia依亚阅读 411评论 1 4