日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满av-国产精品中文字幕免费观看-亚洲成人久久一区二区三区-国内少妇偷人精品视频无缓冲-一区二区国产精品日本一区二区三区在线网

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

前后端JSON交互實(shí)戰(zhàn):從序列化配置到線上排查全指南

前后端JSON交互實(shí)戰(zhàn):從序列化配置到線上排查全指南 很長(zhǎng)一段時(shí)間里我前后端分離的項(xiàng)目一多就發(fā)現(xiàn)一個(gè)特別有意思的現(xiàn)象兩邊同事明明都覺(jué)得自己沒(méi)寫(xiě)錯(cuò)接口一聯(lián)調(diào)就開(kāi)始扯皮。前端說(shuō)后端接口返回的JSON字段對(duì)不上后端說(shuō)前端傳的JSON格式我解析不了。這類問(wèn)題聽(tīng)上去是小事可一旦進(jìn)入線上輕則功能白屏重則數(shù)據(jù)錯(cuò)亂。所以后來(lái)我專門把JSON交互處理這套東西整理成了一套筆記這次干脆把筆記改寫(xiě)成一篇可以直接拿去參考的實(shí)操文章。這篇文章圍繞的就是一件事前后端之間、服務(wù)與服務(wù)之間的JSON數(shù)據(jù)到底怎么做到“發(fā)得出去、收得回來(lái)、兩邊都看得懂”。我會(huì)從JSON的本質(zhì)、Java里的JSON處理庫(kù)選型、Spring Boot中JSON交互的落地配置一直聊到自定義序列化器和線上排查手段。內(nèi)容不算難但信息量不小適合剛接觸接口開(kāi)發(fā)的初學(xué)者也適合被JSON解析問(wèn)題折磨過(guò)、想系統(tǒng)梳理一遍的后端開(kāi)發(fā)。1. 從一次前后端聯(lián)調(diào)事故說(shuō)起JSON交互到底卡在哪1.1 前后端各說(shuō)各話的典型現(xiàn)場(chǎng)我印象很深的一次事故發(fā)生在某電商促銷項(xiàng)目聯(lián)調(diào)階段。后端寫(xiě)了一個(gè)商品詳情的接口返回的是這樣的結(jié)構(gòu){ code: 200, data: { goodsId: 12345, goodsName: 某品牌保溫杯, createTime: 1719820800000 }, msg: success }結(jié)果前端拿著這個(gè)JSON直接懵了我要的商品名是goodsName你給我的字段倒是這個(gè)可createTime為什么是一串?dāng)?shù)字我們頁(yè)面上要顯示“2024-07-01 12:00:00”這串毫秒時(shí)間戳我怎么展示后端同事也很委屈數(shù)據(jù)庫(kù)存的本來(lái)就是datetime我用接口工具測(cè)的時(shí)候看到的也是正常時(shí)間啊怎么一傳到前端就變成數(shù)字了這個(gè)場(chǎng)景各位寫(xiě)過(guò)前后端分離項(xiàng)目的朋友應(yīng)該都不陌生。問(wèn)題根本不在“誰(shuí)對(duì)誰(shuí)錯(cuò)”而是兩邊的數(shù)據(jù)契約沒(méi)有對(duì)齊。后端返回的是Java對(duì)象序列化之后的JSON前端看到的是JSON解析之后的對(duì)象中間經(jīng)過(guò)序列化和反序列化這兩道工序只要有一道工序的配置不一致看到的東西就不一樣。1.2 JSON交互的本質(zhì)一份兩端共同遵守的協(xié)議我把JSON交互拆成三個(gè)關(guān)鍵詞結(jié)構(gòu)約定、序列化規(guī)則、解析規(guī)則。結(jié)構(gòu)約定是雙方對(duì)字段名、嵌套層級(jí)、數(shù)據(jù)類型達(dá)成的一致意見(jiàn)序列化規(guī)則是后端把Java對(duì)象變成JSON字符串時(shí)如何轉(zhuǎn)換類型和格式解析規(guī)則是前端或下游服務(wù)拿到JSON字符串后如何還原成自己需要的對(duì)象。三者缺一個(gè)交互就會(huì)出現(xiàn)偏差。舉個(gè)最直觀的說(shuō)法JSON交互就像兩個(gè)人約定用同一種語(yǔ)言寫(xiě)信。約定用中文是結(jié)構(gòu)約定按語(yǔ)法把想法寫(xiě)成句子是序列化對(duì)方讀到句子后理解意思是解析。如果寫(xiě)信的人用中文但收信的人以為信里全是英文或者寫(xiě)信人把日期寫(xiě)成“7月1日”收信人卻當(dāng)成“1月7日”信息就悄悄變了。所以我在項(xiàng)目里定了一個(gè)規(guī)矩任何接口在動(dòng)工前先寫(xiě)一份字段對(duì)照表。字段叫什么名、什么類型、空值怎么處理、時(shí)間用什么格式、嵌套多深全部寫(xiě)清楚。這個(gè)習(xí)慣看起來(lái)麻煩卻能省掉后面大量“我這邊對(duì)你那邊錯(cuò)”的爭(zhēng)論。1.3 交互處理的最小鏈路拆解一次完整的JSON交互鏈路大概是這樣的后端收到HTTP請(qǐng)求取出請(qǐng)求體里的JSON字符串交給反序列化器轉(zhuǎn)成Java對(duì)象然后業(yè)務(wù)邏輯處理再把返回結(jié)果交給序列化器轉(zhuǎn)成JSON字符串最后寫(xiě)進(jìn)HTTP響應(yīng)。前端拿到響應(yīng)后再做一次JSON解析。用代碼表達(dá)就是// 請(qǐng)求側(cè)字符串 - Java對(duì)象 String requestJson ...; ObjectMapper mapper new ObjectMapper(); GoodsQuery query mapper.readValue(requestJson, GoodsQuery.class); // 響應(yīng)側(cè)Java對(duì)象 - 字符串 GoodsDetail detail goodsService.queryDetail(query); String responseJson mapper.writeValueAsString(detail);看起來(lái)只有兩行核心代碼但里面藏著大量細(xì)節(jié)日期類型轉(zhuǎn)成什么格式、枚舉轉(zhuǎn)成字符串還是序號(hào)、數(shù)組空的時(shí)候是輸出[]還是null、下劃線命名的字段和駝峰命名的字段怎么映射、對(duì)象里有循環(huán)引用怎么辦……每一個(gè)細(xì)節(jié)都可能成為線上事故的導(dǎo)火索。2. 別說(shuō)“不就轉(zhuǎn)一下JSON嘛”數(shù)據(jù)形態(tài)轉(zhuǎn)換里的隱性細(xì)節(jié)2.1 三種數(shù)據(jù)形態(tài)閱讀態(tài)、內(nèi)存態(tài)、傳輸態(tài)我經(jīng)常跟新人強(qiáng)調(diào)一個(gè)概念JSON在整套交互流程里并不是同一個(gè)東西。它可以分成三種形態(tài)來(lái)看。第一種是閱讀態(tài)也就是你在接口文檔、網(wǎng)頁(yè)格式化工具里看到的那個(gè)文本帶縮進(jìn)、帶引號(hào)人能直接看懂。第二種是內(nèi)存態(tài)比如Java里那個(gè)帶著屬性、類型、嵌套關(guān)系的對(duì)象它活在JVM堆里。第三種是傳輸態(tài)就是HTTP請(qǐng)求體或響應(yīng)體里實(shí)際的字節(jié)流可能是被壓縮過(guò)的、被轉(zhuǎn)義過(guò)的、按某種編碼傳輸?shù)?。很多解析?wèn)題本質(zhì)上就是這三種狀態(tài)之間轉(zhuǎn)換時(shí)出了問(wèn)題。比如后端把對(duì)象轉(zhuǎn)成字符串時(shí)沒(méi)配置日期格式內(nèi)存態(tài)里好好的LocalDateTime到傳輸態(tài)就變成了時(shí)間戳再比如前端給后端傳JSON中間經(jīng)過(guò)網(wǎng)關(guān)時(shí)被重新編碼中文字符出現(xiàn)亂碼那就是傳輸態(tài)這里出了問(wèn)題。認(rèn)清這三種形態(tài)之后排查問(wèn)題會(huì)有一個(gè)很清晰的方向先看問(wèn)題是出在序列化、傳輸還是反序列化。不要一上來(lái)就懷疑代碼邏輯寫(xiě)錯(cuò)了。2.2 String轉(zhuǎn)對(duì)象和對(duì)象轉(zhuǎn)String遠(yuǎn)不是new一個(gè)ObjectMapper很多新手覺(jué)得JSON轉(zhuǎn)換不就是new ObjectMapper()然后調(diào)用兩個(gè)方法嗎表面上沒(méi)錯(cuò)但一旦牽扯到復(fù)雜類型事情就沒(méi)那么簡(jiǎn)單。舉個(gè)例子前端傳過(guò)來(lái)一個(gè)JSON數(shù)組[ {userId: 1, userName: A同學(xué)}, {userId: 2, userName: B同學(xué)} ]后端如果直接寫(xiě)ListUser userList mapper.readValue(json, List.class);這段代碼能跑但運(yùn)行到userList.get(0).getUserName()的時(shí)候大概率會(huì)報(bào)ClassCastException。原因很簡(jiǎn)單List.class只能告訴反序列化器“目標(biāo)是List”卻沒(méi)法告訴它“List里裝的是User”。泛型信息在運(yùn)行時(shí)被擦除了Jackson拿到的只是一個(gè)泛型List它只能按LinkedHashMap來(lái)解析。正確寫(xiě)法是用TypeReference把泛型帶進(jìn)去ListUser userList mapper.readValue(json, new TypeReferenceListUser() {});這個(gè)坑幾乎所有寫(xiě)過(guò)Java接口的人都踩過(guò)。我當(dāng)時(shí)給新人講的時(shí)候打了個(gè)比方你要快遞員送一箱蘋(píng)果光說(shuō)“送一箱”是不夠的得說(shuō)清楚箱子里是什么。List.class就是那個(gè)沒(méi)說(shuō)清楚的“一箱”而new TypeReferenceListUser() {}就是“一箱蘋(píng)果”。2.3 為什么空值、特殊字符在轉(zhuǎn)換中最容易出問(wèn)題序列化和反序列化里最容易出問(wèn)題的不是常規(guī)數(shù)據(jù)而是邊界數(shù)據(jù)。空值就是典型。后端有一個(gè)對(duì)象某個(gè)字段是null默認(rèn)序列化之后這個(gè)字段可能直接消失也可能輸出null取決于全局配置。前端如果寫(xiě)死了要取這個(gè)字段拿到的卻是undefined頁(yè)面上可能就渲染異常。特殊字符是另一個(gè)重災(zāi)區(qū)。JSON字符串里如果包含換行符、引號(hào)、反斜杠序列化時(shí)必須正確轉(zhuǎn)義否則生成的JSON就是非法JSON前端一解析就報(bào)錯(cuò)。更隱蔽的是那些不可見(jiàn)字符比如某些業(yè)務(wù)系統(tǒng)從別的地方復(fù)制過(guò)來(lái)的文本里帶了特殊空白符肉眼完全看不出來(lái)但JSON解析器對(duì)某些字符的處理邏輯并不一致同一個(gè)字符串在A庫(kù)解析成功在B庫(kù)解析失敗。我對(duì)這個(gè)問(wèn)題的處理思路很樸素在所有對(duì)外接口的序列化配置里把空值處理策略顯式地定好要么統(tǒng)一輸出null要么統(tǒng)一忽略同時(shí)在接口測(cè)試階段就覆蓋“字符串帶引號(hào)、帶換行、帶emoji”這類用例別等上線了再由用戶幫我們發(fā)現(xiàn)。3. 三個(gè)主流JSON庫(kù)的取舍選型不該只看百度搜到哪篇3.1 三庫(kù)差異對(duì)照我實(shí)際用下來(lái)的感受Java生態(tài)里處理JSON的庫(kù)翻來(lái)覆去就那么幾個(gè)Spring Boot默認(rèn)自帶的Jackson、國(guó)內(nèi)用得多的Fastjson、老牌的Gson。網(wǎng)上關(guān)于它們誰(shuí)快的文章一抓一大把但真正到項(xiàng)目選型時(shí)我更看重的是穩(wěn)定性和可控性。先說(shuō)我自己的使用感受。Jackson是Spring Boot的默認(rèn)選擇這意味著在Spring項(xiàng)目里引入它幾乎零成本而且Spring Boot的自動(dòng)配置已經(jīng)幫你把序列化器接好了注解支持也最豐富。Gson是Google出品的API設(shè)計(jì)很簡(jiǎn)潔new Gson().toJson(obj)和fromJson兩個(gè)方法搞定大部分場(chǎng)景但功能深度不如Jackson。Fastjson最大的特點(diǎn)是序列化性能在某些場(chǎng)景下確實(shí)快API寫(xiě)起來(lái)也很順手但歷史上暴露過(guò)的安全漏洞讓我在核心鏈路上不太敢用它。我做過(guò)的幾個(gè)老項(xiàng)目里這三種庫(kù)都出現(xiàn)過(guò)。有些項(xiàng)目因?yàn)闅v史原因從Fastjson切到過(guò)Jackson單純是因?yàn)橥ㄓ眯愿?、社區(qū)維護(hù)頻率更高。Gson我一般只用在一些自己寫(xiě)的小工具里圖它輕便。3.2 性能不是唯一標(biāo)準(zhǔn)安全性和可控性更關(guān)鍵如果你去搜“Fastjson為什么快”會(huì)看到一堆壓測(cè)數(shù)據(jù)確實(shí)在某些場(chǎng)景下它的表現(xiàn)不錯(cuò)。但我選JSON庫(kù)從來(lái)不把性能當(dāng)成第一指標(biāo)因?yàn)閷?duì)于絕大多數(shù)業(yè)務(wù)系統(tǒng)來(lái)說(shuō)JSON序列化根本不在性能瓶頸上真正耗時(shí)的是數(shù)據(jù)庫(kù)查詢和遠(yuǎn)程調(diào)用。我更在意的是三點(diǎn)。第一是否支持自定義序列化器和反序列化器因?yàn)闃I(yè)務(wù)里總有一些特殊字段需要特殊處理比如脫敏。第二對(duì)未知字段、循環(huán)引用、深層嵌套這類極端情況的默認(rèn)行為是否可控能不能通過(guò)配置兜住。第三框架自動(dòng)配置的深度換句話說(shuō)就是我是不是只寫(xiě)一個(gè)注解就能讓整個(gè)項(xiàng)目的JSON交互行為發(fā)生改變。拿Jackson舉例它支持JsonIgnore、JsonProperty、JsonFormat、JsonSerialize、JsonDeserialize幾乎覆蓋了我遇到過(guò)的所有需求。Gson也可以用TypeAdapter做到類似效果但寫(xiě)起來(lái)會(huì)繁瑣不少。3.3 一個(gè)項(xiàng)目究竟該怎么選我的選型建議是這樣的如果是Spring Boot新項(xiàng)目直接用Jackson沒(méi)必要額外引庫(kù)因?yàn)镴ackson已經(jīng)深度集成在Spring Boot的MVC里日期格式化、空值處理、字段命名策略都能通過(guò)配置文件統(tǒng)一管理如果是一個(gè)老項(xiàng)目想重構(gòu)且現(xiàn)有代碼大量使用了Fastjson的API也不要急著全換一步一步把高危鏈路先切到Jackson測(cè)試穩(wěn)定后再推進(jìn)如果只是寫(xiě)個(gè)腳本或者做本地小工具Gson完全夠用。這里有個(gè)特別容易踩的雷一個(gè)項(xiàng)目里同時(shí)引了多個(gè)JSON庫(kù)平時(shí)各用各的看起來(lái)相安無(wú)事等某一天工具類里混用了這兩個(gè)庫(kù)的注解和API序列化結(jié)果就會(huì)出現(xiàn)莫名其妙的差異。項(xiàng)目里最好統(tǒng)一一個(gè)主JSON庫(kù)工具類只封裝這一個(gè)庫(kù)的API別給自己留混用的機(jī)會(huì)。4. Spring Boot里JSON交互的落地姿勢(shì)與全局配置4.1 RequestBody和ResponseBody到底做了什么在Spring Boot的Web層JSON交互最核心的就是兩個(gè)注解RequestBody和ResponseBody。很多新手只是會(huì)用但并不完全清楚它們背后的機(jī)制。RequestBody作用在方法參數(shù)上告訴Spring把HTTP請(qǐng)求體里的JSON字符串反序列化成后面的Java對(duì)象。這個(gè)過(guò)程中Spring用的就是當(dāng)前容器里注冊(cè)的MappingJackson2HttpMessageConverter消息轉(zhuǎn)換器負(fù)責(zé)把請(qǐng)求體字符串轉(zhuǎn)成對(duì)象。ResponseBody作用在返回值上或者直接加在類上讓所有方法生效告訴Spring把Java對(duì)象序列化成JSON字符串寫(xiě)進(jìn)響應(yīng)體。用RestController就相當(dāng)于在類上同時(shí)加上了Controller和ResponseBody這也是現(xiàn)在最主流的寫(xiě)法。如果你遇到一個(gè)問(wèn)題后端寫(xiě)好的RequestBody User user前端傳了JSON過(guò)來(lái)但user對(duì)象里某些字段為null。不要急著懷疑前端先想想是不是前后端字段名沒(méi)對(duì)上。默認(rèn)情況下Jackson是把JSON字段名和Java屬性名做一一映射的前端傳的userName后端對(duì)象里屬性也是userName才能正確對(duì)應(yīng)。如果前端習(xí)慣傳下劃線風(fēng)格user_name后端就得加全局配置或者用JsonProperty(user_name)做映射。4.2 全局Jackson配置日期、空值、命名策略一網(wǎng)打盡全局配置的意義在于你不必在每個(gè)字段上都寫(xiě)注解只需要在配置文件里聲明一套默認(rèn)策略就能讓所有接口的JSON行為統(tǒng)一。我用Spring Boot時(shí)最常配置的幾項(xiàng)如下spring: jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT8 default-property-inclusion: non_null serialization: write-dates-as-timestamps: false deserialization: fail-on-unknown-properties: false第一行指定日期格式為yyyy-MM-dd HH:mm:ss第二行指定時(shí)區(qū)為東八區(qū)這一點(diǎn)特別重要因?yàn)槿绻愕姆?wù)器在別的時(shí)區(qū)不指定時(shí)區(qū)會(huì)導(dǎo)致日期序列化出來(lái)差8個(gè)小時(shí)第三行表示序列化時(shí)忽略值為null的字段第四行讓日期序列化時(shí)不輸出時(shí)間戳而是輸出格式化字符串第五行是反序列化時(shí)遇到未知字段不報(bào)錯(cuò)這對(duì)于前端多傳冗余字段的情況很友好。日期格式在這個(gè)配置里是全局生效的但業(yè)務(wù)里總有幾個(gè)接口需要用不同的日期格式這時(shí)候可以用JsonFormat在字段上覆蓋全局配置。記住一個(gè)原則全局定默認(rèn)局部做覆蓋注釋里說(shuō)清楚為什么覆蓋。4.3 統(tǒng)一響應(yīng)包裝把“成功/失敗”的反饋規(guī)則先定下來(lái)JSON交互里另一個(gè)被忽略但很重要的問(wèn)題就是響應(yīng)結(jié)構(gòu)不統(tǒng)一。有的接口成功時(shí)返回的是一個(gè)對(duì)象失敗時(shí)返回的是一個(gè)字符串或者成功和失敗字段的嵌套層級(jí)完全不同。前端對(duì)接起來(lái)就非常痛苦每個(gè)接口都要單獨(dú)寫(xiě)解析邏輯。我習(xí)慣在項(xiàng)目里做一個(gè)統(tǒng)一的響應(yīng)包裝類類似下面這樣public class ApiResultT { private Integer code; private String message; private T data; public static T ApiResultT success(T data) { ... } public static T ApiResultT error(Integer code, String message) { ... } }所有接口的返回值都包裝成ApiResultTcode表示業(yè)務(wù)狀態(tài)碼message是給前端展示的提示信息data是真正的業(yè)務(wù)數(shù)據(jù)。這樣前端只需要判斷code再?zèng)Q定取message還是data規(guī)則就固定下來(lái)了。統(tǒng)一包裝看起來(lái)是件小事但它在整個(gè)團(tuán)隊(duì)里建立的是一套交互契約。每次開(kāi)會(huì)討論接口時(shí)大家只需要關(guān)心data里是什么而不需要擔(dān)心外面那層殼今天會(huì)不會(huì)變。5. 實(shí)戰(zhàn)踩坑清單日期、循環(huán)引用、泛型丟失、中文亂碼5.1 日期格式不一致典型的“兩邊都對(duì)合不上”接著開(kāi)頭那個(gè)案例繼續(xù)說(shuō)。日期格式不一致是JSON交互里出現(xiàn)頻率最高的坑而且它的結(jié)構(gòu)非常一致后端認(rèn)為自己在序列化時(shí)輸出了格式化字符串前端看到的是時(shí)間戳或者前端給后端傳了一個(gè)2024-07-01 12:00:00后端反序列化時(shí)也按這個(gè)格式解析但由于時(shí)區(qū)不對(duì)入庫(kù)時(shí)間成了2024-06-30 04:00:00。排查日期問(wèn)題的順序我一般是先看序列化配置里有沒(méi)有指定格式和時(shí)區(qū)再看字段上有沒(méi)有被JsonFormat單獨(dú)覆蓋最后看傳輸過(guò)程中是否有中間層重新處理了日期字段。有一次我們排查了很久最后發(fā)現(xiàn)是網(wǎng)關(guān)層對(duì)響應(yīng)體做了字符串替換把時(shí)間格式里的斜杠替換成了橫杠結(jié)果后端看到的是橫杠格式的字符串再次序列化時(shí)格式全亂了。所以排查要覆蓋鏈路中的每一個(gè)節(jié)點(diǎn)不能只看服務(wù)端。5.2 循環(huán)引用和懶加載一序列化就整頁(yè)報(bào)錯(cuò)循環(huán)引用是后端對(duì)象序列化中最讓人頭疼的問(wèn)題。舉個(gè)常見(jiàn)的場(chǎng)景一個(gè)訂單對(duì)象里有用戶對(duì)象用戶對(duì)象里又有一個(gè)訂單列表序列化訂單時(shí)Jackson發(fā)現(xiàn)訂單里有用戶用戶又有訂單訂單里又有用戶……如果不做任何限制它就會(huì)無(wú)限嵌套下去最后棧溢出。解決循環(huán)引用有三個(gè)方向。第一個(gè)是業(yè)務(wù)上明確不需要閉環(huán)直接在某一端用JsonIgnore把不需要的字段忽略掉第二個(gè)是用JsonIdentityInfo讓相同對(duì)象在序列化時(shí)以ID引用而不是展開(kāi)完整對(duì)象第三個(gè)是從設(shè)計(jì)上避免雙向?qū)ο笾苯颖┞督o前端改用DTO數(shù)據(jù)傳輸對(duì)象只返回前端需要的那幾個(gè)字段。還有一個(gè)讓很多人踩過(guò)的坑是Hibernate的懶加載。一個(gè)實(shí)體類里有OneToMany的關(guān)系屬性沒(méi)被訪問(wèn)時(shí)它是一個(gè)代理對(duì)象直接序列化時(shí)會(huì)觸發(fā)LazyInitializationException。這種情況我一般也用DTO解決顯式地把需要的數(shù)據(jù)查出來(lái)再組裝成返回對(duì)象而不是試圖把JPA實(shí)體直接丟給序列化器。5.3 泛型與類型擦除List 接口返回前端拿不到全字段前面提到了TypeReference這里展開(kāi)講一個(gè)實(shí)際案例。有個(gè)接口返回ListUser實(shí)現(xiàn)時(shí)直接用了List.class作為反序列化目標(biāo)。結(jié)果前端拿到數(shù)據(jù)后發(fā)現(xiàn)user對(duì)象里混著一堆LinkedHashMap的結(jié)構(gòu)所有的字段都變成了map.get(xxx)的取值方式。前端說(shuō)接口文檔寫(xiě)得不對(duì)后端說(shuō)我返回的就是數(shù)組。兩邊都很委屈但根源只有一個(gè)反序列化時(shí)泛型信息丟失。Jackson在反序列化時(shí)如果無(wú)法得知目標(biāo)元素類型只會(huì)按照最通用的Map結(jié)構(gòu)處理。這個(gè)問(wèn)題不光影響List任何帶泛型的類型都會(huì)遇到比如MapString, User、PageResultUser處理方式都一樣要么用TypeReference要么在繼承類時(shí)把泛型固定下來(lái)比如定義一個(gè)UserList extends ArrayListUser這是個(gè)很偏門但有效的技巧。5.4 中文亂碼與特殊字符Tomcat配置和轉(zhuǎn)義策略中文亂碼在JSON交互里雖然不像以前那么常見(jiàn)但一旦出現(xiàn)就特別難排查因?yàn)樗皇呛蠖舜a的問(wèn)題而是整個(gè)鏈路的編碼不統(tǒng)一。HTTP請(qǐng)求和響應(yīng)都有各自的字符集如果服務(wù)端返回Content-Type: application/json;charsetUTF-8而中間某層把它改成了別的編碼中文就會(huì)變成亂碼。Spring Boot里可以這樣顯式地設(shè)置響應(yīng)編碼server: servlet: encoding: charset: UTF-8 enabled: true force: trueforce: true表示強(qiáng)制所有請(qǐng)求和響應(yīng)都使用UTF-8避免因?yàn)榭蛻舳藳](méi)帶編碼參數(shù)導(dǎo)致的亂碼。另外還要注意JSON字符串本身對(duì)控制字符是有限制的比如\u0000這類字符不能被直接放進(jìn)JSON字符串。如果業(yè)務(wù)數(shù)據(jù)里可能包含這類字符序列化時(shí)往往會(huì)被丟棄或轉(zhuǎn)義兩端看到的文本就不同。對(duì)于包含接口日志的數(shù)據(jù)我建議在寫(xiě)日志時(shí)把請(qǐng)求體和響應(yīng)體做一次JSON美化輸出同時(shí)打印轉(zhuǎn)義后的可見(jiàn)字符串這樣定位問(wèn)題才不會(huì)被特殊字符干擾。6. 自定義序列化器把敏感字段的“對(duì)外長(zhǎng)相”攥在自己手里6.1 什么場(chǎng)景值得寫(xiě)一個(gè)自定義序列化器全局配置解決的是通用問(wèn)題但業(yè)務(wù)里總有那么幾個(gè)字段不按常理出牌。最常見(jiàn)的場(chǎng)景就是數(shù)據(jù)脫敏。比如用戶手機(jī)號(hào)數(shù)據(jù)庫(kù)里存的是13812345678接口返回給前端時(shí)頁(yè)面可能只需要展示138****5678。這個(gè)需求如果用JsonIgnore把字段整個(gè)忽略掉前端就拿不到數(shù)據(jù)了如果讓前端自己截?cái)嗄堑扔诎衙撁暨壿媮G給了用戶也不合理。更合理的做法是數(shù)據(jù)庫(kù)存原始數(shù)據(jù)接口按場(chǎng)景決定“對(duì)外長(zhǎng)相”。后端默認(rèn)配置下敏感字段可以統(tǒng)一掛一個(gè)自定義序列化器序列化時(shí)自動(dòng)脫敏。這樣業(yè)務(wù)代碼里不需要寫(xiě)任何脫敏邏輯前端拿到手的就是已經(jīng)處理好的數(shù)據(jù)。6.2 手機(jī)號(hào)脫敏字段一個(gè)10行的自定義序列化器在Jackson里實(shí)現(xiàn)自定義序列化器很簡(jiǎn)單繼承JsonSerializerT重寫(xiě)serialize方法再用JsonSerialize注解掛到字段上。public class PhoneDesensitizeSerializer extends JsonSerializerString { Override public void serialize(String phone, JsonGenerator gen, SerializerProvider serializers) throws IOException { if (phone null || phone.length() 7) { gen.writeString(phone); return; } gen.writeString(phone.substring(0, 3) **** phone.substring(7)); } } public class UserVO { JsonSerialize(using PhoneDesensitizeSerializer.class) private String phone; }這段代碼的核心是serialize方法判斷手機(jī)號(hào)夠不夠7位不夠就直接輸出夠就把中間四位替換成星號(hào)。字段類上掛注解后Jackson在序列化這個(gè)字段時(shí)就會(huì)走進(jìn)這個(gè)邏輯。這個(gè)思路還能延伸到很多地方身份證號(hào)脫敏、郵箱地址脫敏、銀行卡號(hào)脫敏。規(guī)則不同但寫(xiě)法大同小異。我用這個(gè)方式在項(xiàng)目里統(tǒng)一處理過(guò)一批敏感字段效果很好最大的好處是脫敏規(guī)則收斂在序列化器里而不是散落在各個(gè)業(yè)務(wù)方法的if/else里。6.3 自定義反序列化處理前端多態(tài)字段的實(shí)踐自定義反序列化的場(chǎng)景相對(duì)少一些但一遇到就是硬需求。舉個(gè)真實(shí)例子前端有一個(gè)值可能是字符串也可能是字符串?dāng)?shù)組也可能是單個(gè)對(duì)象也可能是對(duì)象數(shù)組。這種不確定的入?yún)⒑蠖巳绻欢x一種類型必有一半的請(qǐng)求解析失敗。我的處理方式是在反序列化器里做兼容。繼承JsonDeserializerT重寫(xiě)deserialize先看當(dāng)前JsonToken是什么類型如果是VALUE_STRING就按字符串解析如果是START_ARRAY就遍歷數(shù)組把元素收集起來(lái)然后統(tǒng)一返回一個(gè)List結(jié)構(gòu)。public class FlexibleStringListDeserializer extends JsonDeserializerListString { Override public ListString deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { ListString result new ArrayList(); if (p.currentToken() JsonToken.START_ARRAY) { while (p.nextToken() ! JsonToken.END_ARRAY) { result.add(p.getValueAsString()); } } else { result.add(p.getValueAsString()); } return result; } }這種靈活反序列化器能解決接口兼容問(wèn)題但我建議只用在做舊接口兼容、第三方回調(diào)適配這類場(chǎng)景。新寫(xiě)的內(nèi)部接口能定死類型就定死類型別為了省事什么都兼容不然代碼越寫(xiě)越復(fù)雜最后自己都搞不清一個(gè)字段到底有多少種可能性。7. 聯(lián)調(diào)與線上排查我慣用的三板斧7.1 聯(lián)調(diào)期用哪些手段快速驗(yàn)證JSON交互聯(lián)調(diào)階段最容易發(fā)現(xiàn)JSON交互問(wèn)題這時(shí)候我很少直接打開(kāi)瀏覽器看頁(yè)面而是先用接口測(cè)試工具把請(qǐng)求和響應(yīng)分開(kāi)驗(yàn)證。我常用的驗(yàn)證步驟是第一步新建請(qǐng)求寫(xiě)入JSON請(qǐng)求體確認(rèn)HTTP狀態(tài)碼和響應(yīng)結(jié)構(gòu)第二步檢查響應(yīng)JSON里每個(gè)字段的類型重點(diǎn)關(guān)注時(shí)間、金額、數(shù)組空值第三步把響應(yīng)JSON復(fù)制到格式化工具里看一眼整體嵌套對(duì)不對(duì)。如果是一個(gè)比較復(fù)雜的JSON結(jié)構(gòu)前端同學(xué)經(jīng)常會(huì)問(wèn)“這個(gè)字段到底是字符串還是數(shù)字”。為了避免這個(gè)溝通成本我習(xí)慣在接口文檔里直接標(biāo)注示例值示例值能寫(xiě)123的字符串還是123的字符串都要寫(xiě)清楚。很多字段歧義本質(zhì)上就是示例值不明確造成的。7.2 線上JSON解析異常日志的定位思路線上環(huán)境沒(méi)有接口測(cè)試工具那么方便所以日志是排查的主通道。JSON解析異常常見(jiàn)報(bào)錯(cuò)有幾種JsonParseException表示請(qǐng)求體根本不是合法JSON多半是前端拼錯(cuò)了字符或者被中間層截?cái)郙ismatchedInputException表示JSON結(jié)構(gòu)合法但類型對(duì)不上比如前端傳了字符串后端定義的是數(shù)字InvalidDefinitionException表示序列化目標(biāo)本身有問(wèn)題比如循環(huán)引用、找不到getter方法。我的定位思路是先看異常信息里指向的字段名再拿原始請(qǐng)求體做一次本機(jī)復(fù)現(xiàn)。很多線上解析問(wèn)題本地一復(fù)現(xiàn)就能定位因?yàn)閳?bào)錯(cuò)信息已經(jīng)告訴你字段名了。真正難的是那種“偶發(fā)解析失敗”這種情況多半和特定輸入值有關(guān)比如某個(gè)字符串里帶了換行符某個(gè)字符串特別長(zhǎng)超過(guò)了中間件限制。解決偶發(fā)問(wèn)題的辦法是把請(qǐng)求體完整打到日志里一次復(fù)現(xiàn)就什么都能看出來(lái)。7.3 一次排查經(jīng)歷請(qǐng)求體過(guò)大與嵌套JSON邊界問(wèn)題最后分享一個(gè)印象比較深的排查經(jīng)歷。當(dāng)時(shí)線上有個(gè)接口偶爾報(bào)錯(cuò)錯(cuò)誤信息是“Unexpected character...”但同樣的請(qǐng)求參數(shù)重新提交一次又能成功。從表現(xiàn)看像是數(shù)據(jù)傳輸過(guò)程中內(nèi)容被截?cái)嗔?。查了一圈最后定位到是網(wǎng)關(guān)層對(duì)請(qǐng)求體大小做了限制超過(guò)限制的請(qǐng)求體被攔下一部分后端收到的是半截JSON自然解析失敗。解決方法是調(diào)大請(qǐng)求體限制并在網(wǎng)關(guān)層增加對(duì)Content-Length的校驗(yàn)超長(zhǎng)的請(qǐng)求提前返回明確提示而不是讓它進(jìn)入后端變成一條看不懂的解析異常。這個(gè)案例給我的啟發(fā)是JSON交互問(wèn)題不能只盯著JSON本身還要看承載它的整個(gè)管道。HTTP頭部、網(wǎng)關(guān)配置、代理層、編碼設(shè)置每一層都有可能改動(dòng)JSON的實(shí)際內(nèi)容。排查看鏈路這六個(gè)字是我處理這類問(wèn)題最核心的心得。再補(bǔ)充一個(gè)實(shí)際經(jīng)驗(yàn)JSON交互想要少出問(wèn)題接口文檔和前后端契約是最前線的防線。數(shù)據(jù)格式再簡(jiǎn)單也要把示例寫(xiě)清楚字段再多也要統(tǒng)一空值處理。這些東西看起來(lái)算不上核心技術(shù)但真到了線上報(bào)錯(cuò)搶救的時(shí)候每一份清晰的約定都能幫你少點(diǎn)一次應(yīng)急工單。希望這篇文章里梳理的思路能讓你在下次遇到JSON交互問(wèn)題時(shí)手里有一張完整的排查地圖。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
怡红院久久老司机| 91亚洲欧美综合高清在线| 少妇九九九九| 亚洲中文字幕日产无码久久| 午夜精品久久久久久久99蜜桃一| 精品夜夜澡人妻无码AV| 日韩 成人 有码| 久久亚洲AV成人精品无码| 91精品操美女| 精品999日本| 翔田千里av一区二区三区| 天天色欧美| 久久久久亚洲一区女同性恋中文字幕| 蜜乳AV色欲AVAV无码| 天天操天天日天天干| 一起草三级AV电影在线观看| 中文熟女五十乱码在线| 日本97久久久精品| 97超碰色五月| 97综合在线观看| 久久婷婷色| 中文字幕成人理论在线| 高潮毛片无遮挡高清免费| 中文字幕99999| 亚洲AV永久无码精品成人调教 | 亚洲中文国际强奸字幕| 亚洲精品一区二区精品| 黄色片一区二区三区四区五区| 天躁夜夜躁2021| 亚州欧美另类| 麻豆成人影音在线| 色欧美综合| 九七超碰人人乐| 伊人欧美大香蕉视频| 亚洲国产中文字幕| 人妻二区| 日韩精品中文字幕人妻| 免费一级黄色录像影片| 97国产成人精品免费视频| 午夜精品五区| 97中文天堂| 亚洲s在线观看| 区一二区日韩亚洲乱码av电影| 国产农村妇女精品1区二区| 日韩精品三区四区| 青草视频人妻在线观看| 亚洲欧美日韩不卡人妻| 一线黄色免费性爱片| 久操网线| 久久久性爱| 日本在线播放不卡一区| 国产一区二区三区白丝| 91在线免费精品视频| 都市久久精品激情亚洲| 在线看片国产精品每日更新| 国产情侣自拍在线播放| 亚洲中文字幕有码视频一区二区三区| 久久久久久久97| 99热精品免费| 伊蕉97蜜桃97狠狠综合干| 夜夜骑天天燥| 欧美经典一区二区三区| 亚洲午夜免费狠狠干| 伊人网在线视频| 天天欲望网| 欧美日韩免费性爱| 中文字幕视频在线观看一区二区| 欧美最大综合网| 啪啪啪综合网| 少妇国产不卡| 91东北熟女| 国产 三级自拍| 久久综合乱子伦国产免费| 欧美青青视频| 伊人激情五月天一区二区| 亚洲欧美中日韩| 超碰色老头| 亚洲精品亚洲人成人网| 国产AV天美传媒一区二区三区 | 国内精品久久久久影院亚洲| 亚州欧美综合| 日韩成人精品视频自拍| 亚州大图综合色图| AV无码久久久精品| 俺也射| 看大黄色大片原件| 福利天堂| 婷婷五月天激情网| 一区二区乱码福利| 亚洲欧美色图小说| 婷婷91| 欧洲站一级二级三级h| 人人操人人插人www| 欧美天堂日韩三级国产传媒| 欧美日韩岛国大片在线观看| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 超碰无码加勒比| 91日产欧美| 国产一区二区三区影片| 日韩免费高清大片在线| 97在线观看免费| 啊啊啊不要好疼视频| 999久久久免费精品国产牛牛| 青青操少妇| 人妻aa| 黑人免费福利视频| 天天肏夜夜肏| 天堂亚洲精品久久老牛| 久草色悠悠在线视频| 九九黄色视频在线观看| 人人玩人人添人人澡免费| 久久精品国产99久久,亚洲日韩久久日本一区一区三区 | 中文字幕欧美丝袜07资源| 2010男人的天堂| 色色福利| 亚洲国产麻豆一区二区三区| 国产一区自拍欧美日韩| 精品国产乱码久久| 猛猛干| 亚洲午夜蜜臀| 97超碰色中文字幕| 99精品人人爽| 97干综合网| 99999精品成人| 狠狠久久亚洲欧美专区| 狠狠躁AV| 欧美大战久久久伊人| 老熟女熟妇| 夜夜操91744565| 色一射色一射| 亚洲图片 激情小说| 91超碰碰在线| 91欧美色| 欧美香蕉视xxx| 国产成人www免费人成看片| 欧美东京热精品A∨| 99精品高潮| 97在线观看免费视频l| 亚洲人在线| 成人日韩中文字幕| 精品无码久久久久久久久果冻糖心| 国产激情久久久| 99色热| 六月婷婷激情| 91欧美丨精品丨入口| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 强奸乱伦日韩AV| 插日本熟女视频| 丁香五月天视频| 国产精品 亚洲情色| 91影视亚洲| 中文字幕欧洲有码| 啊啊啊啊啊在线| 欧美欧美啪啪视频| 双插性欧美一二三区| 国产中文字幕曰本毛片| 久久精品国产精品亚洲艾通辽熟妇 | 精品国产乱码久久久久久久久1 | 亚洲?V高清一区二区三区尤物| 欧美亚洲特P| 九九九久| 久久久久久人妻一区精品色欧美| 日韩国产乱子伦App| 人妻少妇色综合| 欧美第38页| 91无码人妻精品一区二区三区蜜桃| 久久久月天| 成人AV在线网站| 九九AV| 自拍偷拍2025在线观看| 歐美一級亂黃99在綫精品| 日本久久综合| 精品国产av一区二区三区四区入口| 欧美午夜视频免费观看| 啪啪91| 九九九九免费视频| 大香蕉视频一二三区| 久久精彩免费视频| 91激情综合| 精品人妻一区二区免费蜜桃视频| 日韩欧美亚洲一区二区三区影院| 日韩97视频!在线| 色欧美色交综合| 日韩探花精品在线视频| 91丝袜在线视频| 大JI巴好深好爽又大又粗视频| 综合久久久久久久综合网| 国产精品天美传媒| 不卡视频一区蜜桃视频 | 久/久精品99看9| #NAME?| 欧美一区二区日韩三区| 国内精品不卡无毒99999| 精品国产乱码久久久久久蜜臀| 国产精品极品美女视频| 青青欧洲黑| 成人a级高清视频在线观看| 婷婷亚洲中文字幕在线| 淫荡网址| 亚洲激情色片| 一个人免费HD91视频| 很很很很操| 亚欧成人中文字幕一区| Aa东京男人的天堂| 久久婷综合| 91精品人妻| 久久久久久亚洲精品不卡人乳| 中日韩久久久免费看| 成人性爱电影网| 天天92av| 日韩高清一二三| 操婷婷逼| 亚洲精品人妻在线| 精品人妻久久久久一区二区三区| 67194无码不卡| 一级特黄aaa大片在线观看成人一级片在线观看 | 欧美三四五区| 国产视频一区二区在线| 一区二区影院| 人人摸人人入| 亚洲另类色综合网站| 久久极品一区二区| 操迟操逼在巾线Fre看| 精品人妻久久久久一区二区三区| 欧美v日韩欧亚洲电影天堂色诱,国产传媒| 日B操| 精品国产99999| 牛牛久久国产精品视频一二三| 午夜高清成人在线视频| 色情乱伦AV| 中文字幕交换人妻| 久久超碰日韩精品| 另类图片五月天| surenchaopeng| 嗯嗯嗯,草死我| 97精品国产97久久久久久| 国产高清MV操逼视频| 美女久久久| 不卡一区视频| 嫩草影院永久在线制服丝袜| 日韩二级| 69久久久久久久久久久久久| 夫妻四区五区六区| 久久婷婷五月| 柠檬AV导航| 国产精品无套内谢| 狠狠色五月亚洲91| 涩爱AV在线| 亚码激情| 天天操女人| 屌逼传媒| 国产久久久9999| 久久草草欧美精品| 精品人妻一区二区三区-国产| 91成人精品在线播放| 风流老熟女一区二区三区l| 亚洲丝袜诱惑| 亚洲成人性爱网站在线播放| 三级AV入口| 最新日产中文在线麻豆| 日韩激情中文字幕有码| 国产18精品亚洲精品| 久久男女激情视频网站| 婷婷五月天_亚洲小说欧美激情另类_精品久久国产字幕 | 一级aaaaa欧美中文字幕录像片| 久久久精品91八戒| 精品国产www久久| 中日高清无码操逼视频| 人妻夜夜爽天天爽麻豆三区网站| 欧美拳交在线播放| 99re这里| 丁香九月婷婷| www色日本| 婷婷在线视频| 久热网| 老熟妇乱轮| jizzjizz欧美| 97欧美资源| 日日摸日日碰| 国产99精品一区二区三区免费| 亚洲av强奸乱伦| 大香蕉青青9| 无码久久亚洲高清,| 97在线看| 国产精品爱欲| 美国美女AV在线| 久久HD| 欧美日韩97| 丝袜美腿91| 加勒比伊人综合| 日韩av熟女一区二区三区成人| 国产成人免费观看在线视频| 国产激情视频一区区三区| 夜夜免费视频| 亚洲 欧美 日本 国内 首页| 中文字幕在线免费观看| 亚洲成aⅴ人片不卡无码| 日本孕妇一区二区视频操逼免费看 | 成人久久精品| 日韩无码服务区| 熟妇高潮二区三区| 曰韩人妻中文字幕在线| 国产一区二区在线电影| 九九精品美女高溯喷水| 啊啊啊啊啊啊啊在线| 久久高潮妇女视频| 91综合网站| 奇米狠999| 日本三级中国三级99人妇网站| 在线播放成人网站| 日韩久草| 日韩无码视频黄色| 亚州AV无码国产精品| 狼人综合婷婷激情四射 | 亚洲精品一区二区精品| 嗯嗯,啊啊,国产精品| 国产Aα| 黑人性暴力毛片| 逼操网站| 欧美夜夜狠| 亚洲电影91| 久久久久亚洲熟妇熟女| 色综合色色| 97操在线| 国语国产操逼伊人AV网| 乱操9999| 热九九精品| 国产后入清纯| 日本操BAV| 性爱欧美五月| www亚洲免费| 素人美腿视频网站| 久久精品一区二区一8| 五月丁香婷婷啪啪| 2017大香蕉| 中日无幕一二三四区| 热热色91| 日韩紧密久久| 免费看国产曰批40分钟怎么下载| 欧美日韩性爱精品| 在线视频97| 嗯……啊…嗯嗯…啊…好舒服| 好吊色综合| 欧美狠狠操| 国产一区二区欧美日本| 亚洲色电影在线| 69AV女优男人的天堂| 欧美激情专区| 日韩三级在线观看mp4| 久久精品一区二区一8| 一道本久久棕合爱| 人人看欧美性爱| 精品国产乱码久久久影院| 色婷婷激情| 波多野42部无码喷潮在线观看 | 曰本熟女视频| 久久男女激情视频网站| 色色综合97| 嗯嗯啊中文字幕| 乱欲一区二区| 一个色导综合| 欧美色宗合| 丰满少妇精品一区二区| 欧美九九爱| 无码聚合| 日韩人妻 中文字幕| 91综合在线| 噜噜噜噜天天狠狠| 国产9熟妇视频网站| 曰本91情色| 国产精品视频电影| 国产欧美日韩女同性恋ww喷水精品| 在线观看一级α片刺激高潮视频| 麻豆精品.欧美精品.日韩精品.| 物业黑人 AV一区| 亚洲大胆人体av| 97激情97激情| 欧美成人综合| 婷婷激情五月综合| 嗯嗯嗯啊啊啊操的我好爽| 97任你吞精| 美女极品一区二区三区| 中文字幕一区二区三区高清| 国产亚洲性生活视频播放| 葡萄牙性视频一二区| 色色九区| 思思视频免费看网站| 欧美精品二区视频在线| 亚洲无吗在线视频| 色婷婷综合视频| 国产AV毛片| 国产成人在线观看综合| 天天日日夜夜| 亚洲棕合电彰| 国产精品97超碰| 少妇精品| 日本天天操| 大香蕉黄色一区| 黑丝少妇在线观看| 欧美久久婷| 熟妇激情| 久久精品人妻一区| 爱媛媛久久国产福利| 亚洲s在线观看| 99热18这里只有精品| 人妻熟女一区二区三区视频| 成人av在线播放| 强奸乱伦AV网站| 高清国产av无码| 日韩欧美中文字亚洲慕| 日韩精品人妻一| 欧美AB在线观看| 神马福利久草| 中国的操老妇女| 91福利网在线观看| 麻豆久久久一区二区| 九九九九九九成人| 亚洲图片视频小说| 国产精品无码在线| 日本精品人妻少妇一区二区| 欧美色97| 久久HD| 97超碰磁| 色色99| 黄片免费日韩| 亚州久久9| 亚洲av噜噜噜噜噜噜| 亚洲限制级| 大JI巴好深好爽又大又粗视频| 丁香五月激情综合国产| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 欧美熟女逼久久久久久| 免费福利视频中文字幕| 爱干爱射网啊啊啊| 国产视频不卡在线观看| 91国产丝袜美女| 亚洲日韩国产欧美综合v| 人人澡人人弄| 97任你吞精| 屁股久久久久久久久| 亚洲国产欧美另类自拍| 亚洲夜色在线| 乱论91| 日韩久草| 无码自拍SM| 热天堂一区二区| 99rre在线精品99re8| 欧美亚洲se91| 亚洲中文字幕精品一区| 一道本东京热加勒比一区二区三区| 色97综合中文字幕| 国产尹人在线视频免费| 夜夜夜夜爽| www.av在线视频| 18禁久久| 激情图片伦理国产一区二区日韩| 丁香六月东京热| 日韩性爱再线视频| 亚洲天天影视色综合| 成人免费不卡在线视频| www熟女乱伦com| 久久精品高清无码一区| 亚洲最大91网| 欧美亚洲第一页| 玖玖资源视频一区二区三区| av在线浏览| 尤物一级在线免费观看| 精品丝袜无码一区二区三APP| 超碰97国产欧美| 日本孕妇孕交| 狠狠操狠狠燥| 亚洲自拍青操视频| 熟女网站最新| 日夜久久久九九九久| 曰韩精品九九无码| 丁香婷婷色五月| 亚洲影视第一页| 天天摸天天碰天天添青青| 97香蕉网| 又大又大又大又粗爽高潮观看 | 久久国产熟女影院| 操人人| 97在线观看| 青青草色AV| 成人一级二级| 96国产精品| 九九热三级片| 蜜乳AV.COM| 啪啪啪东京| 一区操逼| 操逼逼无码| 99热这里只有精| 精品久久在线区一区| 午夜福利久久久噜久噜久久综合| 天天弄欧美| 日逼五月天| 日韩9999| 超碰碰97资源站| 中文字幕一区二区视频在线观看| 污污汅18禁网站在线永久免费观看 | 久久AV无码AV| 无码国产精品午夜不卡( | 台湾一区国产高清在线| 成人性爱美曰韩| 色婷婷激情| 亚洲人妖网| 黄骗免费网站| 欧美在线干| 青青草视频久久久久| 樱花草社区www中国| 欧美综合传媒| 国产野战露脸在线播放| 中国一区二区亚洲人妻| 九九热最新| 色欲久久99国产精品久久久久久| 成人免费看吃奶视频网站| 四虎影视精品| 中文字幕精品一区欧美| 97色伦欧美| 亚洲诱惑天堂 | 亚洲性高潮| 国产www色在线观看| 91久久久视| 中日韩免费看男女操逼大全| 亚洲国产无码精品首页久久久| 操操操操操操| 国产女人和拘做爰视频| 四虎国产成人精品免费一女五男| 大色综合| 综合色拍| 欧亚无码视频| 欧美日韩国产男人| 91成人精品在线播放| 韩国毛片一区二区三区| 7777欧美成是人在线观看| 久久久久久久国产| 性爱Av免费| 免费成人在线熟妇网| 啪啪视频亚洲第一| 97超碰资源网| 国产日本久久免费精品| 97在线免费视频观看| 久干9操| 亚洲校园激情| 后入美女国产| 日韩中文字幕精品一区在线| 超碰久久网| 99热精品在线观看| 国产高清视频无码在线| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | av天堂天堂av日韩| 少妇精品久久| SUV一区二区在线看| 人人操人人色网| 欧美亚洲美少妇一区二区| 国产亚洲禁久一区二区| 国产AV激情无码久久无码| 丝袜色综合| 91狠| 九久9精品| 乱伦一区二区三区‘| 九九超碰综合网| 国产性刺激| 乱伦图av| 中文字幕日韩电影人妻| 91春色| 久草色在线观看| 男生女生啊啊啊啊| 亚州情色j区| 思思热免费在线视频| 国产一国产一级毛片古装| 中文字幕无码不卡啪啪| 99亚洲人人| 99在线精品观看视频中文| 国产精品乱码久久久久久久久久久久| 91综合色| 男人的天堂视频精品乱在线| 人妻五十路在线| x97av| 超碰午夜| 91大香蕉伊人| 综合少妇网| 日韩欧美蜜桃精品久久中文字幕久久 | 大鸡吧尹人在线| 黄色av片三级三级三级免费看| 91精品国产日韩欧美综合| 丰满人妻一区二区三区性色| 乱伦a片视频| 性暴力欧美猛交在线直播| 91肉丝| 国内偷拍精品一区二区| 99久久精品无码一区二区毛片免费 | 国产精品欧美激在线| 欧美激情一区二区| 欧亚韩国999| 天天色综合影视网| 91精品网站| 国产一区二区三区免费视频在性观看| 综合免费无码中文| 久久久久久夜夜夜夜夜| 宗合情欲网| 在线五区| 在线αⅴ| 蜜桃臀av在线观看| 校园春色综合香蕉| 九九九热| 日韩欧美女优电影| 国产精品一区二区后入| 天天射夜夜骑| 国产精品视频精品一二| 9热9热综合网| 久久久亚洲| 91狠狠色丁香婷婷综合久久| 狠狠2050在线观看| 97在线视频免费观看| 强奸乱伦动态污图免费 | 肉丝无码中文高清| 中文字幕精品一区二| 92性色国产午夜福利在线661| 亚欧毛片基地国产毛片基地| 欧美精品999| 美女啪欧美一区| 亚洲中文字幕精品一区| 日韩伦理视频| 探花视频免费观看国产专区| 75大香蕉| 九色黄站| 97色色色综合网站| 日本国产二线女色| 九久久九九久视频| 色综合色欲色综合色综合色综合| 91日产欧美| 亚洲精品乱码线路中文字幕| 午夜欧美J进J出白浆流出久久久| 色哟哟 日韩精品| 天天爽天天操| 中文久久久| 午夜人妻精品综合在线| 九九热九九| 97在线欧洲| 国产性爱在线视频一区二区| 久久蜜色情在线视频xxx免费观看| 日韩一级欧美一级国产一级台湾| 日本 免费 一区二区三区 久久香蕉 | 伊人大香蕉在线| 天天色天天干天天射| 国产精品久久久久久久久久二区三区| 欧美丰满熟妇XXXX性ppX人交| 9Ⅰ超碰| 操死我干死我| 男人的天堂一区三区| 96麻豆精品一区二区三区| 婷婷大香蕉| 国产av激情无码久久天堂| 吊色| 国产av青草| 欧美在线干| 国产精品网址| 91 偷| 我中文字幕6区 | 国产日韩区| 久久少妇人妻| 欧美性爱一内片一区二区三区| 少妇高潮对白在线观看| 天天看天天日| 张柏芝国产一区在线观看| 欧美日韩天堂| 国产极品久久久| 久久欧美按摩999| 久久婷婷五月天| 亚洲图片欧洲图片aⅴ| 亚洲欧美色图片| 职场同事知名国产国产精品久久欧美日韩 | 亚洲妇色| 亚洲国产一级中文综合久久天堂在线免费观看 | 欧美后进式| 日韩不卡在线一区二区| 十八禁的黄污污免费网站| 国产亚洲精品A在线观看下载| 美女黄页网站| 99re28在线观看| 久久9久久| 69精品| 超碰精品国产无码| 1级黄色夫妻对换性交免费看| 麻豆精品一区二区三区四区免费观看| 91中文字幕在线观看| 在线99热| 久久综合18p| 蜜奶av| 丝袜色综合| 久草色悠悠在线视频| 人人人人人人少妇| 大奶尤物鲍汁淫荡欧美视频粉嫩夜夜骚 | 99少妇内射| 9Ⅰ超碰| 20cm女自慰在线日韩欧美| 国产熟女无套内射| 国产又黄又爽又刺激久久久久久| 无码高清少妇久久| 国产黄色av大片网站| 精品国产乱码久久久久久久久1| 精品十三区| 中文字幕第7页| 伊人超碰97| 久久久一区二区三区三州| 亚洲国产成人7777| 人妻熟女字幕一区二区| 久久精品99久久久久久| 日欧操屄| 亚洲精品丝袜-不卡成人免费……| 美腿丝袜高跟网免费视频免费视频| 超碰到97情色| 亚洲激情久久| 丝袜美腿诱惑亚洲欧美视频在线观看| 97国伦国色| 青青草久草| 99精品在线播放| 91免费看中出视频| 人妻AV 中文字幕的| 97超碰亚洲| 亚洲在线91| 极品尤物在线观看| www.acm成人黄色毛片| 天天摸夜夜添无码小视频| 97网址www| av网站免费看| 97日视频| 日韩免费看黄片| 伊人 俄罗斯 a v| 一类无码操逼视频| 中文字幕诱惑制服人妻丝袜美丝袜美 | 香蕉综合网| 久九色| 久久久久久九九九九-美女久久久久久久-成人AV| 亚洲女优有码无码高清| 丁香九月激情啪| 校园春色五月天| 国产五码丝袜屁眼| 日本在线不卡v二区| 91亚洲欧美综合高清在线| 中日韩久久久| 精精品人妻一区二区三区| 在线人妻熟女一区二区三区四区五区| 老熟女乱伦片| 97超碰总站| 婷婷性爱| 乱伦av国产| 97色97干| 97欧美综合| 欧美中文狠| www.色婷婷色综合| 国产综合日韩伦理| 亚洲第一视频 欧美风情 日韩| 天天干天天日天天射黄色| 一级成人性爱| 超碰在线91| 亚州九九九精品视频| 中文字幕国产精品1区| 日噜夜夜夜夜夜夜夜夜夜夜爽爽爽爽爽爽爽爽爽爽爽爽 | 99e久久国产精品| 大香蕉92| 色一区二区三区综合| 操九九九九九九| 人、人、摸,人、人、草| 肏逼视频日本| 99热在线观看| 亚洲超碰97| 午夜精品久久久久久久| 亚洲精品骚逼| 日韩中文字幕av在线播放| 免费看污网站| 乱精品一区字幕二区| 日韩人妻中文视频| 国语国产操逼伊人AV网| 无码逼| 吖在线不卡一区二区国产剧情| 五月天人妻综合| 操91| 欧美青青草视频| 欧美亚洲一区二区久久久婷精品大包诱| 久久亚洲精品成人av| 在线岛| 一区二区三区视频国产免费| 伊人网免费视频| 大香蕉乱级| 国产精品久久aV| 久久透逼视频| 91福利网在线观看| 欧美性爱精品七区| a片久久久久久久久久久久 | 精人妻一区二区三区| 日韩欧美久久婷婷网站| 人妻精品一区一区三区蜜桃91| 青青草原成人| 国产农村妇女毛片精品久久| 伊人宅男大香蕉| 国产精品久久久 | 日本高清一本二本免费不卡| 91亚洲网站| 日韩簧片免费看| 91色久| 久久久com| 国模91| 欧美一级A一级a爱片久久| 51久久夜色精品国产麻豆| 一区二区三区四区免费视频| 丁香五月天堂| 亚洲欧洲美腿丝袜| 一级免费精品| 日本熟女免费視颖| 后X久久| 91 刺激在线| 加勒比色99999| 美女在线H91| 插B在线观看| 蜜乳成人AV| 国产精品久久久久无码A√| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 大香蕉免费中文| 亚洲熟伦熟妇AV无码春色| 精品亚洲黄色片 国产精品导航一区二区| www.色婷婷色综合| 四季AV一区二区凹凸精品小说| 青青草好吊色| 五月天婷婷成人网| 欧美性色欧美| 精品区国产区一区二区三区| 久日91在线| 久久黄色视频一区二区三区| 高清肉丝中文无码| 中国AV美女| 久操在97| 亚洲第一无码播放立川理惠| 91模特在线观看| 精品黑人一区二区| 日日躁夜夜躁狠狠躁超爽| 免费夜夜爱黄色视频毛片| 狠日欧美| 男人天堂日日夜夜| 日韩草久视频| 欧美日韩亚洲天堂| 黄片视频,下载| 人人妻碰人人免费| 久热这里| 亚洲情欲| 精品免费囯产一区二区三区| 欧美综合网A| 精品久久久久久AV无码| 日本高清熟女久久一区| 久久久精品视频欧州站| 亚洲另类色综合网站| 首页亚洲国产高跟丝袜诱惑视频| 久久久久久久久久8888| 亚洲精品一区二区三区在线播放| 国产美女口爆吞精视频| 日韩精品在线观看网站| 色婷婷丁香| 超碰97资源中文字幕| 天天操天天7| 大白逼三四级| 夜夜躁狠狠躁日日躁av| 亚洲午夜精品久久久中文影院| 日本久久久久久久久久| 亚洲高清欧美总合| 人妻少妇色综合| 亚洲综合性网址| 久久久四区| 97免费在线| 岛国片国产成人亚洲播放| 我中文字幕6区| 欧美性爱伊人| 91美女精品| 日韩精品人妻中文字幕有码午| 老熟女综合| 偷拍网站久久男女男| 又大又长又粗又爽又黄| 天堂综合| 激情五月综合网| 国产无码成人无码| 欧美情色贴图| 午夜理论片在线观看免费| 天天色综合影视网| 久热伊人99re| 日韩av一级黄片| 密臀视频三区免费网站| 一区中文字幕二区日韩| 国产A v无码专区| 亚洲黄色AV电影| 成年男人的天堂| 久久一级无码精品毛片6| 加勒比99999| 九一精品牛牛一区二区| 亚洲av强奸乱伦| 翔田千里爆乳巨臀无码| 久久久久久久久久久久欧美日| 欧美在线视频99| 免费观看网黄| 美女高潮国产高清| 丝袜翘臀后入欧美校园亚洲自拍另类小说一区中文字幕少妇诱惑 | 日本一区视频在线观看| 久久久久婷婷精品av电影| 有码免费观看| 欧美黄片视频在线观看免费 | 国产日韩精品一区二区三区| 国产精品麻豆视频网站| 东京热毛片177b2viP| 亚洲天堂日本| 中文字幕日韩国产传媒欧美精品| 无码高清专| 韩国免费播放一级毛片| 久久久555| 伊人伊人LD| 欧美亚男人的天堂| 综合操逼| 国产精品人人爽人人做可爱福利| 国产精品操| 狠狠干2020| 亚洲综合九| 久久久久久性爱片| 五月色综合| 国产欧美日韩精品中文| 久久欲| 男人的天堂99| 久久97视频| 9 9无尺码天堂网| 一直超碰| 中文字幕在线24| 在线观看日韩av不卡| 乱伦图av| 精品成人亚洲午夜电影| 亚洲本色精品一区二区久久| 91美女精品| 美女t无毒不卡不卡| 久久亚码| 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 日韩欧美加勒比| 麻豆av一区二区| 97超碰伊人| 美女91网址| 在线 欧美 亚洲| 天天影视之亚洲综合网| 精品美女久久一二三| 中文字幕人乱码中文字的预防方法| 精品国产72| 超碰97男人| 精品无人区麻豆乱码久久久| 九色 人妻 大香蕉| 婷婷国产精品九区| 色综合美国| 欧美色66| 99色婷婷中文字幕乱色| 亚洲日韩青青草色月| 欧美日动态视频| 性性久久| 亚州五月| 97chaopengongkai| 麻豆天美传媒毛片| 偷拍亚洲| 日本成人A片免费看| 操逼操2| 伦激情人妻另类人妻| 亚洲精品国产专区在线观看| 91在线超高颜值国产| 熟女人妻一区二区三区| 欧美很很操视频| 九九热免费国产视频婷婷伊人| 欧美不卡在线美女| 亚洲欧洲无码97久久精品| 9999亚洲精品| 综合色久欲| 欧美日韩中文视频播放| 国产偷人伦激情在线观看| av在线播放国产一区| 欧美日韩国产三级黄色| 日韩啪啪网| 亚洲男人bt天堂| 亚洲国产剧情少妇激情| 99国产精品久久久久久久成人热| 一区二区三区四区久久视1| 福利天天都操| 9999久久久| 成人免费性爱视视| 91社操逼| 97色五月天完| 亚洲自拍一区夜夜操| 婷婷国产精品一区二区| 97超碰久久| 成年人一级黄色毛片大全在线观看| AV大香蕉| 国产亚洲色婷婷99精品91| 青青草原av| 成全动漫视频观看免费下载| 乱伦系列一区二区| 欧美三级中文字幕hd| 啊啊啊用力在线观看| 久久久九97| 久久精品国产96精品亚洲拳交| 五月天色综合| 欧美日韩理论一区| 加勒比性爱成人在线| 国产捆绑一区| 国产69精品久久久久99尤物| 亚洲情色第一页| 99re在线视频| 在线αⅴ| 天天射影院| 国产地址二三| 欧美亚洲自拍另类人妻| 99精品成人免费看| 另类av天堂| 在线不欧美| 91操人| 97碰碰日本乱偷人妻中文的| 好属操| 欧美一区二区亚洲天堂| 无码久| 一区二区乱码福利| 乱老女人一区二区视频| 九九英色视频| 久久中文字幕在线观看| 国产人伦a片信息免费片| 午夜男人天堂| 国产精选三级在线观看| yiqicaoav| www.yw尤物| 色情婷婷久久五月天| 91在线秘 男同| 欧美久久婷| 国产97在线播放| 逼逼逼逼操操操操操操操操操午夜剧场| 欧美另类色图片| 春色91| 色综合色综合网| 天天躁狠狠躁av| 欧美性爱中文字幕无线码| 久草五月| 91精品人妻| 婷婷综合五月天| 大干人妻| 337p大胆噜噜噜噜噜91Av| 欧美同性恋 的搜索结果 - 91n| 色就色综合| 精品国产乱码久久久兰草影视| 欧美日本成人一区二区| 久久欧美按摩999| 国产1024在线播放| 一区二区偷拍拍视频| 九久精品| 六六久久日韩不卡| 啊啊啊好想要| 夜夜嗨AV蜜臀av| 国产色图乱伦| 97人亚洲综合字幕| 啪啪自拍九九综合| 精品久久久九九九孕妇| 精品一级毛片在线观看| 国产精品天美传媒| 秋霞免费无码视频日韩A片| 日日黄色三级网站| 不卡av在线中文字幕| 97频视在线| jizzjizz欧美| 亚洲成人帖图| 1024久久高清视频| 国产成人www免费人成看片| 中文欧丝袜诱惑| 婷婷综合网| 啊啊啊爽爽| 天天综合香 ld视频| yellow网站免费观看日韩高清无码| 福利天堂| 91九色在线| 天天网综合| 日韩午夜国产| www色日本| 特色a在线上| 亚州中文字幕超碰97| 1769精品一区二区三区| 欧洲综合色| 久久久久久久久久久久黄色 | 好爽视频在线观看| 图色综合网| 国产 日韩 另类 视频一区爱| 日韩欧美麻豆| 麻豆婷婷成人一二三| 日韩欧美国产高清视频| 野狼福利社区| 日本孕妇孕交| 综合网,亚洲,欧美| 日本操逼视频不卡直接放| 亚洲中字慕不卡| 偷拍网站久久男女男| 97人人操人人摸人人爱| 亚洲爽图| 亚洲资源网| 成人精品电影| 亚洲精品人妻吞精av| 精品国产乱码久久久久久蜜臀| 中文一区在线日| 欧美天天拍| AV不卡在线| 97精品视频| 丁香五月性爱| 国产一区二区三区免费视频在性观看| 国产热av| 人妻无码后入| 这里只有精品视频在线观看麻豆| 九九九一二三| 欧美第二页午夜| 久操综合在线| 伊人久操| 天天干天天舔| 久久久久女教师免费一区 | 亚洲午夜免费狠狠干| 青青久久手机线视频| 999综合网| 久久爱97| 熟女熟妇伦久久影院毛片一区二区| 亚洲人精品久久久喷水| 爱射综合| 嫖老熟女A片一二三区| 26uuu最新| 亚洲风情在线观看| 人妻蜜桃臀| 九九九九精品一区| 夜夜久久| 日本 免费 一区二区三区 久久香蕉| 亚洲操人| 色久桃花影院在线观看| 一本色道久久天天射天天干| 欧亚日韩中文在线| 久久亚洲一区女同性恋中文字幕| 久草精品一区| 内射黑人| 丰满搜索结果 -第18页- 久久高清无码 | 丁香五月色情| 中日高清无码操逼视频| 亚洲第一无码播放立川理惠| 18禁在线视频| 亚洲一区日韩精品中文字幕 | 欧美成人A天堂片在线观看| 老熟妇乱轮| 麻豆成人影音在线| 亚洲男人天堂手机版| 欧美精品激情| chaopen97久久| 国产一区二区在线看| 校园春色美腿丝袜 | 国产精品一区二区a| 超碰78| 久久一区二区三区四区五区| 91狠狠综合网| 在线免费观看高清无码视频| 国产91影院| 在线观看无码三级少妇| 国产精品一区二区亚洲人成毛片| 日韩av性爱在线播放| 欧美一二三级精品在线| 日韩成年人性爱视频|