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

別了,阿里巴巴fastjson!企業項目遷移Gson全攻略

開發 架構
文章的前半部分,我會簡單分析各種json解析框架的優劣,并給出企業級項目遷移json框架的幾種解決方案。在文章的后半部分,我會結合這一個月的經驗,總結下Gson的使用問題,以及fastjson遷移到Gson踩過的深坑。

前言

大家好,又雙叒叕見面了,我是天天放大家鴿子的蠻三刀。

在被大家取關之前,我立下一個“遠大的理想”,一定要在這周更新文章。現在看來,flag有用了。。。

本篇文章是我這一個多月來幫助組內廢棄fastjson框架的總結,我們將大部分Java倉庫從fastjson遷移至了Gson。

這么做的主要的原因是公司受夠了fastjson頻繁的安全漏洞問題,每一次出現漏洞都要推一次全公司的fastjson強制版本升級,很令公司頭疼。

文章的前半部分,我會簡單分析各種json解析框架的優劣,并給出企業級項目遷移json框架的幾種解決方案。

在文章的后半部分,我會結合這一個月的經驗,總結下Gson的使用問題,以及fastjson遷移到Gson踩過的深坑。

[[376285]]

文章目錄:

  • 為何要放棄fastjson?
  • fastjson替代方案 三種json框架的特點性能對比最終選擇方案
  • 替換依賴時的注意事項 謹慎,謹慎,再謹慎做好開發團隊和測試團隊的溝通做好回歸/接口測試考慮遷移前后的性能差異
  • 使用Gson替換fastjson Json反序列化范型處理List/Map寫入駝峰與下劃線轉換
  • 遷移常見問題踩坑 Date序列化方式不同SpringBoot異常Swagger異常@Mapping JsonObject作為入參異常

注意:是否使用fastjson是近年來一個爭議性很大的話題,本文無意討論框架選型的對錯,只關注遷移這件事中遇到的問題進行反思和思考。大家如果有想發表的看法,可以在評論區 理 性 討論。

為何要放棄fastjson?

究其原因,是fastjson漏洞頻發,導致了公司內部需要頻繁的督促各業務線升級fastjson版本,來防止安全問題。

fastjson在2020年頻繁暴露安全漏洞,此漏洞可以繞過autoType開關來實現反序列化遠程代碼執行并獲取服務器訪問權限。

從2019年7月份發布的v1.2.59一直到2020年6月份發布的 v1.2.71 ,每個版本的升級中都有關于AutoType的升級,涉及13個正式版本。

fastjson中與AutoType相關的版本歷史:

  • 1.2.59發布,增強AutoType打開時的安全性 fastjson
  • 1.2.60發布,增加了AutoType黑名單,修復拒絕服務安全問題 fastjson
  • 1.2.61發布,增加AutoType安全黑名單 fastjson
  • 1.2.62發布,增加AutoType黑名單、增強日期反序列化和JSONPath fastjson
  • 1.2.66發布,Bug修復安全加固,并且做安全加固,補充了AutoType黑名單 fastjson
  • 1.2.67發布,Bug修復安全加固,補充了AutoType黑名單 fastjson
  • 1.2.68發布,支持GEOJSON,補充了AutoType黑名單
  • 1.2.69發布,修復新發現高危AutoType開關繞過安全漏洞,補充了AutoType黑名單
  • 1.2.70發布,提升兼容性,補充了AutoType黑名單
  • 1.2.71發布,補充安全黑名單,無新增利用,預防性補充

相比之下,其他的json框架,如Gson和Jackson,漏洞數量少很多,高危漏洞也比較少,這是公司想要替換框架的主要原因。

fastjson替代方案

本文主要討論Gson替換fastjson框架的實戰問題,所以在這里不展開詳細討論各種json框架的優劣,只給出結論。

經過評估,主要有Jackson和Gson兩種json框架放入考慮范圍內,與fastjson進行對比。

三種json框架的特點

FastJson

速度快

fastjson相對其他JSON庫的特點是快,從2011年fastjson發布1.1.x版本之后,其性能從未被其他Java實現的JSON庫超越。

使用廣泛

fastjson在阿里巴巴大規模使用,在數萬臺服務器上部署,fastjson在業界被廣泛接受。在2012年被開源中國評選為最受歡迎的國產開源軟件之一。

測試完備

fastjson有非常多的testcase,在1.2.11版本中,testcase超過3321個。每次發布都會進行回歸測試,保證質量穩定。

使用簡單

