精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Golang GinWeb框架8-重定向/自定義中間件/認證/HTTPS支持/優雅重啟等

開發 前端
本文接著上文(Golang GinWeb框架7-靜態文件/模板渲染)繼續探索GinWeb框架.

[[356340]]

 簡介

本文接著上文(Golang GinWeb框架7-靜態文件/模板渲染)繼續探索GinWeb框架.

重定向

Gin返回一個HTTP重定向非常簡單, 使用Redirect方法即可. 內部和外部鏈接都支持.

  1. package main 
  2.  
  3. import ( 
  4.   "github.com/gin-gonic/gin" 
  5.   "net/http" 
  6.  
  7. func main() { 
  8.   r := gin.Default() 
  9.   r.GET("/test", func(c *gin.Context) { 
  10.     c.Redirect(http.StatusMovedPermanently, "http://www.google.com/")  //重定向到外部鏈接 
  11.   }) 
  12.  
  13.   //重定向到內部鏈接 
  14.   r.GET("/internal", func(c *gin.Context) { 
  15.     c.Redirect(http.StatusMovedPermanently, "/home"
  16.   }) 
  17.  
  18.   r.GET("/home", func(c *gin.Context) { 
  19.     c.JSON(200, gin.H{"msg""這是首頁"}) 
  20.   }) 
  21.   r.Run(":8080"
  22.  
  23. /* 
  24. 重定向到外部鏈接,訪問:http://localhost:8080/test 
  25. 重定向到內部鏈接,訪問:http://localhost:8080/internal 
  26. */ 

從POST方法中完成HTTP重定向, 參考問題#444 https://github.com/gin-gonic/gin/issues/444

  1. r.POST("/test", func(c *gin.Context) { 
  2.   c.Redirect(http.StatusFound, "/foo"
  3. }) 

如果要產生一個路由重定向, 類似上面的內部重定向, 則使用 HandleContext方法, 像下面這樣使用:

  1. r.GET("/test", func(c *gin.Context) { 
  2.     c.Request.URL.Path = "/test2" 
  3.     r.HandleContext(c) 
  4. }) 
  5. r.GET("/test2", func(c *gin.Context) { 
  6.     c.JSON(200, gin.H{"hello""world"}) 
  7. }) 

自定義中間件

  1. package main 
  2.  
  3. import ( 
  4.   "github.com/gin-gonic/gin" 
  5.   "log" 
  6.   "time" 
  7.  
  8. //自定義日志中間件 
  9. func Logger() gin.HandlerFunc { 
  10.   return func(c *gin.Context) { 
  11.     t := time.Now() 
  12.  
  13.     // Set example variable 在gin上下文中設置鍵值對 
  14.     c.Set("example""12345"
  15.  
  16.     // before request 
  17.  
  18.     //Next方法只能用于中間件中,在當前中間件中, 從方法鏈執行掛起的處理器 
  19.     c.Next() 
  20.  
  21.     // after request  打印中間件執行耗時 
  22.     latency := time.Since(t) 
  23.     log.Print(latency) 
  24.  
  25.     // access the status we are sending  打印本中間件的狀態碼 
  26.     status := c.Writer.Status() 
  27.     log.Println(status) 
  28.   } 
  29.  
  30. func main() { 
  31.   r := gin.New() 
  32.   //使用該自定義中間件 
  33.   r.Use(Logger()) 
  34.   r.GET("/test", func(c *gin.Context) { 
  35.     example := c.MustGet("example").(string) //從上下文中獲取鍵值對 
  36.     // it would print: "12345" 
  37.     log.Println(example) 
  38.   }) 
  39.  
  40.   // Listen and serve on 0.0.0.0:8080 
  41.   r.Run(":8080"

使用基本認證BasicAuth()中間件

  1. package main 
  2.  
  3. import ( 
  4.   "github.com/gin-gonic/gin" 
  5.   "net/http" 
  6.  
  7. // simulate some private data 
  8. var secrets = gin.H{ 
  9.   "foo":    gin.H{"email""foo@bar.com""phone""123433"}, 
  10.   "austin": gin.H{"email""austin@example.com""phone""666"}, 
  11.   "lena":   gin.H{"email""lena@guapa.com""phone""523443"}, 
  12.  
  13. func main() { 
  14.   r := gin.Default() 
  15.  
  16.   // Group using gin.BasicAuth() middleware 
  17.   // gin.Accounts is a shortcut for map[string]string 
  18.   // 路由組authorized使用基本認證中間件, 參數為gin.Accounts,是一個map,鍵名是用戶名, 鍵值是密碼, 該中間件會將認證信息保存到cookie中 
  19.   authorized := r.Group("/admin", gin.BasicAuth(gin.Accounts{ 
  20.     "foo":    "bar"
  21.     "austin""1234"
  22.     "lena":   "hello2"
  23.     "manu":   "4321"
  24.   })) 
  25.  
  26.   // /admin/secrets endpoint 
  27.   // hit "localhost:8080/admin/secrets 
  28.   authorized.GET("/secrets", func(c *gin.Context) { 
  29.     // get user, it was set by the BasicAuth middleware 
  30.     // 從cookie中獲取用戶認證信息, 鍵名為user 
  31.     user := c.MustGet(gin.AuthUserKey).(string) 
  32.     if secret, ok := secrets[user]; ok { 
  33.       c.JSON(http.StatusOK, gin.H{"user"user"secret": secret}) 
  34.     } else { 
  35.       c.JSON(http.StatusOK, gin.H{"user"user"secret""NO SECRET :("}) 
  36.     } 
  37.   }) 
  38.  
  39.   // Listen and serve on 0.0.0.0:8080 
  40.   r.Run(":8080"
  41. /* 
  42. 測試訪問:http://localhost:8080/admin/secrets 
  43. */ 

在中間件中使用協程Goroutines

在中間件或者控制器中啟動新協程時, 不能直接使用原來的Gin上下文, 必須使用一個只讀的上下文副本

  1. package main 
  2.  
  3. import ( 
  4.   "github.com/gin-gonic/gin" 
  5.   "log" 
  6.   "time" 
  7.  
  8. func main() { 
  9.   r := gin.Default() 
  10.  
  11.   r.GET("/long_async", func(c *gin.Context) { 
  12.     // create copy to be used inside the goroutine 
  13.     // 創建一個Gin上下文的副本, 準備在協程Goroutine中使用 
  14.     cCp := c.Copy() 
  15.     go func() { 
  16.       // simulate a long task with time.Sleep(). 5 seconds 
  17.       // 模擬長時間任務,這里是5秒 
  18.       time.Sleep(5 * time.Second
  19.  
  20.       // note that you are using the copied context "cCp", IMPORTANT 
  21.       // 在中間件或者控制器中啟動協程時, 不能直接使用原來的上下文, 必須使用一個只讀的上線文副本 
  22.       log.Println("Done! in path " + cCp.Request.URL.Path) 
  23.     }() 
  24.   }) 
  25.  
  26.   r.GET("/long_sync", func(c *gin.Context) { 
  27.     // simulate a long task with time.Sleep(). 5 seconds 
  28.     time.Sleep(5 * time.Second
  29.  
  30.     // since we are NOT using a goroutine, we do not have to copy the context 
  31.     // 沒有使用協程時, 可以直接使用Gin上下文 
  32.     log.Println("Done! in path " + c.Request.URL.Path) 
  33.   }) 
  34.  
  35.   // Listen and serve on 0.0.0.0:8080 
  36.   r.Run(":8080"
  37. /* 
  38. 模擬同步阻塞訪問:http://localhost:8080/long_sync 
  39. 模擬異步非阻塞訪問:http://localhost:8080/long_async 
  40. */ 

自定義HTTP配置

直接使用 http.ListenAndServe()方法:

  1. func main() { 
  2.   router := gin.Default() 
  3.   http.ListenAndServe(":8080", router) 

或者自定義HTTP配置

  1. func main() { 
  2.   router := gin.Default() 
  3.  
  4.   s := &http.Server{ 
  5.     Addr:           ":8080"
  6.     Handler:        router, 
  7.     ReadTimeout:    10 * time.Second
  8.     WriteTimeout:   10 * time.Second
  9.     MaxHeaderBytes: 1 << 20, 
  10.   } 
  11.   s.ListenAndServe() 

支持Let'sEncrypt證書加密處理HTTPS

下面是一行式的LetsEncrypt HTTPS服務

  1. package main 
  2.  
  3. import ( 
  4.   "log" 
  5.  
  6.   "github.com/gin-gonic/autotls" 
  7.   "github.com/gin-gonic/gin" 
  8.  
  9. func main() { 
  10.   r := gin.Default() 
  11.  
  12.   // Ping handler 
  13.   r.GET("/ping", func(c *gin.Context) { 
  14.     c.String(200, "pong"
  15.   }) 
  16.   //一行式LetsEncrypt證書, 處理https 
  17.   log.Fatal(autotls.Run(r, "example1.com""example2.com")) 

自定義自動證書管理器autocert manager實例代碼:

  1. package main 
  2.  
  3. import ( 
  4.   "log" 
  5.  
  6.   "github.com/gin-gonic/autotls" 
  7.   "github.com/gin-gonic/gin" 
  8.   "golang.org/x/crypto/acme/autocert" 
  9.  
  10. func main() { 
  11.   r := gin.Default() 
  12.  
  13.   // Ping handler 
  14.   r.GET("/ping", func(c *gin.Context) { 
  15.     c.String(200, "pong"
  16.   }) 
  17.  
  18.   m := autocert.Manager{ 
  19.     Prompt:     autocert.AcceptTOS, //Prompt指定一個回調函數有條件的接受證書機構CA的TOS服務, 使用AcceptTOS總是接受服務條款 
  20.     HostPolicy: autocert.HostWhitelist("example1.com""example2.com"),  //HostPolicy用于控制指定哪些域名, 管理器將檢索新證書 
  21.     Cache:      autocert.DirCache("/var/www/.cache"),  //緩存證書和其他狀態 
  22.   } 
  23.  
  24.   log.Fatal(autotls.RunWithManager(r, &m)) 

詳情參考autotls包

使用Gin運行多個服務

可以在主函數中使用協程Goroutine運行多個服務, 每個服務端口不同, 路由分組也不同. 請參考這個問題, 嘗試運行以下示例代碼:

  1. package main 
  2.  
  3. import ( 
  4.   "log" 
  5.   "net/http" 
  6.   "time" 
  7.  
  8.   "github.com/gin-gonic/gin" 
  9.   "golang.org/x/sync/errgroup" 
  10.  
  11. var ( 
  12.   g errgroup.Group 
  13.  
  14. func router01() http.Handler { 
  15.   e := gin.New() 
  16.   e.Use(gin.Recovery()) 
  17.   e.GET("/", func(c *gin.Context) { 
  18.     c.JSON( 
  19.       http.StatusOK, 
  20.       gin.H{ 
  21.         "code":  http.StatusOK, 
  22.         "error""Welcome server 01"
  23.       }, 
  24.     ) 
  25.   }) 
  26.  
  27.   return e 
  28.  
  29. func router02() http.Handler { 
  30.   e := gin.New() 
  31.   e.Use(gin.Recovery()) 
  32.   e.GET("/", func(c *gin.Context) { 
  33.     c.JSON( 
  34.       http.StatusOK, 
  35.       gin.H{ 
  36.         "code":  http.StatusOK, 
  37.         "error""Welcome server 02"
  38.       }, 
  39.     ) 
  40.   }) 
  41.  
  42.   return e 
  43.  
  44. func main() { 
  45.   server01 := &http.Server{ 
  46.     Addr:         ":8080"
  47.     Handler:      router01(), 
  48.     ReadTimeout:  5 * time.Second
  49.     WriteTimeout: 10 * time.Second
  50.   } 
  51.  
  52.   server02 := &http.Server{ 
  53.     Addr:         ":8081"
  54.     Handler:      router02(), 
  55.     ReadTimeout:  5 * time.Second
  56.     WriteTimeout: 10 * time.Second
  57.   } 
  58.  
  59.   g.Go(func() error { 
  60.     err := server01.ListenAndServe() 
  61.     if err != nil && err != http.ErrServerClosed { 
  62.       log.Fatal(err) 
  63.     } 
  64.     return err 
  65.   }) 
  66.  
  67.   g.Go(func() error { 
  68.     err := server02.ListenAndServe() 
  69.     if err != nil && err != http.ErrServerClosed { 
  70.       log.Fatal(err) 
  71.     } 
  72.     return err 
  73.   }) 
  74.  
  75.   if err := g.Wait(); err != nil { 
  76.     log.Fatal(err) 
  77.   } 
  78.  
  79. /* 
  80. 模擬訪問服務1: 
  81. curl http://localhost:8080/ 
  82. {"code":200,"error":"Welcome server 01"
  83.  
  84. 模擬訪問服務2: 
  85. curl http://localhost:8081/ 
  86. {"code":200,"error":"Welcome server 02"
  87. */ 

優雅的關閉和重啟服務

有一些方法可以優雅的關閉或者重啟服務, 比如不應該中斷活動的連接, 需要優雅等待服務完成后才執行關閉或重啟. 你可以使用第三方包來實現, 也可以使用內置的包自己實現優雅關閉或重啟.

使用第三方包

fvbock/endless 包, 可以實現Golang HTTP/HTTPS服務的零停機和優雅重啟(Golang版本至少1.3以上)

我們可以使用fvbock/endless 替代默認的 ListenAndServe方法, 更多詳情, 請參考問題#296.

  1. router := gin.Default() 
  2. router.GET("/", handler) 
  3. // [...] 
  4. endless.ListenAndServe(":4242", router) 

其他替代包:

  • manners: 一個優雅的Go HTTP服務, 可以優雅的關閉服務.
  • graceful: 優雅的Go包, 能夠優雅的關閉一個http.Handler服務
  • grace: 該包為Go服務實現優雅重啟, 零停機

手動實現

如果你使用Go1.8或者更高的版本, 你可能不需要使用這些庫. 可以考慮使用http.Server的內置方法Shutdown()來優雅關閉服務. 下面的示例描述了基本用法, 更多示例請參考這里

  1. // +build go1.8 
  2.  
  3. package main 
  4.  
  5. import ( 
  6.   "context" 
  7.   "log" 
  8.   "net/http" 
  9.   "os" 
  10.   "os/signal" 
  11.   "syscall" 
  12.   "time" 
  13.  
  14.   "github.com/gin-gonic/gin" 
  15.  
  16. func main() { 
  17.   router := gin.Default() 
  18.   router.GET("/", func(c *gin.Context) { 
  19.     time.Sleep(5 * time.Second
  20.     c.String(http.StatusOK, "Welcome Gin Server"
  21.   }) 
  22.  
  23.   srv := &http.Server{ 
  24.     Addr:    ":8080"
  25.     Handler: router, 
  26.   } 
  27.  
  28.   // Initializing the server in a goroutine so that 
  29.   // it won't block the graceful shutdown handling below 
  30.   // 用協程初始化一個服務, 它不會阻塞下面的優雅邏輯處理 
  31.   go func() { 
  32.     if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { 
  33.       log.Fatalf("listen: %s\n", err) 
  34.     } 
  35.   }() 
  36.  
  37.   // Wait for interrupt signal to gracefully shutdown the server with 
  38.   // a timeout of 5 seconds. 
  39.   //等待一個操作系統的中斷信號, 來優雅的關閉服務 
  40.   quit := make(chan os.Signal) 
  41.   // kill (no param) default send syscall.SIGTERM  //kill會發送終止信號 
  42.   // kill -2 is syscall.SIGINT  //發送強制進程結束信號 
  43.   // kill -9 is syscall.SIGKILL but can't be catch, so don't need add it  //發送SIGKILL信號給進程 
  44.   signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) 
  45.   <-quit //阻塞在這里,直到獲取到一個上面的信號 
  46.   log.Println("Shutting down server..."
  47.  
  48.   // The context is used to inform the server it has 5 seconds to finish 
  49.   // the request it is currently handling 
  50.   //這里使用context上下文包, 有5秒鐘的處理超時時間 
  51.   ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second
  52.   defer cancel() 
  53.   if err := srv.Shutdown(ctx); err != nil {  //利用內置Shutdown方法優雅關閉服務 
  54.     log.Fatal("Server forced to shutdown:", err) 
  55.   } 
  56.  
  57.   log.Println("Server exiting"

參考文檔

Gin官方倉庫:https://github.com/gin-gonic/gin

 

責任編輯:姜華 來源: 云原生云
相關推薦

2020-12-10 10:22:48

GinWeb中間件HTTPS

2020-11-25 09:18:15

Golang GinW

2020-12-02 11:18:28

Golang GinW

2020-11-25 09:10:39

Golang GinW

2016-11-11 21:00:46

中間件

2021-10-06 19:03:35

Go中間件Middleware

2024-12-09 00:00:15

Gin框架中間件

2024-01-05 08:17:53

FiberGolang路由

2020-11-23 10:48:39

Golang GinW

2023-05-08 08:09:26

路由元信息謂詞

2021-01-20 08:26:16

中間件技術spring

2025-02-08 11:49:42

2024-05-06 12:30:51

Go語言中間件

2011-05-24 15:10:48

2021-02-11 08:21:02

中間件開發CRUD

2020-12-03 09:28:05

Golang GinW

2018-07-29 12:27:30

云中間件云計算API

2018-02-01 10:19:22

中間件服務器系統

2020-01-07 08:00:52

ApacheHTTPHTTPS

2023-06-29 10:10:06

Rocket MQ消息中間件
點贊
收藏

51CTO技術棧公眾號

国产欧美123| 久久久久久久一区二区三区| 美女一区二区三区视频| 福利视频在线看| 久久99深爱久久99精品| 欧美激情视频播放| 黄色三级生活片| 亚洲性视频在线| 色综合天天性综合| 中文视频一区视频二区视频三区| 成人午夜视频一区二区播放| 亚洲一区二区伦理| 久久视频精品在线| 偷拍女澡堂一区二区三区| 日韩精品手机在线| 日韩成人a**站| 欧美精品一区二区三| 欧美午夜aaaaaa免费视频| 免费影视亚洲| 国产日韩三级在线| 国产精品亚洲综合| 国产又粗又猛又色又| 国产亚洲毛片在线| 色综合视频网站| 国产黄a三级三级| 蜜桃精品wwwmitaows| 欧美r级在线观看| 加勒比av中文字幕| 成人国产精品| 色国产精品一区在线观看| 欧美一级片免费播放| av网站免费在线观看| 国产精品色哟哟| 美日韩免费视频| 欧美自拍偷拍一区二区| 国产精品一区二区在线播放| 日韩免费观看高清| 国产精品久久久免费视频| 欧美日韩免费| 欧美成人全部免费| 91高清免费观看| 婷婷中文字幕一区| 最近2019中文字幕在线高清| 亚洲欧美va天堂人熟伦| 亚洲精品**不卡在线播he| 日韩av一卡二卡| 国产清纯白嫩初高中在线观看性色| 国产精品一区二区三区四区在线观看 | 亚洲在线观看| 2019中文字幕全在线观看| 日产欧产va高清| 99国产精品私拍| 国语自产精品视频在线看抢先版图片| 国产在线观看免费av| 亚洲小说欧美另类婷婷| 欧美激情精品久久久久久蜜臀 | 亚洲欧美视频在线播放| 网红女主播少妇精品视频| 日韩精品中文字幕在线观看| 欧美多人猛交狂配| 成人写真视频| 久久久精品国产| 欧美丰满艳妇bbwbbw| 欧美激情四色| 2019中文字幕全在线观看| 4438国产精品一区二区| 日本伊人色综合网| 国产精品亚洲片夜色在线| 国产免费不卡视频| 成人听书哪个软件好| 精品免费日产一区一区三区免费| 亚洲区小说区图片区| 久久精品日产第一区二区三区高清版 | 第一社区sis001原创亚洲| 亚洲欧美日本另类| 国产高潮免费视频| 最新亚洲国产| 精品国产乱码久久久久久1区2区| 捆绑裸体绳奴bdsm亚洲| 久久最新网址| 久久综合久中文字幕青草| 国产污视频在线观看| 久久性色av| 成人免费网站在线看| 成人无码一区二区三区| 国产亚洲女人久久久久毛片| eeuss中文| 少妇视频在线观看| 欧美日韩精品久久久| 中文字幕18页| 欧美丝袜激情| 欧美激情在线有限公司| 无码人妻精品一区二| 喷水一区二区三区| 国产精品亚洲不卡a| 最新av网站在线观看| 亚洲五码中文字幕| 亚洲黄色av网址| 黄色成人美女网站| 自拍偷拍亚洲欧美| 日韩高清精品免费观看| 精品一区二区三区在线播放视频 | eeuss影院www在线观看| 亚洲乱码精品一二三四区日韩在线| 国产原创中文在线观看| 久久久加勒比| 日韩大片免费观看视频播放| 天堂а√在线中文在线鲁大师| 99在线热播精品免费99热| 国产又爽又黄的激情精品视频| 手机看片1024日韩| 亚洲日本一区二区三区| 国产xxxxx在线观看| av成人app永久免费| 日韩中文娱乐网| 男人天堂2024| 成年人网站91| 玖玖精品在线视频| 国产成人精品一区二区三区视频| 亚洲国产成人精品一区二区 | 无码av免费一区二区三区试看 | 欧美美女黄色| 欧美精品制服第一页| 久久这里只有精品9| 91视视频在线观看入口直接观看www| 椎名由奈jux491在线播放 | 18av在线视频| 欧美色精品天天在线观看视频| 国产毛片毛片毛片毛片毛片毛片| 亚洲综合五月| 91麻豆桃色免费看| 成人午夜影视| 在线日韩国产精品| 蜜桃精品一区二区| 亚洲一区欧美二区| 国产日韩二区| 黑人精品视频| 精品国产亚洲在线| 激情综合网五月婷婷| 国产盗摄一区二区三区| 成人手机在线播放| 爱情电影网av一区二区| 久久九九免费视频| 国产精品爽爽久久| 国产精品久久看| a在线观看免费视频| 成人婷婷网色偷偷亚洲男人的天堂| 国产成人久久久精品一区| 日韩精品系列| 色哟哟日韩精品| 国产精品成人无码免费| 日韩国产在线一| 一区二区三区国产福利| 久久影视精品| 久久亚洲欧美日韩精品专区| av加勒比在线| 亚洲一级电影视频| 无码成人精品区在线观看| 亚洲精品人人| 免费在线成人av| 欧美日一区二区三区| 日韩有码片在线观看| 99热这里只有精品1| 亚洲激情五月婷婷| 国产视频精品视频| 免费视频一区二区三区在线观看| 日韩欧美一区二区视频在线播放| 欧美大片1688网站| xxxx性欧美| 国产99对白在线播放| 香蕉加勒比综合久久| 爱爱的免费视频| 日本成人中文字幕| 欧美一级免费在线观看| 成人福利免费在线观看| 日本电影亚洲天堂| 麻豆网站在线看| 欧美草草影院在线视频| 一级片免费在线播放| 国产精品女人毛片| 极品白嫩少妇无套内谢| 国产精品久久777777毛茸茸 | 牛人盗摄一区二区三区视频| 亚洲精品一区三区三区在线观看| 日韩在线www| 手机看片一区二区三区| 欧美亚洲综合网| 久久久久久久9999| 久久精品亚洲乱码伦伦中文| 永久免费黄色片| 亚洲欧美日韩国产综合精品二区 | 久久99精品网久久| 亚洲熟妇无码一区二区三区导航| 残酷重口调教一区二区| 国产98在线|日韩| 精品欧美日韩精品| 欧美二区在线播放| h视频网站在线观看| 欧美精品一区二区三区蜜桃视频| 涩涩视频在线观看| 午夜成人免费电影| 男人晚上看的视频| 久久―日本道色综合久久| 国产毛片久久久久久| 久久综合五月| xxxx18hd亚洲hd捆绑| 亚洲国产一区二区在线观看 | 亚洲综合不卡| 精品无码av无码免费专区| 神马久久一区二区三区| 国产精品一区二区在线观看| 久久女人天堂| 国产成人极品视频| 福利在线免费视频| 欧美精品在线观看| 欧美日韩在线看片| 国产亚洲一级高清| 无码h黄肉3d动漫在线观看| 欧美一级艳片视频免费观看| 丰满熟女人妻一区二区三| 亚洲妇熟xx妇色黄| 国产xxxxhd| 欧美aaa在线| 成年人在线看片| 妖精视频成人观看www| 亚洲熟妇无码av在线播放| 午夜影院欧美| 一本一本a久久| 欧美呦呦网站| 日韩电影免费观看高清完整| 亚洲精品进入| 精品1区2区| 欧美理论电影在线精品| 国产综合色一区二区三区| 亚洲一区二区三区免费| 91最新在线免费观看| 视频91a欧美| 国产欧美一区二区白浆黑人| 国产三级一区| 国产免费一区二区三区在线能观看| 日韩欧美精品电影| 国产精品久久久999| 欧美日韩尤物久久| 国产剧情久久久久久| 久久女人天堂| 亚洲影院色无极综合| 精品视频一区二区三区在线观看| 91日本在线视频| 麻豆国产一区| 99国产在线| 国产精品一线| 精品国产一区二区三区久久久久久| 国产三级精品三级在线观看国产| 国产精品三区在线| 青青草久久爱| 欧美国产综合视频| 国产日韩视频在线| 午夜精品亚洲一区二区三区嫩草| 色呦哟—国产精品| 国产91porn| 亚洲精选91| 国产福利一区视频| 美女视频免费一区| 麻豆网站免费观看| 成人午夜电影久久影院| 亚洲人人夜夜澡人人爽| 欧美国产日产图区| 欧美成人777| 亚洲成av人**亚洲成av**| 在线天堂中文字幕| 精品视频色一区| 国产高潮在线观看| 日韩精品在线视频| 五月天婷婷在线视频| 欧美成人精品在线| 日韩欧美精品一区二区三区| 国产精品国内视频| 亚洲啊v在线免费视频| 久久婷婷开心| 久久视频在线| 欧美一级视频在线播放| 日韩成人一级片| 久久久久亚洲av无码网站| 久久综合色综合88| 三级全黄做爰视频| 精品久久久久久久久久国产| 中文字幕av免费观看| 欧美xfplay| 成人在线免费电影| 欧美富婆性猛交| 九色成人搞黄网站| 97久久天天综合色天天综合色hd| 爽爽窝窝午夜精品一区二区| 亚洲视频电影| 99国产精品| 欧美午夜精品理论片| 久久综合五月天婷婷伊人| 欧美一区二区三区爽爽爽| 欧美性猛交xxxx乱大交3| 国产精品美女一区| 亚洲精品小视频在线观看| av网址在线| 国产精品一区二区三区免费视频| 久久资源综合| 免费看污污视频| 免费在线观看一区二区三区| 日本黄色动态图| 亚洲乱码国产乱码精品精的特点| 国产免费a视频| 亚洲国产小视频| 在线观看三级视频| 国产精品丝袜久久久久久高清| 精品伊人久久久| 免费看日本黄色| 久久精品国产99久久6| 男人天堂av电影| 五月综合激情日本mⅴ| 国产www视频| 久久精品国产一区| 91天天综合| 日本精品视频一区| 一区二区91| 97香蕉碰碰人妻国产欧美| 亚洲精品欧美激情| 一区二区精品视频在线观看| 亚洲最新av在线| 在线观看v片| 精品视频免费观看| 影音先锋一区| 欧美xxxx日本和非洲| 亚洲免费在线看| 国产免费视频一区二区三区| 少妇av一区二区三区| 成人在线视频播放| 日本一区高清不卡| 三级影片在线观看欧美日韩一区二区| 菠萝菠萝蜜网站| 欧美日韩美女在线| 香蕉视频国产在线| 2019亚洲日韩新视频| 自拍亚洲一区| 黄色一级大片在线观看| 国产欧美一区二区三区鸳鸯浴| 日本视频网站在线观看| 亚洲色图在线观看| 免费高清视频在线一区| 日韩av大全| 久久精品久久精品| www.97视频| 日韩欧美国产麻豆| 黄色羞羞视频在线观看| 精品在线观看一区二区| 亚洲一区一卡| 亚洲午夜精品久久久久久高潮| 欧美在线免费视屏| 亚洲视频tv| 91免费视频网站| 自拍视频亚洲| 人妻 丝袜美腿 中文字幕| 亚洲综合色噜噜狠狠| 日本高清视频免费看| 久久久亚洲网站| 国偷自产av一区二区三区| 国产素人在线观看| 久久蜜桃av一区二区天堂| 中文字幕精品一区二区精| 久久亚洲精品视频| 日韩伦理一区二区三区| 99久久激情视频| 国产精品女主播av| 免费a视频在线观看| 国产成人免费av| 欧美成人中文| aaaaa级少妇高潮大片免费看| 欧美唯美清纯偷拍| 婷婷av在线| 日本一区二区在线视频观看| 精品系列免费在线观看| 日本三级理论片| 中文字幕日韩高清| 日韩区欧美区| 热久久精品国产| 亚洲男人电影天堂| 亚洲色欧美另类| 国产中文欧美精品| 99成人免费视频| 波多野结衣亚洲一区二区| 亚洲激情视频在线观看| 国产69精品久久久久9999人| 国产美女主播在线播放| 中文字幕第一区第二区| 国内精品久久久久久久久久| 91精品国产一区| 999久久久免费精品国产| 强迫凌虐淫辱の牝奴在线观看| 欧美美女黄视频| 乡村艳史在线观看| 日韩中文字幕亚洲精品欧美| 欧美经典三级视频一区二区三区| 亚洲乱码精品久久久久..|