精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

天天综合av| 91激情在线观看| 最近国产精品视频| 在线亚洲人成电影网站色www| 日韩精品久久久| 国产福利小视频| 久久激情婷婷| 久久精品成人动漫| www.88av| 日本中文字幕视频一区| 亚洲第一狼人社区| 午夜精品一区二区在线观看| 亚洲AV无码精品自拍| 久久在线91| 九九综合九九综合| 非洲一级黄色片| 亚洲一区二区三区日本久久九| 欧美性猛交xxxx乱大交3| 热这里只有精品| 蜜芽tv福利在线视频| 国产一区二区在线看| 日产日韩在线亚洲欧美| 青娱乐国产在线视频| 久久综合欧美| 亚洲国产精品成人精品| 高潮一区二区三区| 天堂电影一区| 亚洲午夜一区二区三区| 亚洲综合视频一区| 日韩在线免费看| 高清不卡在线观看| 91久久精品美女| 亚洲高清在线看| 激情视频一区二区三区| 精品国内自产拍在线观看| 女~淫辱の触手3d动漫| 超碰在线一区| 欧美一级电影网站| 羞羞的视频在线| 成人毛片免费| 色综合久久久久综合体| 妞干网在线视频观看| 亚洲综合影视| 亚洲视频中文字幕| 任我爽在线视频精品一| 欧美日韩伦理片| 91原创在线视频| 99一区二区| 精品国产999久久久免费| 久久精品国产一区二区三| 国产精品久久久久久久久久| 国产第一页在线观看| 国产精品毛片一区二区三区| 98视频在线噜噜噜国产| 全部毛片永久免费看| 亚洲美女网站| 国产91精品久| 狠狠人妻久久久久久综合| 免费中文字幕日韩欧美| 欧美一级大胆视频| 无码免费一区二区三区| 丝袜美腿亚洲一区二区图片| 51久久精品夜色国产麻豆| av黄色在线看| 日韩精品一级中文字幕精品视频免费观看 | 狠狠热免费视频| 午夜av成人| 欧美日韩视频在线观看一区二区三区| 三上悠亚av一区二区三区| 偷拍自拍亚洲| 精品国产一区二区三区久久久蜜月| 中国老熟女重囗味hdxx| 免费观看亚洲天堂| 日韩一区二区三区观看| 国产人成视频在线观看| 精品伊人久久久| 日韩高清a**址| av网站免费在线播放| 伊人成综合网伊人222| 亚洲九九九在线观看| 91久久免费视频| 欧美自拍偷拍| 久久精品中文字幕一区| 综合五月激情网| 黑人一区二区| 欧美怡春院一区二区三区| 国产乱国产乱老熟| 夜夜精品视频| 国产精品自拍网| 国产麻豆一精品一男同| 国产91精品久久久久久久网曝门| 国产精品一区二区av| 亚州精品国产精品乱码不99按摩| 91网站在线播放| 国产91社区| 少妇一级淫片免费看| 91理论电影在线观看| 日产国产精品精品a∨| 在线看免费av| 一区二区三区波多野结衣在线观看| 久久久无码中文字幕久...| 丝袜老师在线| 欧美日韩另类国产亚洲欧美一级| 夜夜爽久久精品91| 亚洲丁香日韩| 久久精品国产欧美亚洲人人爽| 国产亚洲精久久久久久无码77777| 亚洲国产网站| 国产精选久久久久久| 丁香六月色婷婷| 国产精品青草久久| 777av视频| 亚洲欧美专区| 亚洲精品国产suv| 国产精品综合激情| 亚洲精品一二| 国产精品日韩精品| 黄色a在线观看| 久久精品一区二区三区不卡| 国产日韩亚洲欧美在线| 九七影院97影院理论片久久| 精品国产三级a在线观看| 天堂在线中文视频| 亚洲精品九九| 91欧美精品成人综合在线观看| 天天色综合久久| 日韩一区在线播放| 欧美日韩在线免费播放| 成人线上播放| 日韩资源在线观看| 黄色在线视频网址| 成人免费毛片aaaaa**| 伊人久久大香线蕉午夜av| 麻豆mv在线看| 欧美大胆人体bbbb| 老头老太做爰xxx视频| 裸体一区二区| 精品欧美国产| 天堂av在线电影| 欧美日韩三级一区| 中文字幕高清视频| 国产欧美日韩一区二区三区在线| 91久久国产精品| aaa日本高清在线播放免费观看| 欧美性色xo影院| 亚洲啪av永久无码精品放毛片 | 欧美熟妇一区二区| 国精品一区二区三区| 国产精品av在线播放| 不卡的日韩av| 成人免费在线视频观看| 五月婷婷丁香色| jlzzjlzz亚洲女人| 国产精品成人av性教育| 欧美一区二区黄片| 精品久久久久久亚洲精品| 国产调教打屁股xxxx网站| 亚洲精品一区二区在线看| 国产精品偷伦一区二区| 成年人在线观看网站| 91福利国产精品| 亚洲码无人客一区二区三区| 亚洲在线视频| 欧美日韩在线精品| 免费高清视频在线一区| 一区二区三区四区视频| 亚洲欧美日韩一区二区三区四区| 久久精品视频一区| 久久久久久久久久福利| 欧美精品系列| 国产日产亚洲精品| 欧美6一10sex性hd| 亚洲国产小视频| 国产精品人人人人| 国产欧美精品国产国产专区| 无遮挡又爽又刺激的视频| 欧美中文字幕一区二区| 91九色综合久久| 大菠萝精品导航| 亚洲毛茸茸少妇高潮呻吟| 国产三级视频在线| 久久久av毛片精品| 欧美日韩福利在线| 国产一区二区三区网| 日韩免费在线观看视频| 国产中文在线| 欧美日韩国产首页| 日本青青草视频| 成人18精品视频| 欧美极品欧美精品欧美图片| 欧美色图一区| 国产精品手机视频| 日韩免费福利视频| 日韩亚洲在线观看| 亚洲国产999| 欧美性猛交xxxx富婆| 国产精品1区2区3区4区| 国产精品99久久久久久似苏梦涵| 国产一二三四五| 综合亚洲色图| 91网站免费看| 国模私拍一区二区国模曼安| 亚洲午夜激情免费视频| 国产女人18毛片18精品| 欧美日韩国产精品一区二区不卡中文| 中文字幕人妻一区二区三区在线视频| 国产精品一区二区x88av| 九九九九免费视频| 天天综合网91| 精品卡一卡二| 中文字幕成人| 91精品国产高清自在线看超| 色多多视频在线观看| 亚洲精品一区二区久| 97在线公开视频| 欧美日韩免费观看中文| 国产精品99久久久久久成人| 91网址在线看| 韩国黄色一级片| 日本午夜一本久久久综合| 免费国产黄色网址| 香蕉视频国产精品| 欧美日韩高清在线一区| 麻豆国产一区| 国产精品久久综合av爱欲tv| 波多野结衣在线高清| 色吧影院999| 熟妇高潮一区二区高潮| 欧美一区二区女人| 中国女人真人一级毛片| 午夜影院在线观看欧美| 老熟妇高潮一区二区三区| 久久奇米777| 国产性猛交96| 国产资源在线一区| 天美一区二区三区| 免费在线视频一区| 成年人在线看片| 日韩视频中文| 国产精品69久久久| 欧美fxxxxxx另类| 永久免费精品视频网站| 国产欧美一区二区精品久久久| 国产一区二区在线观看免费播放| 国产精品成人国产| 国产精品爽爽爽爽爽爽在线观看| 日韩av超清在线观看| 2019中文字幕在线| av资源网在线播放| 久久久女女女女999久久| 污视频免费在线观看| 欧美大片va欧美在线播放| 黄色视屏免费在线观看| 色妞色视频一区二区三区四区| 二区三区在线| 一区二区三区美女xx视频| 二人午夜免费观看在线视频| 亚洲激情第一页| 欧美成人综合在线| 国产一区二区久久精品| 国模吧精品人体gogo| 国产性猛交xxxx免费看久久| 国产永久免费高清在线观看| 亚洲美女激情视频| yjizz视频网站在线播放| 一区二区三区视频免费| 四虎久久免费| 欧美精品一区三区| 色呦呦在线视频| 91精品91久久久久久| 国产精品一区二区日韩| 欧美一级免费看| 成人黄色免费短视频| 国产成人精品亚洲精品| 精品裸体bbb| 成人黄色网免费| 亚洲超碰在线观看| 精品不卡在线| 蜜桃一区二区| 亚洲日本精品国产第一区| 国产精品久久久乱弄| a级片一区二区| 国产日韩欧美一区二区三区在线观看| 草草久久久无码国产专区| 日韩精品乱码av一区二区| 伊人国产在线视频| 国产高清成人在线| 激情综合丁香五月| 国产偷国产偷精品高清尤物| 91免费在线看片| 伊人一区二区三区| 亚洲欧美在线视频免费| 欧美日韩精品综合在线| 国产白浆在线观看| 亚洲欧洲免费视频| 欧美激情午夜| 97国产一区二区精品久久呦| 播放一区二区| 国产传媒一区| 久久亚洲成人| 免费人成自慰网站| 轻轻草成人在线| 欧美熟妇精品一区二区| 久久久久久日产精品| 国产大片免费看| 欧美日韩国产精品一区| 国产有码在线观看| 亚洲精品mp4| 免费日本一区二区三区视频| 91精品国产色综合久久不卡98| 久久国产三级| 好看的日韩精品视频在线| 日韩精品不卡一区二区| 僵尸世界大战2 在线播放| 性欧美长视频| 四虎成人免费视频| 国产精品视频一二| 国产精品免费av一区二区| 717成人午夜免费福利电影| 不卡视频免费在线观看| 在线观看国产精品91| sm久久捆绑调教精品一区| 成人免费网站在线看| 蜜桃一区二区三区| 免费看黄在线看| 毛片av中文字幕一区二区| 法国伦理少妇愉情| 亚洲成av人影院| 国产精品久久欧美久久一区| 日韩免费电影网站| 欧美成人性生活视频| 日韩免费不卡av| 欧美丝袜足交| 日本免费a视频| 国产精品一二一区| 一级性生活免费视频| 91久久久免费一区二区| 欧美 日韩 国产 精品| 欧美巨大黑人极品精男| gogo大尺度成人免费视频| 品久久久久久久久久96高清| 99精品国产99久久久久久福利| 成人三级做爰av| 亚洲免费伊人电影| 国产美女精品视频国产| 日韩中文在线不卡| 成人国产综合| 天堂√在线观看一区二区| 亚洲国产午夜| 青青草成人免费视频| 亚洲第一在线综合网站| 亚洲av无码国产精品久久不卡| 欧美成人精品在线| 激情久久一区二区| 亚洲国产精品影视| 激情丁香综合五月| 亚洲人做受高潮| 欧美高清www午色夜在线视频| 黄a在线观看| 亚洲影院色无极综合| 亚洲欧美偷拍自拍| 天天操夜夜操很很操| 亚洲婷婷综合色高清在线| 精品欧美一区二区精品少妇| 欧美风情在线观看| 高清一区二区三区| 国产女大学生av| 国产视频一区在线观看| 成人黄色三级视频| 中文字幕日韩高清| 国产午夜久久av| 色乱码一区二区三区熟女| 丁香激情综合五月| 亚洲视频免费播放| 日韩精品视频在线免费观看| 伊人网在线播放| 亚洲一区二区四区| 国产福利一区二区三区视频| 日本午夜小视频| 亚洲男人天堂网站| 亚洲综合av一区二区三区| 中文字幕第50页| www.亚洲人| 神马久久久久久久 | 国产精品日韩欧美大师| 欧美hd在线| 久久久久国产免费| 日韩欧美亚洲综合| 黄色片免费在线观看| 风间由美一区二区三区| 国产精品久久久免费| 黄色一级片一级片| 日韩一卡二卡三卡| 欧美成人黑人| av磁力番号网| 99久久伊人精品| 好吊色在线视频| 欧美国产日韩免费| 国产一区2区| av在线免费观看不卡|