fastjson的API十分簡潔。

Jackson

  • 容易使用 - jackson API提供了一個高層次外觀,以簡化常用的用例。
  • 無需創建映射 - API提供了默認的映射大部分對象序列化。
  • 性能高 - 快速,低內存占用,適合大型對象圖表或系統。
  • 干凈的JSON - jackson創建一個干凈和緊湊的JSON結果,這是讓人很容易閱讀。

不依賴 - 庫不需要任何其他的庫,除了JDK。

Gson

  • 提供一種機制,使得將Java對象轉換為JSON或相反如使用toString()以及構造器(工廠方法)一樣簡單。
  • 允許預先存在的不可變的對象轉換為JSON或與之相反。
  • 允許自定義對象的表現形式
  • 支持任意復雜的對象
  • 輸出輕量易讀的JSON

性能對比

本文不詳細討論性能的差異,畢竟這其中涉及了很多各個框架的實現思路和優化,所以只給出結論:

  1. 序列化單對象性能Fastjson > Jackson > Gson,其中Fastjson和Jackson性能差距很小,Gson性能較差
  2. 序列化大對象性能Jackson> Fastjson > Gson ,序列化大Json對象時Jackson> Gson > Fastjson,Jackson序列化大數據時性能優勢明顯
  3. 反序列化單對象性能 Fastjson > Jackson > Gson , 性能差距較小
  4. 反序列化大對象性能 Fastjson > Jackson > Gson , 性能差距較很小

最終選擇方案

Jackson適用于高性能場景,Gson適用于高安全性場景

對于新項目倉庫,不再使用fastjson。對于存量系統,考慮到Json更換成本,由以下幾種方案可選: 項目未使用autoType功能,建議直接切換為非fastjson,如果切換成本較大,可以考慮繼續使用fastjson,關閉safemode。業務使用了autoType功能,建議推進廢棄fastjson。

替換依賴注意事項

企業項目或者說大型項目的特點:

  • 代碼結構復雜,團隊多人維護。
  • 承擔重要線上業務,一旦出現嚴重bug會導致重大事故。
  • 如果是老項目,可能缺少文檔,不能隨意修改,牽一發而動全身。
  • 項目有很多開發分支,不斷在迭代上線。

所以對于大型項目,想要做到將底層的fastjson遷移到gson是一件復雜且痛苦的事情,其實對于其他依賴的替換,也都一樣。

我總結了如下幾個在替換項目依賴過程中要特別重視的問題。

謹慎,謹慎,再謹慎

再怎么謹慎都不為過,如果你要更改的項目是非常重要的業務,那么一旦犯下錯誤,代價是非常大的。并且,對于業務方和產品團隊來說,沒有新的功能上線,但是系統卻炸了,是一件“無法忍受”的事情。盡管你可能覺得很委屈,因為只有你或者你的團隊知道,雖然業務看上去沒變化,但是代碼底層已經發生了翻天覆地的變化。

所以,謹慎點!

做好開發團隊和測試團隊的溝通

在依賴替換的過程中,需要做好項目的規劃,比如分模塊替換,嚴格細分排期。

把前期規劃做好,開發和測試才能有條不紊的進行工作。

開發之間,需要提前溝通好開發注意事項,比如依賴版本問題,防止由多個開發同時修改代碼,最后發現使用的版本不同,接口用法都不同這種很尷尬,并且要花額外時間處理的事情。

而對于測試,更要事先溝通好。一般來說,測試不會太在意這種對于業務沒有變化的技術項目,因為既不是優化速度,也不是新功能。但其實遷移涉及到了底層,很容易就出現BUG。要讓測試團隊了解更換項目依賴,是需要大量的測試時間投入的,成本不亞于新功能,讓他們盡量重視起來。

做好回歸/接口測試

上面說到測試團隊需要投入大量工時,這些工時主要都用在項目功能的整體回歸上,也就是回歸測試。

當然,不只是業務回歸測試,如果有條件的話,要做接口回歸測試。

如果公司有接口管理平臺,那么可以極大提高這種項目測試的效率。

打個比方,在一個模塊修改完成后,在測試環境(或者沙箱環境),部署一個線上版本,部署一個修改后的版本,直接將接口返回數據進行對比。一般來說是Json對比,網上也有很多的Json對比工具:

  • https://www.sojson.com/

考慮遷移前后的性能差異

