日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Go Web学习笔记】第三章 Go与表单的操作

發布時間:2023/12/20 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Go Web学习笔记】第三章 Go与表单的操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言:大家好,以下所有內容都是我學習韓茹老師的教程時所整理的筆記。部分內容有過刪改, 推薦大家去看原作者的文檔進行學習, 本文章僅作為個人的學習筆記,后續還會在此基礎上不斷修改。學習Go Web時應該已經熟悉Go語言基本語法以及計算機網絡的相關內容。

學習鏈接:https://www.chaindesk.cn/witbook/17/253
參考書籍:《Go Web編程》謝孟軍

第三章、表單操作

1、 處理表單的輸入

先來看一個表單遞交的例子,我們有如下的表單內容,命名成文件login.html(放入當前新建項目的目錄里面)

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>登錄頁面</title></head><body><form action="http://127.0.0.1:8080/login" method="post">用戶名:<input type="text" name="username"><br>密&nbsp&nbsp&nbsp碼:<input type="password" name="password"><br><input type="submit" value="登陸"></form></body></html>

上面遞交表單到服務器的/login,當用戶輸入信息點擊登陸之后,會跳轉到服務器的路由login里面,我們首先要判斷這個是什么方式傳遞過來的,POST還是GET呢?

http包里面有一個很簡單的方式就可以獲取,我們在前面web的例子的基礎上來看看怎么處理login頁面的form數據,創建一個go文件:demo01_loginserver.go,代碼如下:

