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

SpringMVC 中的參數還能這么傳遞?漲姿勢了!

開發 前端
今天來聊一個 JavaWeb 中簡單的話題,但是感覺卻比較稀罕,因為這個技能點,有的小伙伴們可能沒聽過!

[[384541]]

今天來聊一個 JavaWeb 中簡單的話題,但是感覺卻比較稀罕,因為這個技能點,有的小伙伴們可能沒聽過!

1.緣起

說到 Web 請求參數傳遞,大家能想到哪些參數傳遞方式?

參數可以放在地址欄中,不過地址欄參數的長度有限制,并且在有的場景下我們可能不希望參數暴漏在地址欄中。參數可以放在請求體中,這個沒啥好說的。

小伙伴們試想這樣一個場景:

在一個電商項目中,有一個提交訂單的請求,這個請求是一個 POST 請求,請求參數都在請求體中。當用戶提交成功后,為了防止用戶刷新瀏覽器頁面造成訂單請求重復提交,我們一般會將用戶重定向到一個顯示訂單的頁面,這樣即使用戶刷新頁面,也不會造成訂單請求重復提交。

大概的代碼就像下面這樣:

  1. @Controller 
  2. public class OrderController { 
  3.     @PostMapping("/order"
  4.     public String order(OrderInfo orderInfo) { 
  5.         //其他處理邏輯 
  6.         return "redirect:/orderlist"
  7.     } 

這段代碼我相信大家都懂吧!如果不懂可以看看松哥錄制的免費的 SpringMVC 入門教程(硬核!松哥又整了一套免費視頻,搞起!)。

但是這里有一個問題:如果我想傳遞參數怎么辦?

如果是服務器端跳轉,我們可以將參數放在 request 對象中,跳轉完成后還能拿到參數,但是如果是客戶端跳轉我們就只能將參數放在地址欄中了,像上面這個方法的返回值我們可以寫成:return "redirect:/orderlist?xxx=xxx";,這種傳參方式有兩個缺陷:

  • 地址欄的長度是有限的,也就意味著能夠放在地址欄中的參數是有限的。
  • 不想將一些特殊的參數放在地址欄中。

那該怎么辦?還有辦法傳遞參數嗎?

有!這就是今天松哥要和大家介紹的 flashMap,專門用來解決重定向時參數的傳遞問題。

2.flashMap

在重定向時,如果需要傳遞參數,但是又不想放在地址欄中,我們就可以通過 flashMap 來傳遞參數,松哥先來一個簡單的例子大家看看效果:

首先我們定義一個簡單的頁面,里邊就一個 post 請求提交按鈕,如下:

  1. <!DOCTYPE html> 
  2. <html lang="en"
  3. <head> 
  4.     <meta charset="UTF-8"
  5.     <title>Title</title> 
  6. </head> 
  7. <body> 
  8. <form action="/order"
  9.     <input type="submit" value="提交"
  10. </form> 
  11. </body> 
  12. </html> 

然后在服務端接收該請求,并完成重定向:

  1. @Controller 
  2. public class OrderController { 
  3.     @PostMapping("/order"
  4.     public String order(HttpServletRequest req) { 
  5.         FlashMap flashMap = (FlashMap) req.getAttribute(DispatcherServlet.OUTPUT_FLASH_MAP_ATTRIBUTE); 
  6.         flashMap.put("name""江南一點雨"); 
  7.         return "redirect:/orderlist"
  8.     } 
  9.  
  10.     @GetMapping("/orderlist"
  11.     @ResponseBody 
  12.     public String orderList(Model model) { 
  13.         return (String) model.getAttribute("name"); 
  14.     } 

首先在 order 接口中,獲取到 flashMap 屬性,然后存入需要傳遞的參數,這些參數最終會被 SpringMVC 自動放入重定向接口的 Model 中,這樣我們在 orderlist 接口中,就可以獲取到該屬性了。

當然,這是一個比較粗糙的寫法,我們還可以通過 RedirectAttributes 來簡化這一步驟:

  1. @Controller 
  2. public class OrderController { 
  3.     @PostMapping("/order"
  4.     public String order(RedirectAttributes attr) { 
  5.         attr.addFlashAttribute("site""www.javaboy.org"); 
  6.         attr.addAttribute("name""微信公眾號:江南一點雨"); 
  7.         return "redirect:/orderlist"
  8.     } 
  9.  
  10.     @GetMapping("/orderlist"
  11.     @ResponseBody 
  12.     public String orderList(Model model) { 
  13.         return (String) model.getAttribute("site"); 
  14.     } 

RedirectAttributes 中有兩種添加參數的方式:

  • addFlashAttribute:將參數放到 flashMap 中。
  • addAttribute:將參數放到 URL 地址中。

經過前面的講解,現在小伙伴們應該大致明白了 flashMap 的作用了,就是在你進行重定向的時候,不通過地址欄傳遞參數。

很多小伙伴可能會有疑問,重定向其實就是瀏覽器發起了一個新的請求,這新的請求怎么就獲取到上一個請求保存的參數呢?這我們就要來看看 SpringMVC 的源碼了。

3.源碼分析

首先這里涉及到一個關鍵類叫做 FlashMapManager,如下:

  1. public interface FlashMapManager { 
  2.  @Nullable 
  3.  FlashMap retrieveAndUpdate(HttpServletRequest request, HttpServletResponse response); 
  4.  void saveOutputFlashMap(FlashMap flashMap, HttpServletRequest request, HttpServletResponse response); 

兩個方法含義一眼就能看出來:

retrieveAndUpdate:這個方法用來恢復參數,并將恢復過的的參數和超時的參數從保存介質中刪除。

saveOutputFlashMap:將參數保存保存起來。

FlashMapManager 的實現類如下:

從這個繼承類中,我們基本上就能確定默認的保存介質時 session。具體的保存邏輯則是在 AbstractFlashMapManager 類中。

整個參數傳遞的過程可以分為三大步:

第一步,首先我們將參數設置到 outputFlashMap 中,有兩種設置方式:我們前面的代碼 req.getAttribute(DispatcherServlet.OUTPUT_FLASH_MAP_ATTRIBUTE) 就是直接獲取 outputFlashMap 對象然后把參數放進去;第二種方式就是通過在接口中添加 RedirectAttributes 參數,然后把需要傳遞的參數放入 RedirectAttributes 中,這樣當處理器處理完畢后,會自動將其設置到 outputFlashMap 中,具體邏輯在 RequestMappingHandlerAdapter#getModelAndView 方法中:

  1. private ModelAndView getModelAndView(ModelAndViewContainer mavContainer, 
  2.   ModelFactory modelFactory, NativeWebRequest webRequest) throws Exception { 
  3.  //省略... 
  4.  if (model instanceof RedirectAttributes) { 
  5.   Map<String, ?> flashAttributes = ((RedirectAttributes) model).getFlashAttributes(); 
  6.   HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class); 
  7.   if (request != null) { 
  8.    RequestContextUtils.getOutputFlashMap(request).putAll(flashAttributes); 
  9.   } 
  10.  } 
  11.  return mav; 

可以看到,如果 model 是 RedirectAttributes 的實例的話,則通過 getOutputFlashMap 方法獲取到 outputFlashMap 屬性,然后相關的屬性設置進去。

這是第一步,就是將需要傳遞的參數,先保存到 flashMap 中。

第二步,重定向對應的視圖是 RedirectView,在它的 renderMergedOutputModel 方法中,會調用 FlashMapManager 的 saveOutputFlashMap 方法,將 outputFlashMap 保存到 session 中,如下:

  1. protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, 
  2.   HttpServletResponse response) throws IOException { 
  3.  String targetUrl = createTargetUrl(model, request); 
  4.  targetUrl = updateTargetUrl(targetUrl, model, request, response); 
  5.  // Save flash attributes 
  6.  RequestContextUtils.saveOutputFlashMap(targetUrl, request, response); 
  7.  // Redirect 
  8.  sendRedirect(request, response, targetUrl, this.http10Compatible); 

RequestContextUtils.saveOutputFlashMap 方法最終就會調用到 FlashMapManager 的 saveOutputFlashMap 方法,將 outputFlashMap 保存下來。我們來大概看一下保存邏輯:

  1. public final void saveOutputFlashMap(FlashMap flashMap, HttpServletRequest request, HttpServletResponse response) { 
  2.  if (CollectionUtils.isEmpty(flashMap)) { 
  3.   return
  4.  } 
  5.  String path = decodeAndNormalizePath(flashMap.getTargetRequestPath(), request); 
  6.  flashMap.setTargetRequestPath(path); 
  7.  flashMap.startExpirationPeriod(getFlashMapTimeout()); 
  8.  Object mutex = getFlashMapsMutex(request); 
  9.  if (mutex != null) { 
  10.   synchronized (mutex) { 
  11.    List<FlashMap> allFlashMaps = retrieveFlashMaps(request); 
  12.    allFlashMaps = (allFlashMaps != null ? allFlashMaps : new CopyOnWriteArrayList<>()); 
  13.    allFlashMaps.add(flashMap); 
  14.    updateFlashMaps(allFlashMaps, request, response); 
  15.   } 
  16.  } 
  17.  else { 
  18.   List<FlashMap> allFlashMaps = retrieveFlashMaps(request); 
  19.   allFlashMaps = (allFlashMaps != null ? allFlashMaps : new ArrayList<>(1)); 
  20.   allFlashMaps.add(flashMap); 
  21.   updateFlashMaps(allFlashMaps, request, response); 
  22.  } 

其實這里的邏輯也很簡單,保存之前會給 flashMap 設置兩個屬性,一個是重定向的 url 地址,另一個則是過期時間,過期時間默認 180 秒,這兩個屬性在第三步加載 flashMap 的時候會用到。然后將 flashMap 放入集合中,并調用 updateFlashMaps 方法存入 session 中。

第三步,當重定向請求到達 DispatcherServlet#doService 方法后,此時會調用 FlashMapManager#retrieveAndUpdate 方法從 Session 中獲取 outputFlashMap 并設置到 Request 屬性中備用(最終會被轉化到 Model 中的屬性),相關代碼如下:

  1. protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception { 
  2.  //省略... 
  3.  if (this.flashMapManager != null) { 
  4.   FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response); 
  5.   if (inputFlashMap != null) { 
  6.    request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap)); 
  7.   } 
  8.   request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap()); 
  9.   request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager); 
  10.  } 
  11.  //省略... 

注意這里獲取出來的 outputFlashMap 換了一個名字,變成了 inputFlashMap,其實是同一個東西。

我們可以大概看一下獲取的邏輯 AbstractFlashMapManager#retrieveAndUpdate:

  1. public final FlashMap retrieveAndUpdate(HttpServletRequest request, HttpServletResponse response) { 
  2.  List<FlashMap> allFlashMaps = retrieveFlashMaps(request); 
  3.  if (CollectionUtils.isEmpty(allFlashMaps)) { 
  4.   return null
  5.  } 
  6.  List<FlashMap> mapsToRemove = getExpiredFlashMaps(allFlashMaps); 
  7.  FlashMap match = getMatchingFlashMap(allFlashMaps, request); 
  8.  if (match != null) { 
  9.   mapsToRemove.add(match); 
  10.  } 
  11.  if (!mapsToRemove.isEmpty()) { 
  12.   Object mutex = getFlashMapsMutex(request); 
  13.   if (mutex != null) { 
  14.    synchronized (mutex) { 
  15.     allFlashMaps = retrieveFlashMaps(request); 
  16.     if (allFlashMaps != null) { 
  17.      allFlashMaps.removeAll(mapsToRemove); 
  18.      updateFlashMaps(allFlashMaps, request, response); 
  19.     } 
  20.    } 
  21.   } 
  22.   else { 
  23.    allFlashMaps.removeAll(mapsToRemove); 
  24.    updateFlashMaps(allFlashMaps, request, response); 
  25.   } 
  26.  } 
  27.  return match; 
  • 首先調用 retrieveFlashMaps 方法從 session 中獲取到所有的 FlashMap。
  • 調用 getExpiredFlashMaps 方法獲取所有過期的 FlashMap,FlashMap 默認的過期時間是 180s。
  • 獲取和當前請求匹配的 getMatchingFlashMap,具體的匹配邏輯就兩點:重定向地址要和當前請求地址相同;預設參數要相同。一般來說我們不需要配置預設參數,所以這一條可以忽略。如果想要設置,則首先給 flashMap 設置,像這樣:flashMap.addTargetRequestParam("aa", "bb");,然后在重定向的地址欄也加上這個參數:return "redirect:/orderlist?aa=bb"; 即可。
  • 將獲取到的匹配的 FlashMap 對象放入 mapsToRemove 集合中(這個匹配到的 FlashMap 即將失效,放入集合中一會被清空)。
  • 將 allFlashMaps 集合中的所有 mapsToRemove 數據清空,同時調用 updateFlashMaps 方法更新 session 中的 FlashMap。
  • 最終將匹配到的 flashMap 返回。

這就是整個獲取 flashMap 的方法,整體來看還是非常 easy 的,并沒有什么難點。

4.小結

好啦,今天就和小伙伴們分享了一下 SpringMVC 中的 flashMap,不知道大家有沒有在工作中用到這個東西?如果剛好碰到松哥前面所說的需求,用 FlashMap 真的還是蠻方便的。

本文轉載自微信公眾號「江南一點雨」,可以通過以下二維碼關注。轉載本文請聯系江南一點雨公眾號。

 

責任編輯:武曉燕 來源: 江南一點雨
相關推薦

2016-12-02 20:43:28

Android

2024-10-28 07:10:00

scroll標記前端網格布局

2023-12-29 08:17:20

接口類SpringAOP

2020-10-12 06:28:05

動態IP框架

2020-12-22 09:34:20

JavaScript開發技術

2022-02-14 21:58:58

netstatLinuxWindows

2024-07-30 09:01:12

2024-09-14 09:41:17

2019-03-28 11:07:56

Spring BootRedis緩存

2015-07-27 16:13:46

Linux認證

2022-08-12 08:25:33

Python異常信息代碼

2022-10-31 08:47:21

人臉識別按鍵鍵盤

2024-07-10 11:26:18

2022-10-28 19:19:11

ChromeNetwork網絡

2021-11-22 11:05:20

Vue 3setup前端

2015-06-08 11:21:42

iOS技巧

2020-08-27 19:30:39

Chrome瀏覽器

2019-12-16 11:16:22

Git子模塊項目

2025-02-12 10:51:51

點贊
收藏

51CTO技術棧公眾號

日韩精品视频免费在线观看| 中国av一区二区三区| 欧美精品久久久久久久| 97人妻精品一区二区三区免费| 波多野结衣中文在线| av在线不卡网| 国产美女高潮久久白浆| 欧美日韩精品亚洲精品| 奇米影视777在线欧美电影观看 | 人人干人人干人人干| 亚洲影院天堂中文av色| 777精品伊人久久久久大香线蕉| 超碰超碰超碰超碰超碰| 欧美孕妇孕交| 国产一区欧美二区| 2021国产精品视频| 欧美成人777| 女厕嘘嘘一区二区在线播放| 日韩一级免费观看| 少妇激情一区二区三区| 欧美videos另类精品| 国产视频视频一区| 国产欧美在线一区二区| 在线免费观看av片| 亚洲在线一区| 欧美激情精品在线| 成人一级黄色大片| 精品精品久久| 精品sm在线观看| 中文字幕亚洲影院| 91看片一区| 亚洲国产精品久久不卡毛片| 在线成人性视频| 国产三区四区在线观看| 99国产精品久| 国产伦精品一区二区三区免费视频| 中文在线最新版天堂| 国产精品日本欧美一区二区三区| 欧美高清videos高潮hd| 在线免费看av网站| 欧美疯狂party性派对| 亚洲人线精品午夜| 亚洲精品乱码久久| 久久久久观看| 亚洲国产精品福利| 成人一区二区三区仙踪林| 热久久久久久| 欧美日韩国产天堂| 亚洲一区在线不卡| 韩日一区二区| 在线观看中文字幕不卡| 日韩免费一级视频| 9999精品成人免费毛片在线看| 伊人色综合久久天天| 老司机av福利| 在线网址91| 一区二区三区精品久久久| 色婷婷777777仙踪林| 精品视频在线一区二区| 日韩理论片网站| 中文字幕成人一区| 国内精品久久久久国产| 亚洲人成在线播放网站岛国| 一区二区三区国产福利| 调教视频免费在线观看| 国产欧美一区二区精品性色超碰| 日韩av电影免费在线| 国产三区四区在线观看| 国产精品久久99| 日韩不卡视频一区二区| 91黄页在线观看| 五月天激情综合| heyzo国产| 日本久久免费| 欧美日韩欧美一区二区| 91精品视频国产| 99久久香蕉| 精品无人区太爽高潮在线播放| 国产精品无码久久久久一区二区| 九九视频精品全部免费播放| 伊人久久久久久久久久久久久| 久久免费手机视频| 欧美暴力喷水在线| 91精品国产高清自在线看超| 免费黄色片视频| 久久99精品国产| 成人女人免费毛片| 天堂成人在线| 国产精品久99| 精品国产一区三区| 免费在线观看一区| 日韩欧美色电影| 一区二区三区免费在线观看视频| 欧美在线免费看视频| 欧美精品日韩www.p站| 日韩av电影网| 久久国产精品72免费观看| av电影成人| 黄视频在线播放| 依依成人综合视频| 不卡av免费在线| 亚洲伊人影院| 一区二区三欧美| 黄色小说在线观看视频| 日本vs亚洲vs韩国一区三区| 动漫一区二区在线| av中文字幕一区二区三区| 亚洲愉拍自拍另类高清精品| 动漫av免费观看| 91久久偷偷做嫩草影院电| 亚洲午夜性刺激影院| 国产十六处破外女视频| 日日噜噜夜夜狠狠视频欧美人| 99久久精品久久久久久ai换脸| 毛片在线播放网址| 亚洲一级在线观看| 波多野结衣国产精品| 亚洲动漫在线观看| 欧美激情亚洲国产| 91精品国产综合久| 久久久不卡网国产精品二区| 国产一区二区四区| 91成人小视频| 中文字幕九色91在线| 国产无精乱码一区二区三区| 国产在线不卡视频| 亚欧精品在线| 欧美色网一区| 亚洲国产中文字幕在线观看| 欧美又粗又大又长| 久久se精品一区精品二区| 青青草成人网| 久久精品女人天堂av免费观看| 精品日韩99亚洲| 91嫩草|国产丨精品入口| 免费在线一区观看| 日本视频精品一区| 欧美一级二级视频| 亚洲人成电影网站色| 国产成人在线观看网站| 丁香五精品蜜臀久久久久99网站 | 在线视频你懂得一区| 在线视频 日韩| 一区在线免费| 国产美女精品久久久| 狂野欧美性猛交xxxxx视频| 91精品欧美久久久久久动漫| 天海翼在线视频| 久久国产夜色精品鲁鲁99| 日韩av一级大片| 快播电影网址老女人久久| 亚洲欧美第一页| 天天干天天操天天爱| 久久综合狠狠综合久久综合88 | 欧美成人综合网站| 欧美极品视频在线观看| 国产99一区视频免费| 国产成人艳妇aa视频在线| 亚洲日本va中文字幕| 欧美大荫蒂xxx| 国模无码一区二区三区| 亚洲最新视频在线播放| 精品视频站长推荐| 亚洲欧美日韩国产| 日韩精品久久一区二区三区| 欧美v亚洲v综合v国产v仙踪林| 日韩在线一区二区三区免费视频| 国产一区二区视频免费观看| 亚洲女同ⅹxx女同tv| 香蕉视频xxxx| 亚洲美女网站| 欧美日韩在线观看一区| 精品乱码一区二区三区四区| 久久精品99久久久香蕉| 亚洲狼人综合网| 欧美性猛交xxxx免费看久久久| 精品人妻无码一区二区三区换脸| 免费视频最近日韩| 成人免费a级片| 亚洲第一二三区| 国产精品亚洲视频在线观看| 色呦呦网站在线观看| 日韩av在线天堂网| 中文字幕精品一区二| 一区二区三区在线观看国产| 美国黄色a级片| 久久精品国产**网站演员| 成年人深夜视频| 国产伦精品一区二区三区千人斩| 国产有码在线一区二区视频| 免费在线观看的电影网站| 亚洲欧洲av一区二区| 国产精品国产三级国产普通话对白 | 欧美美女一区二区三区| 国产精品1000| 国产精品视频一区二区三区不卡| 在线免费黄色小视频| 欧美亚洲一区二区三区| 黑人巨大国产9丨视频| 人妖一区二区三区| 91久久精品美女| sis001欧美| 欧美成人精品在线播放| 免费福利在线视频| 日韩欧美中文字幕精品| 国产真人无遮挡作爱免费视频| 一区二区在线观看av| 人人人妻人人澡人人爽欧美一区| 国产成人免费网站| 日韩av在线中文| 新狼窝色av性久久久久久| 加勒比海盗1在线观看免费国语版| 久久综合欧美| 国产伦精品一区二区三区高清| 欧美成人黄色| 日韩av电影在线播放| www.综合网.com| 久久网福利资源网站| 成人高清网站| 亚洲美女福利视频网站| 欧美熟妇另类久久久久久不卡| 欧美日韩一卡二卡三卡| 麻豆成人免费视频| 亚洲一区二区精品久久av| 在线免费看av网站| 国产精品美女视频| 久久成人激情视频| 91丝袜呻吟高潮美腿白嫩在线观看| 五月天六月丁香| 久久精品国产色蜜蜜麻豆| www.四虎成人| 亚洲永久字幕| 美女日批免费视频| 亚洲国产裸拍裸体视频在线观看乱了中文 | 能看毛片的网站| 国内精品视频666| 激情黄色小视频| 全国精品久久少妇| www.日日操| 久久婷婷麻豆| 欧美日韩激情视频在线观看 | 久久久久久久一区二区| 国产丝袜在线| 久久国产精品久久久久久| 免费高清在线观看| x99av成人免费| 九色porny在线| 欧美成人精品一区二区三区| 成人video亚洲精品| 欧美成人精品xxx| 直接在线观看的三级网址| 欧美精品制服第一页| av片在线观看网站| 久久91亚洲人成电影网站| www.久久ai| 欧美激情亚洲一区| 91www在线| 91sa在线看| 中文字幕在线免费观看视频| 97人人爽人人喊人人模波多 | 国产精品视频网址| 欧美成人高清视频在线观看| 亚洲一区二区三区乱码aⅴ| 精品中文在线| 国产精品日韩欧美一区二区三区| 国产ts一区| 欧美日韩在线一二三| 精品国产中文字幕第一页| 一区二区三区久久网| 欧美片第1页综合| 成人性生活视频免费看| 久久久久99| 日韩成人av免费| 成人丝袜高跟foot| 天堂久久精品忘忧草| 国产精品盗摄一区二区三区| 欧美精品成人久久| 欧美视频裸体精品| 中文字幕在线视频第一页| 欧美一区二区三区啪啪| 天堂av手机版| 中文字幕av一区二区三区谷原希美| 免费av网站在线观看| 欧美激情视频在线| 亚洲成a人片| 97视频中文字幕| 你懂的一区二区三区| ijzzijzzij亚洲大全| 91久久亚洲| jizzzz日本| 99精品桃花视频在线观看| 精品人妻中文无码av在线| 亚洲日本乱码在线观看| 国产九色在线播放九色| 欧美日本在线一区| 香蕉视频国产在线| www.欧美精品| 涩涩视频在线| 亚洲尤物视频网| 国产亚洲一区二区三区不卡| 日本aa在线观看| 奇米精品一区二区三区四区| 国产精品一区二区在线免费观看| 国产午夜一区二区三区| 国产一级在线视频| 欧美日韩aaaaa| 欧美日韩影视| 欧美精品videos| 欧美亚洲二区| 欧美一区二区三区电影在线观看| 欧美区日韩区| 亚洲 国产 图片| 久久久不卡网国产精品二区| 国产精品成人网站| 欧美一区二区私人影院日本| 国产污视频在线| 8050国产精品久久久久久| 国产精品亚洲欧美一级在线| 日韩在线电影一区| 亚洲少妇在线| 免费看91视频| 亚洲欧美综合网| 美女黄页在线观看| 亚洲欧美日韩高清| 麻豆视频在线观看免费网站黄| 91手机在线视频| 亚洲欧美在线专区| 国内外成人免费在线视频| 久久久久久久国产精品影院| 日本三级一区二区| 欧美tickling挠脚心丨vk| 福利在线视频网站| 91精品国产自产在线| 国产中文精品久高清在线不| 丝袜老师办公室里做好紧好爽| 成人免费看黄yyy456| 久草视频手机在线观看| 91精品黄色片免费大全| 成人av电影观看| 国产福利精品av综合导导航| 要久久电视剧全集免费 | 免费精品视频在线| 91成人破解版| 色一区在线观看| 国产在线观看网站| 国产成人一区二区三区小说| 久久最新网址| 91蝌蚪视频在线观看| 久久久久九九视频| 国产成人在线免费视频| 亚洲激情视频在线播放| 国产在线看片免费视频在线观看| 国产精品久久久久av福利动漫| 精品1区2区3区4区| 中文在线观看免费视频| 大伊人狠狠躁夜夜躁av一区| 欧美日韩国产亚洲沙发| 国产精品wwww| 93在线视频精品免费观看| 久久久久xxxx| 一区二区三区精密机械公司| 秋霞视频一区二区| 欧美性在线视频| 精品国产91| 99中文字幕在线| 亚洲自拍偷拍av| 亚州av在线播放| 国产成+人+综合+亚洲欧洲| 成人毛片免费看| 国产毛片久久久久久| 亚洲午夜视频在线观看| 日韩一区av| 国产有码在线一区二区视频| 黄色欧美成人| 国产特黄级aaaaa片免| 欧美揉bbbbb揉bbbbb| av在线麻豆| 久久一区二区三区欧美亚洲| 蜜桃一区二区三区四区| 91porn在线视频| 日韩久久精品成人| 亚洲伦理久久| 人妻少妇精品久久| 欧美激情一区在线| 亚洲av色香蕉一区二区三区| 欧洲日韩成人av| 亚洲啊v在线观看| 国产 中文 字幕 日韩 在线| 欧美日韩综合在线免费观看| 久久99亚洲网美利坚合众国| 欧美日产一区二区三区在线观看| 久久成人久久鬼色| 91美女免费看| 久久天天躁夜夜躁狠狠躁2022| 久久porn| 久久6免费视频| 在线精品视频一区二区三四 | 亚洲最新视频在线播放| 国产私拍精品| 国产视色精品亚洲一区二区|