正如上面描述的Gson和Fastjson性能對比,替換框架需要注意框架之間的性能差異,尤其是對于流量業務,也就是高并發項目,響應時間如果發生很大的變化會引起上下游的注意,導致一些額外的后果。

使用Gson替換Fastjson

這里總結了兩種json框架常用的方法,貼出詳細的代碼示例,幫助大家快速的上手Gson,無縫切換!

Json反序列化

 

  1. String jsonCase = "[{\"id\":10001,\"date\":1609316794600,\"name\":\"小明\"},{\"id\":10002,\"date\":1609316794600,\"name\":\"小李\"}]"
  2.  
  3. // fastjson 
  4. JSONArray jsonArray = JSON.parseArray(jsonCase); 
  5. System.out.println(jsonArray); 
  6. System.out.println(jsonArray.getJSONObject(0).getString("name")); 
  7. System.out.println(jsonArray.getJSONObject(1).getString("name")); 
  8. // 輸出: 
  9. // [{"date":1609316794600,"name":"小明","id":10001},{"date":1609316794600,"name":"小李","id":10002}] 
  10. // 小明 
  11. // 小李 
  12.  
  13. // Gson 
  14. JsonArray jsonArrayGson = gson.fromJson(jsonCase, JsonArray.class); 
  15. System.out.println(jsonArrayGson); 
  16. System.out.println(jsonArrayGson.get(0).getAsJsonObject().get("name").getAsString()); 
  17. System.out.println(jsonArrayGson.get(1).getAsJsonObject().get("name").getAsString()); 
  18. // 輸出: 
  19. // [{"id":10001,"date":1609316794600,"name":"小明"},{"id":10002,"date":1609316794600,"name":"小李"}] 
  20. // 小明 
  21. // 小李 

看得出,兩者區別主要在get各種類型上,Gson調用方法有所改變,但是變化不大。

那么,來看下空對象反序列化會不會出現異常:

 

  1. String jsonObjectEmptyCase = "{}"
  2.  
  3. // fastjson 
  4. JSONObject jsonObjectEmpty = JSON.parseObject(jsonObjectEmptyCase); 
  5. System.out.println(jsonObjectEmpty); 
  6. System.out.println(jsonObjectEmpty.size()); 
  7. // 輸出: 
  8. // {} 
  9. // 0 
  10.  
  11. // Gson 
  12. JsonObject jsonObjectGsonEmpty = gson.fromJson(jsonObjectEmptyCase, JsonObject.class); 
  13. System.out.println(jsonObjectGsonEmpty); 
  14. System.out.println(jsonObjectGsonEmpty.size()); 
  15. // 輸出: 
  16. // {} 
  17. // 0 

沒有異常,開心。

看看空數組呢,畢竟[]感覺比{}更加容易出錯。

  1. String jsonArrayEmptyCase = "[]"
  2.  
  3. // fastjson 
  4. JSONArray jsonArrayEmpty = JSON.parseArray(jsonArrayEmptyCase); 
  5. System.out.println(jsonArrayEmpty); 
  6. System.out.println(jsonArrayEmpty.size()); 
  7. // 輸出: 
  8. // [] 
  9. // 0 
  10.  
  11. // Gson 
  12. JsonArray jsonArrayGsonEmpty = gson.fromJson(jsonArrayEmptyCase, JsonArray.class); 
  13. System.out.println(jsonArrayGsonEmpty); 
  14. System.out.println(jsonArrayGsonEmpty.size()); 
  15. // 輸出: 
  16. // [] 
  17. // 0 

兩個框架也都沒有問題,完美解析。

范型處理

解析泛型是一個非常常用的功能,我們項目中大部分fastjson代碼就是在解析json和Java Bean。

 

  1. // 實體類 
  2. User user = new User(); 
  3. user.setId(1L); 
  4. user.setUserName("馬云"); 
  5.  
  6. // fastjson 
  7. List<User> userListResultFastjson = JSONArray.parseArray(JSON.toJSONString(userList), User.class); 
  8. List<User> userListResultFastjson2 = JSON.parseObject(JSON.toJSONString(userList), new TypeReference<List<User>>(){}); 
  9. System.out.println(userListResultFastjson); 
  10. System.out.println("userListResultFastjson2" + userListResultFastjson2); 
  11. // 輸出: 
  12. // userListResultFastjson[User [Hash = 483422889, id=1, userName=馬云], null
  13. // userListResultFastjson2[User [Hash = 488970385, id=1, userName=馬云], null
  14.  
  15. // Gson 
  16. List<User> userListResultTrue = gson.fromJson(gson.toJson(userList), new TypeToken<List<User>>(){}.getType()); 
  17. System.out.println("userListResultGson" + userListResultGson); 
  18. // 輸出: 
  19. // userListResultGson[User [Hash = 1435804085, id=1, userName=馬云], null