package mainimport ("fmt""html/template""log""net/http""strings" )func sayhello(w http.ResponseWriter, r *http.Request) {r.ParseForm() //解析url傳遞的參數,對于POST則解析響應包的主體(request body)//注意:如果沒有調用ParseForm方法,下面無法獲取表單的數據fmt.Println(r.Form) //這些信息是輸出到服務器端的打印信息fmt.Println("path: ", r.URL.Path)fmt.Println("scheme: ", r.URL.Scheme)fmt.Println(r.Form["url_long"])for k, v := range r.Form {fmt.Println("key: ", k)fmt.Println("val: ", strings.Join(v, ""))}fmt.Fprintf(w, "Hello my route!") //這個寫入到w的是輸出到客戶端的 } func login(w http.ResponseWriter, r *http.Request) {r.ParseForm() //解析url傳遞的參數,對于POST則解析響應包的主體(request body)//注意:如果沒有調用ParseForm方法,下面無法獲取表單的數據fmt.Println("method: ", r.Method) //獲取請求的方法if r.Method == "GET" {t, _ := template.ParseFiles("login.html")t.Execute(w, nil)} else {//請求的是登陸數據,那么執行登陸的邏輯判斷fmt.Println("username: ", r.Form["username"])fmt.Println("password: ", r.Form["password"])} } func main() {http.HandleFunc("/hello", sayhello) //設置訪問的路由http.HandleFunc("/login", login) //設置訪問的路由err := http.ListenAndServe(":8080", nil) //設置監聽的端口if err != nil {log.Fatal("ListenAndServe: ", err)} }

然后打開瀏覽器,在地址欄輸入:http://127.0.0.1:8080/login

輸入用戶名和密碼后,點擊按鈕,觀察服務器端的運行結果:

如果沒有行 r.ParseForm()。我們輸入用戶名和密碼之后發現在服務器端是不會打印出來任何輸出的,為什么呢?默認情況下,Handler里面是不會自動解析form的,必須顯式的調用 r.ParseForm() 后,你才能對這個表單數據進行操作。我們添加代碼 r.ParseForm(),重新運行,再次測試輸入遞交,現在是不是在服務器端有輸出我們的輸入的用戶名和密碼了。

r.Form 里面包含了所有請求的參數,比如URL中 query-string、POST的數據、PUT的數據,所有當你在URL的 querystring 字段和POST沖突時,會保存成一個slice,里面存儲了多個值,Go官方文檔中說在接下來的版本里面將會把POST、GET這些數據分離開來。

現在我們修改一下login.html里面form的action值http://127.0.0.1:8080/login修改為

http://127.0.0.1:8080/login?username=ruby,再次測試,服務器的輸出username就是一個slice。

服務器端的輸出如下:

request.Form是一個url.Values類型,里面存儲的是對應的類似 key=value 的信息,下面展示了可以對form數據進行的一些操作:

v := url.Values{} v.Set("name", "Ava") v.Add("friend", "Jess") v.Add("friend", "Sarah") v.Add("friend", "Zoe") // v.Encode() == "name=Ava&friend=Jess&friend=Sarah&friend=Zoe"fmt.Println(v.Get("name")) fmt.Println(v.Get("friend")) fmt.Println(v["friend"])

注意: Request本身也提供了 FormValue() 函數來獲取用戶提交的參數。如 r.Form[“username”] 也可寫成 r.FormValue(“username”)。調用 r.FormValue 時會自動調用 r.ParseForm,所以不必提前調用。r.FormValue只會返回同名參數中的第一個,若參數不存在則返回空字符串。

運行結果:

2、 驗證表單的輸入

開發Web的一個原則就是,不能信任用戶輸入的任何信息,所以驗證和過濾用戶的輸入信息就變得非常重要,我們經常會在微博、新聞中聽到某某網站被入侵了,存在什么漏洞,這些大多是是因為網站對于用戶輸入的信息沒有做嚴格的驗證引起的,所以為了編寫出安全可靠的Web程序,驗證表單輸入的意義重大。

我們平常編寫Web應用主要有兩方面的數據驗證,一個是在頁面端的js驗證(目前在這方面有很多的插件庫,比如ValidationJS插件),一個是在服務器端的驗證,我們這小節講解的是如何在服務器端驗證。

2.1 必填字段

你想要確保從一個表單元素中得到一個值,例如前面小節里面的用戶名,我們如何處理呢?Go有一個內置函數len可以獲取字符串的長度,這樣我們就可以通過len來獲取數據的長度,例如:

if len(r.Form["username"][0]) == 0 {//為空的處理 }

r.Form 對不同類型的表單元素的留空有不同的處理, 對于空文本框、空文本區域以及文件上傳,元素的值為空值,而如果是未選中的復選框和單選按鈕,則根本不會在 r.Form 中產生相應條目,如果我們用上面例子中的方式去獲取數據時程序就會報錯。所以我們需要通過 r.Form.Get() 來獲取值,因為如果字段不存在,通過該方式獲取的是空值。

但是通過 r.Form.Get() 只能獲取單個的值,如果是map的值,必須通過上面的方式來獲取。

2.2 數字

你想要確保一個表單輸入框中獲取的只能是數字,例如,你想通過表單獲取某個人的具體年齡是50歲還是10歲,而不是像“一把年紀了”或“年輕著呢”這種描述

如果我們是判斷正整數,那么我們先轉化成int類型,然后進行處理

getint, err := strconv.Atoi(r.Form.Get("age"))if err != nil {//數字轉化出錯了,那么可能就是不是數字 }//接下來就可以判斷這個數字的大小范圍了if getint >100 {//太大了 }

還有一種方式就是正則匹配的方式

if m, _ := regexp.MatchString("^[0-9]+$", r.Form.Get("age")); !m {return false }

對于性能要求很高的用戶來說,這是一個老生常談的問題了,他們認為應該盡量避免使用正則表達式,因為使用正則表達式的速度會比較慢。但是在目前機器性能那么強勁的情況下,對于這種簡單的正則表達式效率和類型轉換函數是沒有什么差別的。如果你對正則表達式很熟悉,而且你在其它語言中也在使用它,那么在Go里面使用正則表達式將是一個便利的方式。

Go實現的正則是RE2,所有的字符都是UTF-8編碼的。

2.3 中文

有時候我們想通過表單元素獲取一個用戶的中文名字,但是又為了保證獲取的是正確的中文,我們需要進行驗證,而不是用戶隨便的一些輸入。對于中文我們目前有效的驗證只有正則方式來驗證,如下代碼所示

if m, _ := regexp.MatchString(`^[\x{4e00}-\x{9fa5}]+$`, r.Form.Get("zhname")); !m {return false }

2.4 英文

我們期望通過表單元素獲取一個英文值,例如我們想知道一個用戶的英文名,應該是rubyhan,而不是ruby韓。

我們可以很簡單的通過正則驗證數據:

if m, _ := regexp.MatchString("^[a-zA-Z]+$", r.Form.Get("enname")); !m{return false }

2.5 電子郵件地址

你想知道用戶輸入的一個Email地址是否正確,通過如下這個方式可以驗證:

if m, _ := regexp.MatchString(`^([\w\.\_]{2,10})@(\w{1,}).([a-z]{2,4})$`, r.Form.Get("email")); !m{fmt.Println("no") }else{fmt.Println("yes") }

2.6 手機號碼

你想要判斷用戶輸入的手機號碼是否正確,通過正則也可以驗證:

if m, _ := regexp.MatchString(`^(1[3|5|6|7|8][0-9]\d{8})$`, r.Form.Get("mobile")); !m {return false }

2.7 下拉菜單

如果我們想要判斷表單里面<select>元素生成的下拉菜單中是否有被選中的項目。有些時候黑客可能會偽造這個下拉菜單不存在的值發送給你,那么如何判斷這個值是否是我們預設的值呢?

我們的select可能是這樣的一些元素:

學&nbsp&nbsp&nbsp歷: <!-- selected="selected" --> <select name="xueli"><option>--請選擇--</option><option value="xiaoxue">小學</option><option value="chuzhong">初中</option><option value="gaozhong">高中</option><option value="dazhuan" >大專</option><option value="benke">本科</option><option value="shuoshi">碩士</option><option value="boshi">博士</option><option value="lieshi">烈士</option> </select>

那么我們可以這樣來驗證:

/** 驗證下拉列表*/ func checkSelect(xueli string) bool {slice := []string{"xiaoxue", "chuzhong", "gaozhong", "dazhuan", "benke", "shuoshi", "boshi", "lieshi"}for _, v := range slice {if v == xueli {return true}}return false }

2.8 單選按鈕

如果我們想要判斷radio按鈕是否有一個被選中了,我們頁面的輸出可能就是一個男、女性別的選擇,但是也可能一個15歲大的無聊小孩,一手拿著http協議的書,另一只手通過telnet客戶端向你的程序在發送請求呢,你設定的性別男值是1,女是2,他給你發送一個3,你的程序會出現異常嗎?因此我們也需要像下拉菜單的判斷方式類似,判斷我們獲取的值是我們預設的值,而不是額外的值。

<input type="radio" name="sex" value="male" checked="checked"/><input type="radio" name="sex" value="female"/><input type="radio" name="sex" value="other"/>其他

那我們也可以類似下拉菜單的做法一樣:

/** 驗證單選按鈕*/ func checkSex(sex string) bool {slice := []string{"male", "female", "other"}for _, v := range slice {if v == sex {return true}}return false }

2.9 復選框

有一項選擇興趣的復選框,你想確定用戶選中的和你提供給用戶選擇的是同一個類型的數據。

愛&nbsp&nbsp&nbsp好: <input type="checkbox" name="hobby" value="game" checked="checked"/>游戲 <input type="checkbox" name="hobby" value="girl" />女人 <input type="checkbox" name="hobby" value="money" />金錢 <input type="checkbox" name="hobby" value="power" />權利 <br />

對于復選框我們的驗證和單選有點不一樣,因為接收到的數據是一個slice:

/** 驗證復選框*/ func checkHobby(hobby []string) bool {slice := []string{"game", "girl", "money", "power"}hobby2 := Slice_diff(hobby, slice)if hobby2 == nil {return true}return false }func Slice_diff(slice1, slice2 []string) (diffslice []string) {for _, v := range slice1 {if !InSlice(v, slice2) {diffslice = append(diffslice, v)}}return }/** 判斷是一個切片中是否包含指定的數值*/ func InSlice(val string, slice []string) bool {for _, v := range slice {if v == val {return true}}return false }

2.10 身份證號碼

如果我們想驗證表單輸入的是否是身份證,通過正則也可以方便的驗證,但是身份證現在都是18位,我們可以進行如下驗證:

//驗證18位身份證,18位前17位為數字,最后一位是校驗位,可能為數字或字符X。 if m, _ := regexp.MatchString(`^(\d{17})([0-9]|X)$`, r.Form.Get("usercard")); !m {return false }

上面列出了我們一些常用的服務器端的表單元素驗證,希望通過這個引導入門,能夠讓大家對Go的數據驗證有所了解,特別是Go里面的正則處理。

2.11 完整代碼

1.html頁面:register.html

<!DOCTYPE html> <html><head><meta charset="utf-8"><title>驗證表單</title></head><body><h1>注冊信息</h1><form action="http://127.0.0.1:8080/register" method="post">用戶名:<input type="text" name="username" id="username" /><br />密&nbsp&nbsp&nbsp碼:<input type="password" name="pwd" id="pwd" /><br />中文名:<input type="text" name="zhname" id="zhname" /><br />英文名:<input type="text" name="enname" id="enname" /><br />年&nbsp&nbsp&nbsp齡:<input type="text" name="age" id="age" /><br />性&nbsp&nbsp&nbsp&nbsp別:<input type="radio" name="sex" value="male" checked="checked"/><input type="radio" name="sex" value="female"/><input type="radio" name="sex" value="other"/>其他<br />郵&nbsp&nbsp&nbsp箱:<input type="text" name="email" id="email" /><br />手機號碼:<input type="text" name="mobile" id="mobile" /><br />身份證號:<input type="text" name="usercard" id="usercard"><br>愛&nbsp&nbsp&nbsp好:<input type="checkbox" name="hobby" value="game" checked="checked"/>游戲<input type="checkbox" name="hobby" value="girl" />女人<input type="checkbox" name="hobby" value="money" />金錢<input type="checkbox" name="hobby" value="power" />權利<br />學&nbsp&nbsp&nbsp歷:<!--selected="selected"--><select name="xueli"><option>--請選擇--</option><option value="xiaoxue">小學</option><option value="chuzhong">初中</option><option value="gaozhong">高中</option><option value="dazhuan" >大專</option><option value="benke">本科</option><option value="shuoshi">碩士</option><option value="boshi">博士</option><option value="lieshi">烈士</option></select><br />頭&nbsp&nbsp&nbsp像:<input type="file" name="myfile" /><br />個人簡介:<br /><textarea rows="8" cols="70"></textarea><br /><!--按鈕:帶事件,不帶事件事件:發生了某一件事帶事件:按鈕被點擊,會觸發某一件事不帶事件:按鈕被點擊,頁面沒有反應。配合JavaScriptbutton:無事件image:無事件reset:有事件,清空表單數據submit:有事件,提交表單當submit按鈕被點擊,觸發form表單中action屬性的路徑(服務器地址)提交方式:get:默認詞意:獲取,獲得url?username=zhangsan&pwd=123456&sex=female..url:請求的路徑地址?前是請求路徑后本次請求提交的數據傳遞的數據:采用名值對的形式參數名=參數值&參數名=參數值。。。不安全:數據暴露了傳遞少量的數據容易亂碼post:詞意:郵政郵局數據打包之后,傳遞給服務端數據安全可以傳遞大量的數據不容易亂碼--><input type="button" value="按鈕" /><input type="reset" value="重置"/><input type="image" src="img/qq.gif" /><input type="submit" value="提交" /></form></body> </html>

2.go文件:demo02_checkform.go

package mainimport ("fmt""log""net/http""strconv""regexp" )func register(w http.ResponseWriter, r *http.Request) {r.ParseForm()//1.驗證必填字段//username := r.Form["username"][0]username := r.Form.Get("username")if len(username) == 0 {fmt.Println("用戶名不能為空!")fmt.Fprintf(w, "用戶名不能為空!") //這個寫入到w的是輸出到客戶端的}//2.驗證數字age, err := strconv.Atoi(r.Form.Get("age"))if err != nil {//數字轉化出錯了,那么可能就是不是數字fmt.Println("您輸入的不是數字!")fmt.Fprintf(w, "您輸入的不是數字!") //這個寫入到w的是輸出到客戶端的}//接下來就可以判斷這個數字的大小范圍了if age > 100 || age < 0 {//太大了或太小了fmt.Println("您輸入的年齡太大了或太小了,請輸入0-100之間的整數!")fmt.Fprintf(w, "您輸入的年齡太大了或太小了,請輸入0-100之間的整數!") //這個寫入到w的是輸出到客戶端的}//或者正則表達式if m, _ := regexp.MatchString("^[0-9]+$", r.Form.Get("age")); !m {fmt.Println("驗證有誤,您輸入的年齡太大了或太小了!")fmt.Fprintf(w, "驗證有誤,您輸入的年齡太大了或太小了!")}//3.驗證中文if m, _ := regexp.MatchString(`^[\x{4e00}-\x{9fa5}]+$`, r.Form.Get("zhname")); !m {fmt.Println("驗證有誤,請輸入中文!")fmt.Fprintf(w, "驗證有誤,請輸入中文!")}//4. 驗證英文if m, _ := regexp.MatchString("^[a-zA-Z]+$", r.Form.Get("enname")); !m {fmt.Println("驗證有誤,請輸入英文!")fmt.Fprintf(w, "驗證有誤,請輸入英文!")}//5. 郵箱if m, _ := regexp.MatchString(`^([\w\.\_]{2,10})@(\w{1,}).([a-z]{2,4})$`, r.Form.Get("email")); !m {fmt.Println("請輸入正確郵箱地址")fmt.Fprintf(w, "驗證有誤,請輸入正確郵箱地址!")}//6. 驗證手機號if m, _ := regexp.MatchString(`^(1[3|5|6|7|8][0-9]\d{8})$`, r.Form.Get("mobile")); !m {fmt.Println("請輸入正確手機號碼")fmt.Fprintf(w, "驗證有誤,請輸入正確手機號碼!")}//7. 下拉菜單xueli := r.Form.Get("xueli")res1 := checkSelect(xueli)if !res1 {fmt.Println("請選擇正確的下拉列表!")fmt.Fprintf(w, "請選擇正確的下拉列表!")}// 8. 單選按鈕sex := r.Form.Get("sex")res2 := checkSex(sex)if !res2 {fmt.Println("請選擇正確的性別!")fmt.Fprintf(w, "請選擇正確的性別!")}// 9. 復選框hobby := r.Form["hobby"]res3 := checkHobby(hobby)if !res3 {fmt.Println("請選擇正確的愛好!")fmt.Fprintf(w, "請選擇正確的愛好!")}// 10 身份證號//驗證18位身份證,18位前17位為數字,最后一位是校驗位,可能為數字或字符X。if m, _ := regexp.MatchString(`^(\d{17})([0-9]|X)$`, r.Form.Get("usercard")); !m {fmt.Println("請選擇正確的身份證號!")fmt.Fprintf(w, "請選擇正確的身份證號!")}//fmt.Println("驗證成功!")//fmt.Fprintf(w, "驗證成功!")}/** 驗證下拉列表*/ func checkSelect(xueli string) bool {slice := []string{"xiaoxue", "chuzhong", "gaozhong", "dazhuan", "benke", "shuoshi", "boshi", "lieshi"}for _, v := range slice {if v == xueli {return true}}return false }/** 驗證單選按鈕*/ func checkSex(sex string) bool {slice := []string{"male", "female", "other"}for _, v := range slice {if v == sex {return true}}return false }/** 驗證復選框*/ func checkHobby(hobby []string) bool {slice := []string{"game", "girl", "money", "power"}hobby2 := Slice_diff(hobby, slice)if hobby2 == nil {return true}return false }func Slice_diff(slice1, slice2 []string) (diffslice []string) {for _, v := range slice1 {if !InSlice(v, slice2) {diffslice = append(diffslice, v)}}return }/** 判斷一個切片中是否包含指定的數值*/ func InSlice(val string, slice []string) bool {for _, v := range slice {if v == val {return true}}return false }func main() {http.HandleFunc("/register", register) //設置訪問的路由err := http.ListenAndServe(":8080", nil) //設置監聽的端口if err != nil {log.Fatal("ListenAndServe: ", err)} }

(補充:下面是自己實現的一表單:

package mainimport ("fmt""log""net/http""regexp""strconv""text/template" )func register(w http.ResponseWriter, r *http.Request) {r.ParseForm()fmt.Println("method: ", r.Method) // 獲取請求的方法if r.Method == "GET" {t, _ := template.ParseFiles("register.html")t.Execute(w, nil)} else {// 1. 驗證必填字段username := r.Form.Get("username")if len(username) == 0 {fmt.Println("用戶名不能為空!")fmt.Fprintf(w, "用戶名不能為空!")}// 2. 驗證數字age, err := strconv.Atoi(r.Form.Get("age"))if err != nil {// 數字轉換出錯,那么可能就不是數字了fmt.Println("您輸入的不是數字!")fmt.Fprintf(w, "您輸入的不是數字!")}// 接下來判斷數字的大小范圍if age > 100 || age < 0 {fmt.Println("您輸入的年齡太大或太小,請輸入0-100之間的整數")fmt.Fprintf(w, "您輸入的年齡太大或太小,請輸入0-100之間的整數")}// 或者正則表達式if m, _ := regexp.MatchString("^[0-9]+$", r.Form.Get("age")); !m {fmt.Println("您輸入的年齡太大或太小,請輸入0-100之間的整數")fmt.Fprintf(w, "您輸入的年齡太大或太小,請輸入0-100之間的整數")}// 3. 驗證中文if m, _ := regexp.MatchString(`^[\x{4e00}-\x{9fa5}]+$`, r.Form.Get("zhname")); !m {fmt.Println("驗證有誤,請輸入中文")fmt.Println(w, "驗證有誤,請輸入中文")}// 4. 驗證英文if m, _ := regexp.MatchString("^[a-zA-Z]+$", r.Form.Get("enname")); !m {fmt.Println("驗證有誤,請輸入英文")fmt.Println(w, "驗證有誤,請輸入英文")}// 5. 郵箱if m, _ := regexp.MatchString(`^([\w\.\_]{2,10})@(\w{1,}).([a-z]{2,4})$`, r.Form.Get("email")); !m {fmt.Println("驗證有誤,請輸入正確郵箱地址")fmt.Println(w, "驗證有誤,請輸入正確郵箱地址")}// 6. 驗證手機號if m, _ := regexp.MatchString(`^(1[3|5|6|7|8][0-9]\d{8})$`, r.Form.Get("mobile")); !m {fmt.Println("請輸入正確手機號碼")fmt.Fprintf(w, "驗證有誤,請輸入正確手機號碼!")}// 7. 下拉菜單xueli := r.Form.Get("xueli")res1 := checkSelect(xueli)if !res1 {fmt.Println("請選擇正確的下拉列表!")fmt.Fprintf(w, "請選擇正確的下拉列表!")}// 8. 單選按鈕sex := r.Form.Get("sex")res2 := checkSex(sex)if !res2 {fmt.Println("請選擇正確的性別!")fmt.Fprintf(w, "請選擇正確的性別!")}// 9. 復選框hobby := r.Form["hobby"]res3 := checkHobby(hobby)if !res3 {fmt.Println("請選擇正確的愛好!")fmt.Fprintf(w, "請選擇正確的愛好!")}// 10. 身份證號if m, _ := regexp.MatchString(`^(\d{17})([0-9]|X)$`, r.Form.Get("usercard")); !m {fmt.Println("請選擇正確的身份證號!")fmt.Fprintf(w, "請選擇正確的身份證號!")}// 請求的是登錄數據,那么執行登錄的邏輯判斷fmt.Println("用戶名: ", r.Form["username"])fmt.Println("密碼: ", r.Form["pwd"])fmt.Println("中文名: ", r.Form["zhname"])fmt.Println("英文名: ", r.Form["enname"])fmt.Println("年齡: ", r.Form["age"])fmt.Println("性別: ", r.Form["sex"])fmt.Println("郵箱: ", r.Form["email"])fmt.Println("電話: ", r.Form["mobile"])fmt.Println("身份證號: ", r.Form["usercard"])fmt.Println("愛好: ", r.Form["hobby"])fmt.Println("學歷: ", r.Form["xueli"])fmt.Println("頭像: ", r.Form["myfile"])}}// 驗證下拉列表 func checkSelect(xueli string) bool {slice := []string{"xiaoxue", "chuzhong", "gaozhong", "dazhuan", "benke", "shuoshi", "boshi", "lieshi"}for _, v := range slice {if v == xueli {return true}}return false }// 驗證單選按鈕 func checkSex(sex string) bool {slice := []string{"male", "female", "other"}for _, v := range slice {if v == sex {return true}}return false }// 驗證復選框 func checkHobby(hobby []string) bool {slice := []string{"game", "girl", "money", "power"}hobby2 := Slice_diff(hobby, slice)return hobby2 == nil }func Slice_diff(slice1, slice2 []string) (diffslice []string) {for _, v := range slice1 {if !InSlice(v, slice2) {diffslice = append(diffslice, v)}}return }// 判斷是一個切片中是否包含指定的數值 func InSlice(val string, slice []string) bool {for _, v := range slice {if v == val {return true}}return false }func main() {http.HandleFunc("/register", register) // 設置訪問的路由err := http.ListenAndServe(":8080", nil) // 設置監聽的端口if err != nil {log.Fatal("ListenAndServe: ", err)} }

輸入信息后提交:

3、 預防跨站腳本

現在的網站包含大量的動態內容以提高用戶體驗,比過去要復雜得多。所謂動態內容,就是根據用戶環境和需要,Web應用程序能夠輸出相應的內容。動態站點會受到一種名為 “跨站腳本攻擊”(Cross Site Scripting, 安全專家們通常將其縮寫成 XSS)的威脅,而靜態站點則完全不受其影響。

攻擊者通常會在有漏洞的程序中插入JavaScript、VBScript、 ActiveX或Flash以欺騙用戶。一旦得手,他們可以盜取用戶帳戶信息,修改用戶設置,盜取/污染cookie和植入惡意廣告等。

對XSS最佳的防護應該結合以下兩種方法:一是驗證所有輸入數據,有效檢測攻擊(這個我們前面小節已經有過介紹);另一個是對所有輸出數據進行適當的處理,以防止任何已成功注入的腳本在瀏覽器端運行。

那么Go里面是怎么做這個有效防護的呢?Go的 html/template 里面帶有下面幾個函數可以幫你轉義

  • func HTMLEscape(w io.Writer, b []byte) //把b進行轉義之后寫到w
  • func HTMLEscapeString(s string) string //轉義s之后返回結果字符串
  • func HTMLEscaper(args …interface{}) string //支持多個參數一起轉義,返回結果字符串

創建go文件,demo03_template.go,代碼如下:

(補充:下面這段代碼自己實現效果與文檔不同,暫時未找到原因。)

package mainimport ("fmt""html/template""log""net/http" )func login(w http.ResponseWriter, r *http.Request) {r.ParseForm()username := r.Form.Get("username")fmt.Println("username:", template.HTMLEscapeString(username)) //輸出到服務器端fmt.Println("password:", template.HTMLEscapeString(r.Form.Get("password")))template.HTMLEscape(w, []byte(username)) //輸出到客戶端//fmt.Fprintf(w, username) //這個寫入到w的是輸出到客戶端的(補充:下面更改的應是這里的username) }func main() {http.HandleFunc("/login", login) //設置訪問的路由err := http.ListenAndServe(":8080", nil) //設置監聽的端口if err != nil {log.Fatal("ListenAndServe: ", err)} }

如果我們輸入的username是<script>alert()</script>,那么我們可以在瀏覽器上面看到輸出如下所示:

或者是:

func login2(w http.ResponseWriter, r *http.Request){r.ParseForm()username := r.Form.Get("username")fmt.Println(username)//進行模板解析t, err := template.New("foo").Parse(`{{define "T"}}Hello, {{.}}!{{end}}`)err = t.ExecuteTemplate(w, "T", username)//如果轉義失敗 拋出對應錯誤 終止程序if err != nil {log.Fatal(err)} }

運行結果也一樣:

Go的html/template包默認幫你過濾了html標簽,但是有時候你只想要輸出這個<script>alert()</script>看起

來正常的信息,該怎么處理?請使用template.HTML類型。

err = t.ExecuteTemplate(w, "T", template.HTML(username))

僅替換一行代碼即可:

瀏覽器運行結果:

(補充:自己的實現效果

4、 防止多次遞交表單

不知道你是否曾經看到過一個論壇或者博客,在一個帖子或者文章后面出現多條重復的記錄,這些大多數是因為用戶重復遞交了留言的表單引起的。由于種種原因,用戶經常會重復遞交表單。通常這只是鼠標的誤操作,如雙擊了遞交按鈕,也可能是為了編輯或者再次核對填寫過的信息,點擊了瀏覽器的后退按鈕,然后又再次點擊了遞交按鈕而不是瀏覽器的前進按鈕。當然,也可能是故意的——比如,在某項在線調查或者博彩活動中重復投票。那我們如何有效的防止用戶多次遞交相同的表單呢?

解決方案是在表單中添加一個帶有唯一值的隱藏字段。在驗證表單時,先檢查帶有該惟一值的表單是否已經遞交過了。如果是,拒絕再次遞交;如果不是,則處理表單進行邏輯處理。另外,如果是采用了Ajax模式遞交表單的話,當表單遞交后,通過javascript來禁用表單的遞交按鈕。

創建一個html的模板文件test.gtpl,添加代碼如下:

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>防止多次提交</title> </head> <body><form action="http://127.0.0.1:8080/login" method="post">用戶名:<input type="text" name="username"><br>密&nbsp&nbsp&nbsp碼:<input type="password" name="password"><br><input type="hidden" name="token" value="{{.}}"><input type="submit" value="登陸"></form> </body> </html>

創建一個go文件,demo04_server.go,代碼如下:

package mainimport ("fmt""html/template""log""net/http""time""crypto/md5""strconv""io""os" )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))fmt.Println("token--->", token)t, _ := template.ParseFiles("test.gtpl")t.Execute(w, token)} else {//請求的是登陸數據,那么執行登陸的邏輯判斷r.ParseForm()token := r.Form.Get("token")if token != "" {//驗證token的合法性fmt.Println("token:", token)} else {//不存在token報錯fmt.Println("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"))) //輸出到客戶端} }func main() {http.HandleFunc("/login", login) //設置訪問的路由err := http.ListenAndServe(":8080", nil) //設置監聽的端口if err != nil {log.Fatal("ListenAndServe: ", err)} }

我們看到token已經有輸出值,你可以不斷的刷新,可以看到這個值在不斷的變化。這樣就保證了每次顯示form表單的時候都是唯一的,用戶遞交的表單保持了唯一性。

我們的解決方案可以防止非惡意的攻擊,并能使惡意用戶暫時不知所措,然后,它卻不能排除所有的欺騙性的動機,對此類情況還需要更復雜的工作。

5、 處理文件上傳

你想處理一個由用戶上傳的文件,比如你正在建設一個類似Instagram的網站,你需要存儲用戶拍攝的照片。這種需求該如何實現呢?

要使表單能夠上傳文件,首先第一步就是要添加form的enctype屬性,enctype屬性有如下三種情況:

application/x-www-form-urlencoded 表示在發送前編碼所有字符(默認) multipart/form-data 不對字符編碼。在使用包含文件上傳控件的表單時,必須使用該值。 text/plain 空格轉換為 "+" 加號,但不對特殊字符編碼。

新建html頁面(upload.html),html頁面代碼:

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>文件上傳</title> </head> <body><form enctype="multipart/form-data" action="http://127.0.0.1:8080/upload" method="post"><input type="file" name="uploadfile"/><br><input type="hidden" name="token" value="{{.}}"/><br><input type="submit" value="upload"/></form> </body> </html>

新建go文件(demo05_uploadserver.go),go文件代碼:

package mainimport ("fmt""html/template""log""net/http""time""crypto/md5""strconv""io""os" )func main() {http.HandleFunc("/upload", upload)err := http.ListenAndServe(":8080", nil) //設置監聽的端口if err != nil {log.Fatal("ListenAndServe: ", err)} }// 處理/upload 邏輯 func upload(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("upload.gtpl")t.Execute(w, token)} else {r.ParseMultipartForm(32 << 20)file, handler, err := r.FormFile("uploadfile")if err != nil {fmt.Println(err)return}defer file.Close()fmt.Fprintf(w, "%v", handler.Header)f, err := os.OpenFile("./test/"+handler.Filename, os.O_WRONLY|os.O_CREATE, 0666)if err != nil {fmt.Println(err)return}defer f.Close()io.Copy(f, file)} }

通過上面的代碼可以看到,處理文件上傳我們需要調用 r.ParseMultipartForm,里面的參數表示maxMemory,調用 ParseMultipartForm 之后,上傳的文件存儲在 maxMemory 大小的內存里面,如果文件大小超過了 maxMemory,那么剩下的部分將存儲在系統的臨時文件中。我們可以通過 r.FormFile 獲取上面的文件句柄,然后實例中使用了 io.Copy 來存儲文件。

獲取其他非文件字段信息的時候就不需要調用 r.ParseForm,因為在需要的時候Go自動會去調用。而且 ParseMultipartForm 調用一次之后,后面再次調用不會再有效果。

通過上面的實例我們可以看到我們上傳文件主要三步處理:

  • 表單中增加 enctype=“multipart/form-data”
  • 服務端調用 r.ParseMultipartForm ,把上傳的文件存儲在內存和臨時文件中
  • 使用r.FormFile獲取文件句柄,然后對文件進行存儲等處理。
  • 文件 handler 是 multipart.FileHeader,里面存儲了如下結構信息:

    type FileHeader struct {Filename stringHeader textproto.MIMEHeader// contains filtered or unexported fields}

    我們通過上面的實例代碼打印出來上傳文件的信息如下:

    (補充:自己實現的直接報錯了。。

    )

    6、 客戶端上傳文件

    我們上面的例子演示了如何通過表單上傳文件,然后在服務器端處理文件,其實Go支持模擬客戶端表單功能支持文件上傳,詳細用法請看如下示例:

    創建一個go文件,來表示客戶端:demo06_uploadclient.go,代碼如下:

    package mainimport ("bytes""fmt""io""io/ioutil""mime/multipart""net/http""os" )func postFile(filename string, targetUrl string) error {bodyBuf := &bytes.Buffer{}bodyWriter := multipart.NewWriter(bodyBuf)//關鍵的一步操作fileWriter, err := bodyWriter.CreateFormFile("uploadfile", filename)if err != nil {fmt.Println("error writing to buffer")return err}//打開文件句柄操作fh, err := os.Open(filename)if err != nil {fmt.Println("error opening file")return err}//iocopy_, err = io.Copy(fileWriter, fh)if err != nil {return err}contentType := bodyWriter.FormDataContentType()bodyWriter.Close()resp, err := http.Post(targetUrl, contentType, bodyBuf)if err != nil {return err}defer resp.Body.Close()resp_body, err := ioutil.ReadAll(resp.Body)if err != nil {return err}fmt.Println(resp.Status)fmt.Println(string(resp_body))return nil }// sample usage func main() {target_url := "http://localhost:8080/upload"filename := "./正則驗證.docx"postFile(filename, target_url) }

    以上代碼詳細展示了客戶端如何向服務器上傳一個文件,客戶端通過 multipart.Write 把文件的文本流寫入一個緩存中,然后調用http的Post方法把緩存傳到服務器。

    如果你還有其他普通字段例如 username 之類的需要同時寫入,那么可以調用 multipart 的 WriteField 方法寫很多其他類似的字段。

    總結

    以上是生活随笔為你收集整理的【Go Web学习笔记】第三章 Go与表单的操作的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    国产精品手机在线播放 | 亚洲视频久久 | 美女视频黄频大全免费 | 操操操影院| 正在播放国产91 | 日韩网站免费观看 | 亚洲久草在线视频 | 99精品国产99久久久久久97 | 国产高清视频免费在线观看 | www91在线| 在线观看久久 | 999久久国精品免费观看网站 | 国产99re| 精品国产a | 黄色大片中国 | 天天干天天操天天拍 | 国产精品手机看片 | 久草在线免费色站 | 久久日本视频 | 日韩视频一区二区三区在线播放免费观看 | 国产精品videoxxxx| 9797在线看片亚洲精品 | 九月婷婷综合网 | 国产精品久久在线 | 婷婷精品| 97在线成人 | 精品久久亚洲 | 97超碰超碰 | 天天插天天射 | 狠狠色狠狠色综合日日92 | 久久欧美在线电影 | 色综合色综合色综合 | 玖玖玖在线 | 久久精品这里都是精品 | 99久久精品国产亚洲 | 国产 日韩 在线 亚洲 字幕 中文 | 日韩欧美在线一区二区 | 狠狠干夜夜爱 | 欧美激情视频一区二区三区 | 中文字幕91在线 | 中文在线a在线 | 欧美日韩高清一区二区 国产亚洲免费看 | 亚洲人在线视频 | 中文字幕 国产精品 | 黄色电影网站在线观看 | 五月婷婷开心 | 久久视频这里有久久精品视频11 | 亚洲日韩中文字幕 | 免费亚洲精品视频 | 性色av免费在线观看 | 人人爽人人爽人人片av免 | 精品国模一区二区 | 亚洲免费av一区二区 | 久久久久久久国产精品视频 | 色视频网站免费观看 | 国产超碰在线观看 | 日本中文字幕网站 | 久久99国产精品久久99 | 区一区二在线 | 精品国产综合区久久久久久 | 国产91精品高清一区二区三区 | 高清色免费 | 亚洲精品国产高清 | 97免费公开视频 | 成人97人人超碰人人99 | 国产中文在线视频 | 精品高清美女精品国产区 | 日韩一二三区不卡 | 97av视频在线观看 | 99免费精品视频 | 国产精品18久久久久久久 | 免费成人看片 | 亚洲精品国产欧美在线观看 | 四虎在线免费观看 | 国产aa免费视频 | 日韩在线中文字幕 | 色视频成人在线观看免 | 久久免费毛片 | 伊人亚洲综合 | 久草在线免费播放 | 免费观看性生交 | 碰天天操天天 | 国产午夜三级 | 国产精品爽爽久久久久久蜜臀 | 97电影手机 | 日韩在线观看不卡 | 又黄又网站 | 91人人爽久久涩噜噜噜 | 7799av| 国产品久精国精产拍 | 精品国产一区二区三区久久影院 | 97超碰超碰久久福利超碰 | 中文字幕丝袜制服 | 亚洲欧美日韩一级 | 五月天色站 | 日韩电影中文字幕在线 | 精品一区免费 | 国产v在线播放 | 99成人在线视频 | 国产精品久久久久久999 | 天天色影院 | 在线观看成人小视频 | 欧美日韩国产一二三区 | 91免费在线视频 | 久久久国产精华液 | 色天堂在线视频 | 久久人人爽人人人人片 | 激情五月婷婷激情 | 韩国av免费 | 天天爽天天爽夜夜爽 | 麻豆国产精品一区二区三区 | 亚洲免费精彩视频 | 国产成人福利在线观看 | 狠狠色丁香婷婷综合基地 | 91久久国产综合精品女同国语 | 曰韩精品| 中文字幕在线观看完整版电影 | 国产成人黄色 | 国产69精品久久久久久久久久 | 日韩艹| 天天综合五月天 | 91精品国产91久久久久久三级 | 亚洲丝袜中文 | 91精品国产91久久久久 | 中文字幕在线日亚洲9 | 一区二区视频播放 | 久久人人爽人人 | 久久午夜精品视频 | av免费观看高清 | 免费人成在线观看网站 | 天天干,天天操,天天射 | 在线观看91精品国产网站 | 欧美性色xo影院 | 韩国av一区二区三区 | 一区二区三区精品在线视频 | 国产高清视频在线观看 | 久久综合在线 | 成人毛片一区二区三区 | 中文字幕一区二区三 | 国产一区欧美一区 | 中文字幕视频网 | 色天堂在线视频 | 亚洲在线视频播放 | 亚洲视频第一页 | 99热99热| 欧美精品视 | 夜夜操天天操 | 国产91在线播放 | 国产涩涩在线观看 | 亚洲成人xxx | 亚洲在线网址 | 黄色特一级片 | 国产精品美女视频 | 色婷婷狠狠五月综合天色拍 | 婷婷伊人五月 | 久久人人干| 国精产品999国精产品视频 | 四虎免费av | 久久久www成人免费精品 | 国产xxxx做受性欧美88 | 欧美日韩国产一区二 | av片一区| 婷婷丁香色综合狠狠色 | 国产精品不卡一区 | 久久99精品久久久久久久久久久久 | www.91av在线 | 欧洲亚洲女同hd | 国产在线观看免 | 狠狠狠色 | 日韩综合色 | 国产精品破处视频 | 欧美一级乱黄 | 黄污网 | 国产精品v a免费视频 | 在线观看岛国av | 久久精品国产成人 | 国产美女搞久久 | 99国产成+人+综合+亚洲 欧美 | 久久久精品影视 | 免费在线观看av的网站 | 天天艹天天 | 中文字幕超清在线免费 | 在线观看国产高清视频 | 国产网站av | 国产精品免费大片视频 | 久久精品欧美视频 | 精品亚洲成人 | 日本在线观看中文字幕 | 天天干夜夜爽 | av在线播放亚洲 | 国产一区二区精品 | 久久久久亚洲精品成人网小说 | 日韩一区二区三区视频在线 | 中文字幕黄色av | 中文字幕在线看 | 亚洲精品456在线播放第一页 | 996久久国产精品线观看 | 91久久一区二区 | 亚洲精品国产精品99久久 | 日韩成人看片 | 国产小视频在线观看免费 | 国产不卡在线观看视频 | 久久精品综合 | 日韩专区一区二区 | 国产成人av网 | 午夜影视av| 干av在线 | 欧美精品一区在线 | 日韩欧美69 | 欧美日韩精品电影 | 日韩免费观看一区二区 | 中文字幕在线视频一区二区三区 | 久久社区视频 | 人人藻人人澡人人爽 | 婷婷视频在线播放 | 99精品国产福利在线观看免费 | 精品综合久久 | 国产精品日韩欧美一区二区 | 91精品国产综合久久福利 | 久久综合狠狠综合久久综合88 | 久久国产午夜精品理论片最新版本 | www.福利视频| 丁香六月婷婷开心婷婷网 | 亚洲天天看 | 久久久一本精品99久久精品 | 天天爽天天做 | 狠狠地操 | 国产一区二区综合 | 91精品视频免费看 | 麻豆久久久 | bayu135国产精品视频 | 园产精品久久久久久久7电影 | 国产福利在线不卡 | 99在线免费视频观看 | 日韩精品久久久久久中文字幕8 | 一区二区三区视频网站 | 在线免费国产 | 欧洲成人av| 伊人丁香| 国产精品九九九九九九 | 久久久综合香蕉尹人综合网 | 亚洲一区二区麻豆 | 免费看亚洲毛片 | 99r在线精品 | 玖草影院 | av短片在线观看 | 国内精品视频免费 | 日韩免费电影在线观看 | 91视视频在线直接观看在线看网页在线看 | 韩国在线一区二区 | 欧美日韩精品免费观看 | 99视频精品 | 精品亚洲免费视频 | 久久99精品久久只有精品 | 免费高清在线视频一区· | 国产中文字幕一区二区 | 天天操天天玩 | 在线观看成人一级片 | 97成人啪啪网 | 热久久免费视频精品 | 黄色毛片电影 | 日本久久高清视频 | 手机av在线免费观看 | 99se视频在线观看 | 日韩激情免费视频 | 国产精品99蜜臀久久不卡二区 | www.色就是色 | 国偷自产中文字幕亚洲手机在线 | 99色在线| 免费视频网 | 国产视频精品在线 | 91精品久久香蕉国产线看观看 | 制服丝袜一区二区 | 婷婷网址| 97视频资源 | 欧美精品一区二区在线播放 | 在线观看mv的中文字幕网站 | 久久精品国产免费看久久精品 | 久久不卡日韩美女 | 国产成人精品久久二区二区 | 久久久久久久久久免费 | 四虎影视欧美 | 国产自在线 | a视频在线观看 | 在线成人小视频 | 成人午夜电影免费在线观看 | 91精品专区| 久久久久久久久久久久久影院 | 日韩免费电影一区二区三区 | 日韩欧美一区二区在线 | 香蕉精品视频在线观看 | 超碰97免费观看 | 91欧美国产| 亚洲视频一区二区三区在线观看 | 国产精品正在播放 | 国产精品久久久久久久久软件 | 婷婷丁香久久五月婷婷 | 色婷婷狠狠五月综合天色拍 | 狠狠色噜噜狠狠狠狠2022 | 男女日麻批 | 亚洲理论片| 男女视频久久久 | 国产专区在线视频 | 国产一区麻豆 | 青草视频在线播放 | 午夜精品久久久久久久99 | 日本黄色免费播放 | 日韩久久久久久久久久 | 中文字幕乱码电影 | 亚洲黄色免费观看 | 福利片免费看 | 91理论片午午伦夜理片久久 | 国产精品高潮久久av | 四虎在线观看精品视频 | 在线观看一区二区精品 | 国产一区在线播放 | 日韩成片| 亚洲狠狠婷婷综合久久久 | 精品久久久久久久久久久院品网 | 久久精品视频观看 | 国产精品免费久久久久久久久久中文 | 欧美精品久久天天躁 | 久草视频免费播放 | 97爱爱爱 | 麻豆av一区二区三区在线观看 | 日韩资源在线 | 国产日韩在线视频 | 99免费在线观看视频 | 国产精品久久久久久久久久久久午 | 久久久久北条麻妃免费看 | 久草在线视频资源 | av成人免费观看 | 97精品国产97久久久久久久久久久久 | 国产亚洲精品久 | 欧美日韩精品免费观看 | 在线观看日韩av | 天天躁日日躁狠狠躁 | 在线免费观看黄色 | 欧美精品在线免费 | 99精品黄色片免费大全 | 欧美一级电影在线观看 | 国产精品视频你懂的 | 中文字幕在线播放av | 亚洲1区 在线 | 国产在线精品一区二区 | 国产精品私拍 | 久久免费视频8 | 天天操夜夜操 | 丁香激情综合国产 | 中文字幕在线观看免费观看 | 中文字幕在线一二 | 99色免费 | 在线免费观看黄色大片 | 一区二区亚洲精品 | 欧美巨大 | 精品日韩中文字幕 | 国产美女被啪进深处喷白浆视频 | 91av在线精品 | 精品高清美女精品国产区 | 视频在线在亚洲 | 久久免费电影网 | 国产女人免费看a级丨片 | 美女久久网站 | 我要色综合天天 | 日韩在线观看影院 | av中文字幕网 | 美女视频黄免费的久久 | 日韩欧美国产视频 | 久久精品高清 | 精精国产xxxx视频在线播放 | 中文字幕国产在线 | 久草在线观看视频免费 | 午夜国产福利在线观看 | 午夜丰满寂寞少妇精品 | 国产色综合 | 日韩中文字幕91 | 日韩毛片一区 | 中文字幕日韩伦理 | 午夜性福利 | 免费精品视频 | 亚洲精品综合一区二区 | 九九热免费在线观看 | 懂色av懂色av粉嫩av分享吧 | 成年人免费在线 | 国产精品手机播放 | 欧美a级成人淫片免费看 | 日本女人逼 | 色婷婷免费视频 | 最新中文字幕在线观看视频 | 黄色av一级 | 激情在线网 | 久久久久久不卡 | 午夜视频不卡 | 国产精品综合av一区二区国产馆 | 国产精品成人自产拍在线观看 | 免费视频xnxx com | 五月激情电影 | av免费看在线 | 婷婷色综合色 | 国产一级久久 | 国产黄色免费观看 | 一区二区影视 | 狠狠色噜噜狠狠狠狠 | 国产福利91精品一区二区三区 | 色综合 久久精品 | 免费精品在线 | 日韩精品不卡在线 | 91视频com | 91桃色国产在线播放 | 黄色大片日本免费大片 | 国产18精品乱码免费看 | 岛国av在线 | 亚洲最快最全在线视频 | 色香com.| 国产又粗又猛又色又黄网站 | 婷婷狠狠操 | 国产精品久久亚洲 | 久久电影网站中文字幕 | 午夜精品一区二区三区视频免费看 | av成人在线电影 | 免费在线观看视频一区 | 日韩av电影手机在线观看 | 黄p在线播放 | 久久免费国产精品 | www.国产在线观看 | 免费国产黄线在线观看视频 | 可以免费观看的av片 | 国产成在线观看免费视频 | 国产高清免费在线播放 | 丁香九月婷婷 | 伊人首页| 久草国产在线观看 | 久久人人爽 | 国产精品二区三区 | 天天舔夜夜操 | 99热这里只有精品免费 | 91精品天码美女少妇 | 日韩精品中文字幕在线 | 成人天堂网 | 麻豆视频在线看 | 色在线中文字幕 | 成人9ⅰ免费影视网站 | 99久久国产免费免费 | 欧美一级久久久 | 久久国产欧美日韩精品 | 精品在线视频一区 | 在线观看视频一区二区三区 | a色视频| 在线观看国产一区 | 天天综合人人 | 天堂av网址 | 久久精品毛片基地 | 中国老女人日b | 日韩美女黄色片 | 日日夜夜狠狠 | 成年人黄色免费视频 | 黄色影院在线播放 | 久久久久久久久久影院 | 欧美性精品 | 国产成人精品一区二三区 | 国产一区播放 | 色婷婷骚婷婷 | 成人免费在线视频观看 | 成人免费网视频 | 人人爽人人爽人人爽人人爽 | 黄色片软件网站 | www.com操| 麻豆91网站| 一区二区三区www | 午夜99| 日韩色在线 | 四虎影视av | 久久论理| 天天操天天干天天 | 亚洲日韩中文字幕 | 成人a免费视频 | 免费看三级网站 | 国产精品久久久久毛片大屁完整版 | 4hu视频| 久操视频在线播放 | 亚洲精品久久久久中文字幕二区 | 91成人免费电影 | 国内偷拍精品视频 | 亚洲不卡123 | 日韩成人免费在线电影 | 成人在线播放网站 | 日韩精品在线看 | 91最新在线观看 | 96久久精品 | 夜夜夜影院| 91在线区 | 国产打女人屁股调教97 | 精品久久久精品 | 天天干,天天射,天天操,天天摸 | 黄色小网站免费看 | 97免费在线观看 | 在线免费黄色片 | 久久久久久久久久免费视频 | 在线观看视频在线 | 夜夜骑首页 | 中国一级片在线 | 青青河边草免费 | 国产91影视 | 国产精品视频你懂的 | 国产成人一级 | 久久久久久久影院 | 欧美一级免费在线 | 久草线| www.狠狠操 | 天天操天天射天天插 | 日本成址在线观看 | 精品免费久久久久久 | 97人人澡人人爽人人模亚洲 | 黄色av大片 | 免费av影视 | 国产a高清| 精品女同一区二区三区在线观看 | 国产色视频123区 | 欧美性极品xxxx做受 | 国产美女久久 | 国产韩国精品一区二区三区 | 亚洲dvd | 五月婷婷香蕉 | 久久久久亚洲精品成人网小说 | 免费观看黄 | av免费在线播放 | 97免费在线视频 | 久久精品99国产精品日本 | 国产精品网红直播 | 欧洲精品亚洲精品 | 99av国产精品欲麻豆 | 最新av网站在线观看 | 国产精品黄色在线观看 | 成人黄色毛片视频 | 中文字幕在线看视频国产中文版 | 成人久久久精品国产乱码一区二区 | 国产一区二区久久 | 婷婷午夜 | 激情av综合 | av免费在线观看网站 | 免费黄色a网站 | 欧美日韩国产一区二区在线观看 | 久久人人爽爽 | 国产精品爽爽爽 | 国产欧美最新羞羞视频在线观看 | 精品在线看 | 91在线入口| 在线观看一区二区视频 | 欧美一区二区三区特黄 | 亚洲免费国产 | 亚洲欧洲精品一区二区精品久久久 | 久久综合亚洲鲁鲁五月久久 | 色综合久久88色综合天天 | 色视频 在线 | 精品国产精品国产偷麻豆 | 久久久久激情视频 | av免费观看在线 | 999成人网 | 欧美视频xxx | 亚洲欧美乱综合图片区小说区 | 麻豆视频在线播放 | 日本精品久久久久久 | 成x99人av在线www | 99精品视频在线观看免费 | 久草在线视频网 | 亚洲成人av片在线观看 | 国产在线观看xxx | 91精品一区在线观看 | 国产无套一区二区三区久久 | 综合网色| 91九色pron| 欧美a视频在线观看 | 欧美日韩视频在线一区 | 久久精品国产亚洲 | 亚洲精品在线国产 | 日韩美视频 | 一区二区三区免费在线观看视频 | 久久久久区 | 久久a视频| 69国产盗摄一区二区三区五区 | 欧美激情第28页 | 久久在草 | 男女拍拍免费视频 | 日韩免费福利 | 欧美精品久久久久久久久久白贞 | 九草在线视频 | av高清免费在线 | 久久视频在线观看中文字幕 | 久产久精国产品 | 婷婷成人综合 | 国产在线视频一区二区三区 | 国产精品美女久久久久久 | 性色视频在线 | 在线 欧美 日韩 | 日韩成人在线一区二区 | 免费看一级黄色大全 | 中文字幕在线免费看线人 | 亚洲精品视频观看 | 久久久久久久久亚洲精品 | 日本公妇在线观看高清 | 亚洲欧洲精品一区二区 | 91亚色视频在线观看 | 日韩免费中文 | 中文字幕一区二区三区在线观看 | 福利片免费看 | 中文字幕色网站 | 在线免费视频一区 | 91热视频在线观看 | 91九色porny蝌蚪视频 | 国产69久久久欧美一级 | 亚洲精品456在线播放第一页 | 中文字幕一区二区三区精华液 | 91av电影网 | 97人人视频| 久久精品国产亚洲精品 | 亚洲免费成人av电影 | 久久99亚洲精品久久久久 | 在线日韩av| 国产成人精品久久久 | 国产 在线观看 | 99久久精品久久久久久清纯 | 五月天激情综合 | 久99久久 | 日韩电影在线观看一区二区三区 | 欧美成人aa | 欧美激情综合五月色丁香小说 | 国产综合香蕉五月婷在线 | 欧美一级片免费在线观看 | 夜夜夜草 | 天天干 天天摸 天天操 | 91porny九色91啦中文 | 四虎影视av | 精品在线观看一区二区 | 九九在线高清精品视频 | 婷婷丁香导航 | 最近免费中文字幕mv在线视频3 | 国内免费的中文字幕 | 久久无码av一区二区三区电影网 | 91精品视频免费在线观看 | 91精品国产91热久久久做人人 | 国产亚洲精品福利 | 蜜桃av久久久亚洲精品 | 96精品视频| 欧美一二三视频 | 国产亚洲成av人片在线观看桃 | 99精品国产一区二区三区麻豆 | 欧美在线日韩在线 | 天天天天爱天天躁 | 亚洲精品a区 | 丁香花在线观看视频在线 | 中文字幕av电影下载 | 久久观看最新视频 | 国产做aⅴ在线视频播放 | 91精品视频免费 | 国产成人精品电影久久久 | 婷婷国产在线 | avove黑丝| 国产伦精品一区二区三区免费 | 成人免费视频网站 | 又长又大又黑又粗欧美 | 超级碰99 | 五月天开心 | 国产精品免费麻豆入口 | 免费观看视频黄 | 人人爽影院 | 日韩久久在线 | 亚洲成人午夜在线 | 国产免费一区二区三区最新 | 国产精品欧美久久久久无广告 | 免费观看成年人视频 | 香蕉视频国产在线 | 成人免费一区二区三区在线观看 | 日韩在线观看网址 | 欧美一级特黄高清视频 | 91久草视频 | 中文字幕av免费在线观看 | 91片黄在线观看动漫 | 激情视频一区二区 | 欧美a级片免费看 | 日日摸日日添夜夜爽97 | 亚洲五月 | 国产精品免费久久久久久 | 91精品国产欧美一区二区 | 日韩欧美在线综合网 | 在线国产激情视频 | 天天摸日日摸人人看 | 日韩av在线网站 | 99精品在线观看视频 | 91桃色视频 | 国产欧美最新羞羞视频在线观看 | 四虎影院在线观看av | 欧美va在线观看 | 免费黄色在线 | 久久综合精品国产一区二区三区 | av大全在线播放 | 中日韩男男gay无套 日韩精品一区二区三区高清免费 | 免费久久久久久久 | 久久久精品福利视频 | 成人毛片100免费观看 | 五月婷婷天堂 | 性色av免费观看 | 亚洲欧洲一级 | 手机av片| 国产成人精品女人久久久 | 午夜国产在线 | 草草草影院 | 久久久夜色 | 久久天堂精品视频 | 国产午夜精品一区二区三区 | 免费国产在线精品 | 在线观看色视频 | 97成人在线免费视频 | 麻豆国产网站入口 | 久久人人爽人人爽人人片 | 五月婷婷欧美视频 | 国产精品av免费观看 | 97偷拍在线视频 | 91av资源在线 | 激情视频免费在线观看 | 久久久久久欧美二区电影网 | 亚洲精品国产自产拍在线观看 | 免费福利视频网站 | 96亚洲精品久久久蜜桃 | 一区二区精品 | 色偷偷人人澡久久超碰69 | 久香蕉 | 99精品国产在热久久 | 波多野结衣在线观看一区 | 亚洲综合色视频在线观看 | 国产精品一区二区三区观看 | 奇米7777狠狠狠琪琪视频 | 中字幕视频在线永久在线观看免费 | 超碰在线公开免费 | 亚洲最大激情中文字幕 | 青青河边草免费观看完整版高清 | 日韩av影片在线观看 | 日韩系列在线 | 亚洲综合射 | 免费看三级网站 | 在线播放一区二区三区 | 四虎国产精 | 97视频入口免费观看 | 综合网在线视频 | 国产一级黄 | 久久r精品 | 国产日韩在线观看一区 | 久久久久久久久久久网 | 亚洲三级影院 | 中文理论片 | 成人午夜毛片 | 日韩一二三 | 怡红院av久久久久久久 | 韩日成人av | 国产视频九色蝌蚪 | 黄色网大全 | 日韩免费视频一区二区 | 亚洲精品国偷拍自产在线观看蜜桃 | 超碰激情在线 | 91网站在线视频 | 精品国内自产拍在线观看视频 | 超碰午夜| 丁香婷婷综合色啪 | 99视频在线观看视频 | 欧美国产日韩一区二区三区 | 狠狠色丁香婷婷综合视频 | 久艹在线免费观看 | 国产精品日韩久久久久 | 亚洲精区二区三区四区麻豆 | 九九精品在线观看 | 久久综合毛片 | 在线视频免费观看 | 中文在线最新版天堂 | 一区二区电影在线观看 | 久久精品综合一区 | 91在线www | 婷婷视频在线 | 国产精品毛片一区二区三区 | 精品美女在线视频 | 亚洲 欧美 精品 | 亚洲黄色一级电影 | 欧美一级免费在线 | 久久理论视频 | 日韩在线免费 | 久久av中文字幕片 | 国产精品美女免费看 | 亚洲国产精品成人女人久久 | 日韩久久精品一区二区三区 | 一区二区三区高清在线 | 欧美久久九九 | 午夜影视一区 | 日韩久久影院 | 国产免码va在线观看免费 | 青草视频在线播放 | 成年人免费看片 | 丁香一区二区 | 午夜精品视频一区 | 在线观看免费中文字幕 | 亚洲精品视频观看 | 免费日韩av电影 | 国产第一页在线观看 | 久久国产91 | 日韩素人在线观看 | 成年人电影毛片 | 欧美一区二区在线免费看 | 亚洲精品国产第一综合99久久 | 亚洲国产精品成人女人久久 | 久久久久久久久免费视频 | 久久视频在线看 | 操操操人人人 | 六月丁香激情综合 | 亚洲最大成人免费网站 | 久久精品国产亚洲aⅴ | 91免费在线视频 | 欧美影院久久 | a级国产乱理论片在线观看 特级毛片在线观看 | 久久理论片 | 99免费精品 | 17婷婷久久www | 国产精品丝袜久久久久久久不卡 | av中文字幕亚洲 | www视频免费在线观看 | 美女视频久久久 | 国产精品久久影院 | 国产九九九九九 | 国产婷婷色 | 亚洲精品美女在线观看播放 | 亚洲黄色影院 | 日韩中文三级 | 六月婷操| 日韩电影精品 | a国产精品 | 青青五月天 | 国产97av| 国产区免费 | 香蕉视频在线看 | 一区三区在线欧 | 国产一区二区久久 | 丁香国产视频 | 国产一级二级av | 成人va视频 | 国产一级在线视频 | 视频在线观看99 | 在线观看黄a | 国产色爽 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 91九色最新地址 | 丁香婷婷亚洲 | 久久国产露脸精品国产 | 怡红院av久久久久久久 | 最近中文字幕久久 | 黄色小网站在线 | 91麻豆精品国产91久久久无需广告 | 久久9999久久免费精品国产 | 国产精品一区二区在线播放 | 91免费高清观看 | 国产精品 国产精品 | 天天干天天操天天射 | 九九热在线免费观看 | 亚洲激情国产精品 | 久久五月网 | 三级av在线播放 | 成人av在线影视 | 成人a级网站 | 国产日韩欧美在线免费观看 | 91资源在线免费观看 | 久久久久久久久久亚洲精品 | 九七在线视频 | 久久久久激情 | 国产高清精品在线 | 久久久久久久久久久久久久免费看 | 91成年人在线观看 | 国产色综合天天综合网 | 成人99免费视频 | 999国产在线 | 久久精品视频国产 | 亚洲播放一区 | 婷婷伊人综合亚洲综合网 | 日日夜夜天天射 | 国产精品剧情在线亚洲 | 在线你懂的视频 | av网站有哪些 | 中文国产在线观看 | 91精品一区二区三区蜜桃 | 久草精品视频 | 1024在线看片| 国产69精品久久久久99 | 久久激情视频 久久 | 国产手机视频在线观看 | a在线视频v视频 | 久久久www成人免费精品 | 在线免费观看的av | 久久精品视 | 亚洲精品国产精品久久99热 | 精品久久久精品 | av黄色国产 | 亚洲黄色一级电影 | 国产成人精品区 | 国产一线二线三线性视频 | 日韩精品一区电影 | 久久成| 天天玩夜夜操 | 天天做日日做天天爽视频免费 | 一区二区精品在线视频 | 9797在线看片亚洲精品 | 久久好看免费视频 | 久久在线看 | 日韩一区二区三区在线看 | 久久精品成人 | 极品久久久久久久 | 美女福利视频 | 国产aa精品 | 国产视频亚洲精品 | 97精品国自产拍在线观看 | 狠狠操操操 | 久久精品一二三区白丝高潮 | 久草在线观看 | 日韩动态视频 | 欧美精品一区二区三区一线天视频 | 九九99靖品 | 午夜黄色 | 国产一级免费在线 | 日韩精品大片 | 国产精品免费看久久久8精臀av | 成人午夜网 | 香蕉一区| 午夜久久电影网 | 亚洲日本中文字幕在线观看 | www.五月天色 | 国产黄色片一级三级 | 色噜噜噜噜 | 色婷婷亚洲精品 | 国产精品成人免费一区久久羞羞 | 国产视频在线观看一区二区 | 亚洲乱码精品 | 欧美一级片免费播放 | 免费观看国产精品视频 | 亚洲精品美女视频 | 九九在线视频免费观看 | 四虎在线免费观看视频 | 欧美色噜噜 | 中文字幕亚洲综合久久五月天色无吗'' | 成 人 免费 黄 色 视频 | 久久国产精品一二三区 | 国产日韩欧美在线一区 | 日韩视频一区二区在线观看 | 久草在线资源观看 | 99久久综合国产精品二区 | 黄色特一级| 久久久久免费精品国产 | 最近中文字幕免费视频 | 99国产成+人+综合+亚洲 欧美 | 成人一级 | 狠狠狠狠狠狠狠狠 | 午夜视频在线观看一区二区 | 色婷婷狠狠操 | 高清在线一区 | 伊甸园永久入口www 99热 精品在线 | 国产无遮挡又黄又爽在线观看 | 久久国产剧场电影 | 丁香婷婷综合五月 | 国产高清中文字幕 | 中国成人一区 | 日韩欧美在线观看一区二区三区 | 九九热久久免费视频 | 香蕉视频在线免费 | 日韩av电影中文字幕 | 欧美日韩高清一区二区 | 美女一二三区 | 国产精品久久久久永久免费看 | 精品国产一区二区三区久久久蜜月 | av福利电影| 精品一区二区免费视频 | 蜜臀久久99精品久久久久久网站 | 久久夜视频 | 三级黄色片子 | 国产国语在线 | 黄色小说视频网站 | 久久精品一区二区三区四区 | 正在播放日韩 | 波多野结衣电影一区二区三区 | 婷婷视频在线 | 国产精品一区二区免费在线观看 | 亚洲有 在线 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 国产丝袜高跟 | 精品久久网| 99热精品免费观看 | 探花系列在线 | 日本一区二区三区免费观看 | 国产高清小视频 | 天干啦夜天干天干在线线 | 国产一级a毛片视频爆浆 | ,午夜性刺激免费看视频 | 久久免费在线观看 | 91大片成人网| www.av在线播放 | 久久久免费视频播放 | 国产成人免费 |