可以看出,Gson也能支持泛型。

List/Map寫入

這一點fastjson和Gson有區別,Gson不支持直接將List寫入value,而fastjson支持。

所以Gson只能將List解析后,寫入value中,詳見如下代碼:

 

  1. // 實體類 
  2. User user = new User(); 
  3. user.setId(1L); 
  4. user.setUserName("馬云"); 
  5.  
  6. // fastjson 
  7. JSONObject jsonObject1 = new JSONObject(); 
  8. jsonObject1.put("user"user); 
  9. jsonObject1.put("userList", userList); 
  10. System.out.println(jsonObject1); 
  11. // 輸出: 
  12. // {"userList":[{"id":1,"userName":"馬云"},null],"user":{"id":1,"userName":"馬云"}} 
  13.  
  14. // Gson 
  15. JsonObject jsonObject = new JsonObject(); 
  16. jsonObject.add("user", gson.toJsonTree(user)); 
  17. System.out.println(jsonObject); 
  18. // 輸出: 
  19. // {"user":{"id":1,"userName":"馬云"},"userList":[{"id":1,"userName":"馬云"},null]} 

如此一來,Gson看起來就沒有fastjson方便,因為放入List是以gson.toJsonTree(user)的形式放入的。這樣就不能先入對象,在后面修改該對象了。(有些同學比較習慣先放入對象,再修改對象,這樣的代碼就得改動)

駝峰與下劃線轉換

駝峰轉換下劃線依靠的是修改Gson的序列化模式,修改為LOWER_CASE_WITH_UNDERSCORES

 

  1. GsonBuilder gsonBuilder = new GsonBuilder(); 
  2. gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES); 
  3. Gson gsonUnderScore = gsonBuilder.create(); 
  4. System.out.println(gsonUnderScore.toJson(user)); 
  5. // 輸出: 
  6. // {"id":1,"user_name":"馬云"

常見問題排雷

下面整理了我們在公司項目遷移Gson過程中,踩過的坑,這些坑現在寫起來感覺沒什么技術含量。但是這才是我寫這篇文章的初衷,幫助大家把這些很難發現的坑避開。

這些問題有的是在測試進行回歸測試的時候發現的,有的是在自測的時候發現的,有的是在上線后發現的,比如Swagger掛了這種不會去測到的問題。

Date序列化方式不同

不知道大家想過一個問題沒有,如果你的項目里有緩存系統,使用fastjson寫入的緩存,在你切換Gson后,需要用Gson解析出來。所以就一定要保證兩個框架解析邏輯是相同的,但是,顯然這個愿望是美好的。

在測試過程中,發現了Date類型,在兩個框架里解析是不同的方式。

  • fastjson:Date直接解析為Unix
  • Gson:直接序列化為標準格式Date

 

別了,阿里巴巴fastjson!企業項目遷移Gson全攻略

導致了Gson在反序列化這個json的時候,直接報錯,無法轉換為Date。

解決方案:

新建一個專門用于解析Date類型的類:

 

  1. import com.google.gson.TypeAdapter; 
  2. import com.google.gson.stream.JsonReader; 
  3. import com.google.gson.stream.JsonWriter; 
  4.  
  5. import java.io.IOException; 
  6. import java.util.Date
  7.  
  8. public class MyDateTypeAdapter extends TypeAdapter<Date> { 
  9.     @Override 
  10.     public void write(JsonWriter outDate value) throws IOException { 
  11.         if (value == null) { 
  12.             out.nullValue(); 
  13.         } else { 
  14.             out.value(value.getTime()); 
  15.         } 
  16.     } 
  17.  
  18.     @Override 
  19.     public Date read(JsonReader in) throws IOException { 
  20.         if (in != null) { 
  21.             return new Date(in.nextLong()); 
  22.         } else { 
  23.             return null
  24.         } 
  25.     } 

接著,在創建Gson時,把他放入作為Date的專用處理類:

  1. Gson gson = new GsonBuilder().registerTypeAdapter(Date.class,new MyDateTypeAdapter()).create(); 

這樣就可以讓Gson將Date處理為Unix。

當然,這只是為了兼容老的緩存,如果你覺得你的倉庫沒有這方面的顧慮,可以忽略這個問題。

SpringBoot異常

切換到Gson后,使用SpringBoot搭建的Web項目的接口直接請求不了了。報錯類似:

  1. org.springframework.http.converter.HttpMessageNotWritableException 

因為SpringBoot默認的Mapper是Jackson解析,我們切換為了Gson作為返回對象后,Jackson解析不了了。

解決方案:

application.properties里面添加:

 

  1. #Preferred JSON mapper to use for HTTP message conversion 
  2. spring.mvc.converters.preferred-json-mapper=gson 

Swagger異常

這個問題和上面的SpringBoot異常類似,是因為在SpringBoot中引入了Gson,導致 swagger 無法解析 json。

 

別了,阿里巴巴fastjson!企業項目遷移Gson全攻略

采用類似下文的解決方案(添加Gson適配器):

  • http://yuyublog.top/2018/09/03/springboot%E5%BC%95%E5%85%A5swagger/

GsonSwaggerConfig.java

 

  1. @Configuration 
  2. public class GsonSwaggerConfig { 
  3.     //設置swagger支持gson 
  4.     @Bean 
  5.     public IGsonHttpMessageConverter IGsonHttpMessageConverter() { 
  6.         return new IGsonHttpMessageConverter(); 
  7.     } 

IGsonHttpMessageConverter.java

 

  1. public class IGsonHttpMessageConverter extends GsonHttpMessageConverter { 
  2.     public IGsonHttpMessageConverter() { 
  3.         //自定義Gson適配器 
  4.         super.setGson(new GsonBuilder() 
  5.                 .registerTypeAdapter(Json.class, new SpringfoxJsonToGsonAdapter()) 
  6.                 .serializeNulls()//空值也參與序列化 
  7.                 .create()); 
  8.     } 

SpringfoxJsonToGsonAdapter.java

 

  1. public class SpringfoxJsonToGsonAdapter implements JsonSerializer<Json> { 
  2.     @Override 
  3.     public JsonElement serialize(Json json, Type type, JsonSerializationContext jsonSerializationContext) { 
  4.         return new JsonParser().parse(json.value()); 
  5.     } 

@Mapping JsonObject作為入參異常

有時候,我們會在入參使用類似:

  1. public ResponseResult submitAudit(@RequestBody JsonObject jsonObject) {} 

如果使用這種代碼,其實就是使用Gson來解析json字符串。但是這種寫法的風險是很高的,平常請大家盡量避免使用JsonObject直接接受參數。

在Gson中,JsonObject若是有數字字段,會統一序列化為double,也就是會把count = 0這種序列化成count = 0.0。

為何會有這種情況?簡單的來說就是Gson在將json解析為Object類型時,會默認將數字類型使用double轉換。

  • 如果Json對應的是Object類型,最終會解析為Map類型;其中Object類型跟Json中具體的值有關,比如雙引號的""值翻譯為STRING。我們可以看下數值類型(NUMBER)全部轉換為了Double類型,所以就有了我們之前的問題,整型數據被翻譯為了Double類型,比如30變為了30.0。

可以看下Gson的ObjectTypeAdaptor類,它繼承了Gson的TypeAdaptor抽象類:

 

別了,阿里巴巴fastjson!企業項目遷移Gson全攻略

解決方案:

  • 第一個方案:把入參用實體類接收,不要使用JsonObject
  • 第二個方案:與上面的解決Date類型問題類似,自己定義一個Adaptor,來接受數字,并且處理。這種想法我覺得可行但是難度較大,可能會影響到別的類型的解析,需要在設計適配器的時候格外注意。

總結

這篇文章主要是為了那些需要將項目遷移到Gson框架的同學們準備的。

一般來說,個人小項目,是不需要費這么大精力去做遷移,所以這篇文章可能目標人群比較狹窄。

但文章中也提到了不少通用問題的解決思路,比如怎么評估遷移框架的必要性。其中需要考慮到框架兼容性,兩者性能差異,遷移耗費的工時等很多問題。

希望文章對你有所幫助。

責任編輯:未麗燕 來源: 今日頭條
相關推薦

2016-11-08 16:16:25

數據收集框架日志日志收集

2010-11-18 23:24:42

云遷移

2023-12-18 09:32:08

ES集群遷移上云oss插件

2010-06-28 10:43:47

2010-04-23 14:04:23

Oracle日期操作

2024-05-07 09:01:21

Queue 模塊Python線程安全隊列

2013-04-15 10:48:16

Xcode ARC詳解iOS ARC使用

2013-06-08 11:13:00

Android開發XML解析

2021-01-13 09:34:45

項目Gson框架

2018-12-14 11:00:18

2024-09-09 16:29:29

2013-08-22 09:41:52

阿里巴巴去IOE王堅

2011-01-11 14:30:29

企業內網開發環境

2009-02-20 11:43:22

UNIXfish全攻略

2009-12-14 14:32:38

動態路由配置

2009-10-19 15:20:01

家庭綜合布線

2014-03-19 17:22:33

2012-02-15 13:30:48

Linux系統安全企業安全

2009-02-27 10:46:32

DBA筆試題阿里巴巴

2023-03-29 09:42:32

點贊
收藏

51CTO技術棧公眾號

videos性欧美另类高清| 高h放荡受浪受bl| 成人情趣视频网站| 91麻豆精品久久久久蜜臀| 成人免费看片视频在线观看| 日本人妻丰满熟妇久久久久久| 天堂成人国产精品一区| 伦理中文字幕亚洲| 一级黄色片大全| 9999精品视频| 日本久久一区二区| 日韩视频 中文字幕| 三级做a全过程在线观看| 六月婷婷色综合| 91精品国产99| 永久看片925tv| 欧美老女人另类| 亚洲精品一区二区三区精华液 | 欧美日韩一区二区三| 国产精品视频无码| 欧美综合国产| 欧美精品video| 亚洲熟女毛茸茸| 一本久久青青| 欧美精品一区二区三区高清aⅴ | 91麻豆文化传媒在线观看| 成人a在线视频| 日韩在线视频不卡| 国产综合欧美| 欧美成人精品h版在线观看| 久久国产柳州莫菁门| 粉嫩久久久久久久极品| 日韩一区二区麻豆国产| 亚洲77777| 香蕉成人av| 激情亚洲一区二区三区四区 | 国产精品av久久久久久无| 国产精品zjzjzj在线观看| 欧美一区二区三区视频免费播放| 黄色三级视频在线| 88xx成人永久免费观看| 欧美视频裸体精品| 国产乱子伦农村叉叉叉| 性欧美ⅴideo另类hd| 日韩理论片在线| 在线观看日本一区| 777电影在线观看| 欧美国产激情二区三区| 清纯唯美一区二区三区| 欧美孕妇孕交xxⅹ孕妇交| 成人免费不卡视频| 国产成人精品免费视频大全最热| 国产黄色一区二区| 国产91精品一区二区麻豆亚洲| 亚洲xxxx在线| www.香蕉视频| 国产aⅴ综合色| 国产伦精品一区二区三区照片| 亚洲国产999| 成人一级片网址| 国内精品一区二区| 视频一区二区三区在线看免费看 | 极品尤物一区二区三区| 色网站免费观看| 95精品视频在线| 美脚丝袜一区二区三区在线观看| 爽爽视频在线观看| 中文字幕av一区二区三区免费看| 一本久久a久久精品vr综合 | 亚洲三级视频在线观看| 中文字幕色呦呦| 高清电影在线观看免费| 天天综合天天综合色| 免费黄色日本网站| jvid一区二区三区| 日韩一区二区三区三四区视频在线观看 | 人妻丰满熟妇aⅴ无码| 欧美性生活一级片| 国产亚洲美女精品久久久| 人妻视频一区二区| 99久久夜色精品国产亚洲1000部| 九九久久久久99精品| 国产午夜免费视频| 性欧美videos另类喷潮| 国产男人精品视频| 丁香六月天婷婷| 国产三级精品视频| 青青草综合视频| 国模冰冰炮一区二区| 欧美高清www午色夜在线视频| avtt中文字幕| 精品美女在线视频| 欧美日本国产在线| 一级黄色av片| 福利一区二区在线| 特级西西444www大精品视频| 色帝国亚洲欧美在线| 一本一道综合狠狠老| 午夜xxxxx| 竹菊久久久久久久| 久99久在线视频| 中文字幕在线观看国产| 成人18视频在线播放| 一个色的综合| 中文字幕在线官网| 678五月天丁香亚洲综合网| 91视频在线免费| 久久人体视频| 午夜剧场成人观在线视频免费观看| 成人免费一级片| 成人午夜看片网址| 亚洲不卡中文字幕| 精品日韩av| 欧美精品日韩精品| 欧美人与性囗牲恔配| 影音国产精品| 亚洲综合一区二区不卡| 懂色一区二区三区| 欧美日韩在线免费观看| 制服.丝袜.亚洲.中文.综合懂| 久久国产成人精品| 日韩免费av在线| 日本免费不卡视频| 亚洲一区二区三区三| 亚洲男人天堂av在线| 奇米狠狠一区二区三区| 午夜精品久久久久久久男人的天堂| 国产免费的av| 国产精品国产三级国产| 日本999视频| 四虎5151久久欧美毛片| 欧美激情中文字幕乱码免费| 国产精品一二三四五区| 国产精品午夜在线观看| 国产h视频在线播放| 亚洲精品a区| 成人97在线观看视频| 亚洲中文字幕在线观看| 国产精品视频观看| 亚洲色图 在线视频| 国产一区二区三区四区五区 | 国产a亚洲精品| 亚洲人成亚洲人成在线观看| 中日韩黄色大片| 99久久精品免费看国产免费软件| 永久免费网站视频在线观看| 亚洲最大的免费视频网站| 宅男66日本亚洲欧美视频| 国产无遮挡又黄又爽又色视频| 国产欧美日韩三级| 精品日韩久久久| 日韩极品一区| 91久久久久久久久久| av中文字幕在线观看| 91精品婷婷国产综合久久性色 | 亚洲精品乱码久久久久久蜜桃麻豆| 91久久爱成人| 成人av影院在线观看| 亚洲精品久久7777777| 日韩视频在线观看一区| 久久精品欧美一区二区三区不卡| www.超碰com| 欧美大黑bbbbbbbbb在线| 91在线无精精品一区二区| 中文在线免费| 日韩电影在线观看永久视频免费网站| 日韩网红少妇无码视频香港| 久久夜色精品国产噜噜av| 人妻丰满熟妇av无码区app| jlzzjlzz亚洲女人| 亚洲一区中文字幕在线观看| 欧美一卡二卡| 精品中文视频在线| 在线免费观看视频网站| 亚洲综合久久久久| 亚洲激情视频小说| 久久99精品一区二区三区| av动漫在线免费观看| 婷婷国产精品| 成人精品aaaa网站| av在线小说| 中文字幕日韩在线观看| 国产ts人妖调教重口男| 天天综合网天天综合色| 91动漫免费网站| 成人免费视频一区| 美女网站色免费| 亚洲国产第一| 小说区图片区图片区另类灬| 精品伊人久久| 国产91色在线|| 2021国产在线| 国产午夜精品视频| 亚洲av无码国产综合专区| 欧美日韩美女在线观看| 国产真实乱在线更新| 91在线你懂得| 999热精品视频| 日韩福利视频网| av日韩在线看| 成人在线免费观看视频| wwwxx欧美| 美女视频一区| 69av视频在线播放| a级片国产精品自在拍在线播放| 国产视频精品免费播放| 国产肥老妇视频| 欧美日韩一区视频| 国产精品免费av一区二区| 亚洲欧洲av一区二区三区久久| 91黄色免费视频| 国产乱码精品一区二区三区忘忧草| 大肉大捧一进一出好爽动态图| 亚洲色图88| 亚洲精品中文字幕乱码三区不卡| 久久夜色电影| 99在线国产| 国产精品一区二区三区av | 午夜视频网站在线观看| 一区二区日韩av| 91久久久久久久久久久久久久| 久久综合九色欧美综合狠狠 | 欧美国产日产图区| 波多野结衣av在线免费观看| 成人夜色视频网站在线观看| 激情文学亚洲色图| 麻豆精品一区二区综合av| 狠狠操精品视频| 美女诱惑黄网站一区| 日本丰满少妇xxxx| 韩国亚洲精品| 国产 欧美 日本| 1024精品久久久久久久久| 亚洲成人在线视频网站| 成人影视亚洲图片在线| 亚洲电影网站| 三上亚洲一区二区| 亚洲欧洲日夜超级视频| 日韩免费av| 亚洲一区二区三区四区中文| 精品色999| 日韩亚洲视频| 日韩av二区| 在线看视频不卡| 亚洲一区二区三区| 亚洲第一综合网站| 欧美激情 亚洲a∨综合| 久久久久久久久影视| 最新国产精品| 欧美日韩不卡在线视频| 亚洲高清电影| 国内自拍在线观看| 久久激情婷婷| 黑人粗进入欧美aaaaa| 人人精品人人爱| 免费成年人高清视频| 国产一区二区在线影院| 制服下的诱惑暮生| 成人白浆超碰人人人人| 国产又爽又黄无码无遮挡在线观看| 久久久亚洲欧洲日产国码αv| 男女做爰猛烈刺激| 国产精品情趣视频| 欧产日产国产v| 亚洲成人激情自拍| 蜜臀精品一区二区三区| 欧美日产在线观看| 丰满人妻一区二区三区无码av| 亚洲激情中文字幕| 久久手机免费观看| 久久久黄色av| heyzo在线播放| 国产97色在线|日韩| 日本在线一区二区| 国产精品国模大尺度私拍| 日韩理论电影中文字幕| 日韩尤物视频| 欧美91大片| 成人av一级片| 九一九一国产精品| 中文字幕一区二区人妻电影丶| 国产喂奶挤奶一区二区三区| 国产精品丝袜一区二区| 无吗不卡中文字幕| 在线观看日韩一区二区| 精品国产免费一区二区三区香蕉 | 国内精品免费| 午夜一区二区三区| 在线观看视频日韩| 91极品尤物在线播放国产| 丁香一区二区三区| 自拍偷拍你懂的| 亚洲成a天堂v人片| 一区二区三区www污污污网站| 亚洲а∨天堂久久精品9966| 国产理论电影在线观看| 欧美福利视频在线| 久久亚洲资源中文字| 久久久久久久久一区| 91精品综合| 好男人www社区| 成人黄色av电影| 日本爱爱小视频| 色婷婷综合在线| 亚洲精品一区二区三区新线路 | 91网址在线观看| 国产成人jvid在线播放| 高清精品视频| www.午夜色| 三级久久三级久久| 美女黄色一级视频| 亚洲男帅同性gay1069| 一二三区免费视频| 亚洲精品电影在线| 欧洲中文在线| 91久久精品一区二区别| 日韩在线二区| 999精品网站| 久久久噜噜噜久久中文字幕色伊伊| 久久久久久久国产视频| 69精品人人人人| 麻豆影院在线观看| 国产精品中文在线| 国产亚洲第一伦理第一区| 亚洲熟妇国产熟妇肥婆| 懂色av一区二区三区蜜臀| 国产黄色的视频| 8x8x8国产精品| 欧美成人高清在线| 国产日韩精品综合网站| 成人影视亚洲图片在线| 自拍偷拍 国产| 国产日韩欧美亚洲| 免费黄色一级大片| 在线不卡国产精品| 欧美日韩精品免费观看视欧美高清免费大片| 国产乱码精品一区二区三区卡| 激情av一区| 男男一级淫片免费播放| 亚洲成人激情av| 四虎精品在永久在线观看 | 欧美男人亚洲天堂| 亚洲欧美日韩成人| 深夜成人福利| 亚洲激情啪啪| 另类人妖一区二区av| 国产小视频你懂的| 91精品国产乱码久久蜜臀| 主播国产精品| 国产精品夜夜夜一区二区三区尤| 伊人久久大香线蕉综合热线| 69亚洲乱人伦| 精品毛片三在线观看| 色视频在线看| 国产精品流白浆视频| 日韩激情图片| 欧美专区第二页| 亚洲高清视频中文字幕| 国产精品国产高清国产| 日本精品视频在线| 青青草成人影院| 一区二区久久精品| 一区二区免费看| 少妇性bbb搡bbb爽爽爽欧美| 青青草原成人在线视频| 久久社区一区| 国内精品免费视频| 色综合色综合色综合| av成人手机在线| 亚洲影院污污.| 亚洲精品色图| 日韩黄色中文字幕| 日韩一区二区免费视频| 中文在线中文资源| 一区二区三区四区不卡| 成人污污视频在线观看| 国产视频1区2区| 久久夜色精品国产欧美乱| 国产在线播放精品| 美女少妇一区二区| 亚洲成人一二三| www在线播放| 国产精品青青草| 蜜芽一区二区三区| 久久久香蕉视频| 国产午夜精品一区理论片飘花| 精品国产伦一区二区三区观看说明| 91精品国产91久久久久麻豆 主演| 久久九九影视网| 国产精品久久久久久无人区| 国内外成人免费激情在线视频| 欧美日韩一二三四| 人妻 丝袜美腿 中文字幕| 欧美色视频在线| а√天堂中文在线资源8| 在线不卡日本| 久久久www成人免费无遮挡大片| 国产乱淫片视频| 国产精品成人aaaaa网站| 欧美日韩一区二区国产|