色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合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
返回資訊列表
色爱国产| 超碰97综合| 亚洲、日韩、综合、另类| 久日91在线| 99久久久| 九九亚洲| 尤物视频新赏网鲜网色诱网| 五月天丁香婷婷综合网站| 日本精品第一视频在'| 夜夜操91744565| 超碰碰小说97| 2019天天干天天操| 97人人爱人人做人人乐| 3PAV乱伦视频| 亚洲色鬼| 激情色图| 少妇无码太爽| 亚洲影视综合| 丝袜美腿诱惑亚洲欧美视频在线观看 | 天天干天天拍| 69精品| 日本岛国黄色网址| 深爱伊人影院| 男人天堂.AB| 91老熟女91老女人| 黄色网址在线免费观看| 西西美女视频网| 黑人娇小av在线播放| 日韩婷婷| w w w.久久精品| 九九色色| 午夜性生活av免费在线看| 婷婷激情啪啪| 97干在线| 精品国产乱码久久久影院| 天天干干天天干干| 欧美最婬乱婬爆婬性视频| 免费视频一二三区| 91亚洲不卡一区| 蜜桃av色偷偷av老熟女| 日韩久久超碰色| a片在线播放| 殴美日韩m| 东北少妇高潮zzzz| 神马久久啊啊| 亚洲熟女中文字幕在线| 少妇天堂| 97色欧州| 激情深爱五月天| 人妻三级在线中文字幕| 四虎在线播放| 国产久久一区二区午夜| 欧美十八禁视频| 熟女精品一区二区在线观看| 五月婷婷性爱| 操屄日韩| 黄页网站成人免费| 美美91成人国产精品欧美精品久久久久久久 | 婷婷AV一区二区三区| 亚欧美色图| 99性爱| 天天干天天操天天操夜夜操天天操 | 天天影视亚洲| 欧美白嫩在线放| 久久久精品视频免费观看| 夫妻AV网站| 天天透伊人| 亚洲 日本 国产 综合| 人妻美腿丝袜日韩| 99精品无码| 欧美日韩啪啪电影| 久伊人网78| 99re99视频在线免费观看| 91天堂色男人的天堂| 国产一级高清免费观看| 人妻熟妇久草在线| 色女综合| 久热免费视频| 久久‘黄片视频| 成人怡红院| 日韩情色AV| 欧日韩不卡视.频| 亚瑟国产精品久久无码| 蜜臀无码一区二区| 青青色综合| 黄色视频特级毛片| jk白丝没脱就开始啪啪| 一级@啪啪视频| 欲色综合| 天天日骚逼熟女| 精品一区二区啪啪啪| 岛国黄片网站| 91狠狠综| 伊人国产成人av网站| 99re在线视频这里只有精品| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 91丨人妻丨国产丨丝袜| 国产和美国毛片| 宗合情欲网| 成片免费观看视频大全| 国产精品激情久久久久久久| 欧美日日操| 日本孕妇一区二区视频操逼免费看 | 国产成人bd在线观看| 激情 欧美 亚洲 小说| 夜夜躁狠狠躁日日躁av| 大但人体久久久久| 国产又粗又长的视频| 亚洲色图第一页| 亚洲AV无码| 67914亚洲精品| 亚洲色色色| 亚洲蜜桃V妇女| 久热在线精品免费观看| 99久久久无码精品国产人| www亚洲欧美| 国产精品禁久久久精品| 羞答答AV中文字| 9精品久久| 亚洲一区二区 麻豆传媒| 久久视网78| 精品人妻夜夜草| 吻戏激情性巴克| 色噜噜狠狠色综无码久久合欧美| 这里只有精品视频在线| 歐美一級亂黃99在綫精品| 超碰久久性爱| 一区二区三区日韩欧美| 少妇人妻无码| 欧美综合 站| 97超碰亚洲| 中文字幕女同在线| 久久9999 | 中文字暮97| 黄页大片在线观看| 久草色悠悠在线视频| 九九九久千久久激情蜜桃在线看 | 素人播放一区| 亚洲熟女一区| 黑白配性爱AV成| 天天综合~91| 精品美女少妇一区二区| 日韩无码操逼片| 伦伦成年午夜免费视频| av天堂5| 超碰人妻在线| 婷婷国产精品九区| 久久久99999久网站| 亚洲限制级| 9.1小视频| 1区2区3区视频| 一本大道不卡一二三区| 强奸乱亚洲| 九九热精品免费视频| 欧美内射少妇| 欧美黑人168页欧美黑人167| 极品销魂美女一区二区 | 色情婷婷久久五月天| 美女裸体麻豆天美蜜桃91| 亚洲色图综合网| 久久亚洲欧美一区二区三区-亚洲国产精品第一区二区 | 亚洲导航深夜福利| 国产免费一区二区在线A片视频| 色婷婷电影网| 九九九九免费视频| 国产精品不卡av免费在线观看| 日韩无码三级影院| 激情综合网激情五月天| 97精品第3页| 偷窥自拍亚洲| 日B操| 抽插无码高清一区| 亚洲精品白丝| 日韩欧美亚洲自拍偷拍| 激情视屏国产乱伦强奸| 日韩AV色图| 五月天欧美色图| 亚洲少妇在线观看| 五月天激情四射| 夜夜騷av、一區二區| 亚洲欧美洲综合| 国产AV激情无码久久无码| 婷婷五月天色色| 欧美性爱一内片一区二区三区| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 久久免费少妇| 国产av美女被艹的乱叫| 97精品在线| 大香蕉伊人网| 五月丁香综合| 亚洲色图 综合| 中文字幕99999| 五月天色色网站| 高潮综合网| 中文字幕在线观看视频www| 久久伊人网视频一区二区三区| 91高清欧美| 国语国产操逼伊人AV网| 日本黄色裸日本黄色裸体| 老熟女网站| 亚洲成人久久美女| 后入福利视频| 中文字幕亚洲永久精品| 午夜精品久久久久久久99热影院 | 亚洲精品819| 997色在线| 天天操天天射天天日| 亚洲欧美一区二区三区在钱蜜桃 | 婷色五月天| 久草毛片| 色婷婷五月天| 日韩精品人妻一区二区| 久久露脸国产老熟女| 国产精品电| 把腿张开老子CAO烂你| 伊人精品视频| 污污汅18禁网站在线永久免费观看| 人妻插插人妻人| 亚洲精品九九九| 亚洲综合春色| 国产精品亚洲天堂网址| 久久久久国产| 五月天婷精品激情| 成熟熟女国产精品一区二区| 亚洲欧洲综合av在线| 亚洲色图久久成人| 日本αv| 日本高清电影欧美色图| 插入逼91| 2017大香蕉国产精品久久| 亚洲 小说 欧美 激情 另类| 亚州中文字幕超碰97| 亚洲囯产精品女人久久久| 国内操逼视频二区| 青娱乐国产盛宴视频| 夜夜操夜夜高潮夜夜爽国产精品区| 亚洲制服aⅴ中文字幕| 十八禁一区二区无码观看| 超97在线精品视频| 97久久国产精品| 婷婷色在线| 九月伊人中文字幕| 久久不卡一区二区 | 超碰在线日韩一区| 小草三级久久观看| 自拍视频一区在线观看| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 超碰在线人妻中文字幕| 久久久111| 3p国产色噜噜一区| 久九九九| 国产欧洲精品亚洲午夜拍精品| 国产三级多多影院2022国产AA一级毛片无码| 96国产污污污丝袜| 97爱免费插| 三级激情网站| 99re黄| 亚射在线| 色久综合| 国产 亚洲 丝袜 制服| 夜夜夜爽www精品视频| 三上制服丝AV| 日韩国产中文字幕| 93人人操人人| 免费人成毛片乱码| 麻豆色约约| 亚洲五区熟女| 影音先锋乱| 欧美日本成人一区二区| 蜜桃天美传媒AV一区二区三区| 韩日男人的天堂| 成人免费不卡在线视频| 亚洲97| 国产精品69久久久久久久| 欧美系列在线一区二区| 夜夜操美女| 天美传媒麻豆一区二区三区国产精| 亚洲 欧美综合| 日本淫色网| 国产97色在线| 国产乱伦视频污| 人妻精品一区一区三区蜜桃91| AV色天香在线| 国产又黄又猛又粗又爽的网站| 人人操人人操草草| 天天干天天操天天干天天操| 日本一区二区三区午夜观看| 一区二区不卡视| 欧美色道啊| 大香网伊人久久综合网eew| 成人欧美一区二区三区黑人一| 日本免费人成视频播放120秒| yazhouzaixian| 新视频sss国产| 久久久精品国产亚洲伊人| 亚洲色图亚洲无码强奸乱伦| 欧美激情性久久久久久| 久久久久久97| 97国产人人| 啊啊啊好舒服视频| 天天综合网~91| 91熟女少妇| 九九九九九九视频| 超碰1997| 久久亚洲色图中文字幕| 91男人天堂网| 亚洲色棕合| 呻吟 欧美 日本 中出| 日韩一级二级三级免费看完整版国语版| 性色高清在线| 亚洲日韩青青草色月| 午夜呻吟欧美| 97超碰色屌| 亚91亚洲网| 强上我不卡卡| av操操不卡| 日本青青草在线| 天天欧美欧美亚洲网| 五月天黄色激情视频| 欧美成人一级免费电影| 日韩精品黄片免费观看| 色五月婷婷久久| 99激情| 欧美图片偷拍| 欧美天天综| 色婷婷久久综合超碰| 日本不卡高清免v欧美日韩在线观看| 五月天开心网| 亚91亚洲网| 欧美aⅴ99久久黑人专区| 精品性爱久久视频| 熟女熟妇一区二区三区视频| 亚洲交性| 国产精品一区二区手机看片| 伦激情人妻另类人妻| 亚洲精品一二区| 亚洲欧洲精品视频发布| 五月天啪啪| 欧美精品999| 男人的天堂2018东京热啪啪啪| 国产精品一区二区在钱播放| 黑人天8A∨高清网站| 欧美综合网1| 美女t无毒不卡不卡| 综合久久2017| 日日日日做夜夜夜夜无码| 人人做人人妻人人夜视频| 五月天激情小说| 亚洲AV乱码专区国产噜噜亚洲| 探花精品 一区二区| 亚洲婷婷丁香在线| 亚乱色| 五月天婷婷综合网| 精品一区96| 精品二区三四区五电影 | 日本亚洲vr欧美不卡高清专区| 色老牛| 97天天摸天天爽| 91人妻中文| 又黑又大又粗| 熟妇无码视频三区| 搞中出久久| 天天爽夜夜操| 久久久91福利姬| 天天上日日上日韩精品| 亚洲国产无码精品首页久久久| 欧洲免费一区二| 日韩大香蕉AV影片| 色官网在线| 伊人aaa| 无码不卡八戒| 熟女丰满人妻一区| 久湿久久 | 一牛影视久久久一区二区三区| 很狠操| 性饥渴少妇av无码毛片| 中文字幕av色| 亚洲色宗合| 激情五月天色色| 欧美一品道| 中国少妇XXXX做受| 狠狠图片青青草| 天天日天天操天天射河南省| 久久国产视频专区一二三| 清纯唯美亚洲综合| 久久女人视频| 性无码专区2020| 澳门人妻久久| 第四色奇米影视777| 欧美性区| 性爱网站一区二区| 伊人国产视频| 丝袜熟女一区二区三区| 亚洲影视第一页| 91精品无码人妻系列| 日韩三级性| 中文字幕av亚洲在线| 激情文学 亚洲图片| 1人人看人人摸人人操| 男人干美女| 国产强奸超碰AV| 国产av色网| 日本中文字幕在线视频| 另类欧美色| 男人亚洲91首页在线| 91在线免费精品视频| 日韩欧美成人大香蕉| 日韩免费簧片| 99999这里都精品| 综合久久中文字幕综合日韩精品| www.人人摸在线视频| 色婷婷影视| 九久精品| 好好的日:com久久九九| 欧美亚洲日本激情在线| 神马麻豆福利院| 欧美黄色图片| 乱伦Av网| 99av| 九九九九精品一区| h在线看免费版在线看| 中文字幕欧美日韩三级| 日韩精品9区| 中文字幕 国产区| 青草综合| 欧美传媒一区| 欧美黑人猛交春色影视大全| 日韩久久.一级黄色片| 欧洲一区二区| 九九拍拍精品视频在线播放| 免费看一级a性色生活片久久无| 久久免费9| 欧美人妻色| 91丨九色丨熟女高潮| 亚洲精品自拍| 少妇大屁屁| 99青青草国产视频| 亚洲男人天堂2019| 东京热激情视频一二三区 | 欧美劲爆第一页| 精品一区二区三区四区女| 91色久| 日韩三A大片在线观看| 国内外毛片在线观看| 97精品一二区| 曰韩av中文字幕专区| 视频一区二区免费在线| 97人妻人人躁人人玩人人| 日本亚洲vr欧美不卡高清专区| 国产 亚洲 丝袜 制服| 日本淫乱女一区二区三区视频| 久久久久9| 骚乳在线| 亚洲日韩AV视色| 乱性AV| 久久激情综合| av最新免费中文字幕| 亚洲情色视频| 国产999精品久久久| 欧美久久久| 欧美激情 日韩精品| 一区二区三区四区色图| 欧美视频中文字幕区| 又粗又长又爽在线观看| 日本淫乱女一区二区三区视频| 亚洲天堂久久| 超碰久草| 亚洲 无码 有码 中文字幕| 大香蕉伊在线久草麻豆天堂故事| 射丝袜高跟鞋99| AV 少妇 人妻 偷拍| 丁香五月激情综合国产| 日韩不卡av一二三| www.色操逼| 欧美顶级黄色大片免费| 99国产在线 精品 视频| 国产精品久久久久无码Av网曝门 | 亚洲av热热色| 久草精品国产蜜臀| 欧美色图片91| 区一在线观看| 欧美日韩黄色片一区二区三区四区人与兽做爱 | J?P?NESEHD熟女熟妇伦| 欧美色图亚洲色| 一本色道综合久久欧美日韩精品| 校园春色美腿丝袜 | 美国黄片aaa| 黄色成人网久久久久久| 欧美十八禁视频| 亚洲精品国产精品成人| 欧美v日韩v亚洲v最新在线| 视频不卡中文字幕| 精品日韩人妻视频| 亚洲h片在线免费观看| 亚洲成人在线高清| 美国人人操人人操| 91成人在线免费视频| 国产精点久久久成人| 国产精品无码AV网站| 国产超碰| 夜夜一区二区| 青娱乐av在线| 人妻少妇色综合| 日韩丨制服丨中文|在线| 少好三P| 天美传媒精品久久视频| 97天天操| 在线观看不卡一区二区三区| 色官网色综合| 婷婷五月天_亚洲小说欧美激情另类_精品久久国产字幕 | 国产精品自在线发布| 爆操无码| 野狼激情网| 天天α片| 97视频免费| 欧美成人一级麻豆| 国产AV久久野战精品| 人妻熟女av国产网站| 激情五月天网站| 亚洲AV乱码专区国产噜噜亚洲| 亚洲色香| 欧美激情区| 国产福利视频精品视频| 日韩性爱播放| 免费人人搞97| 天堂网亚洲区手机版| 久久综合九色综合欧洲98| 26uuu性物| 东京日日夜夜| 操91| 9色国产精品一区粉嫩 | 免费在线黄片视频| 国产精品一区二区三区在线密挑| 欧美色一二三| 国产精品久久久亚洲第一牛牛_在线观看| 日韩亚洲欧美中文字幕| 国人欧美精品一区二区| 国产极品999| 夜夜操夜夜高潮夜夜爽国产精品区| 亚洲丝袜诱惑| 欧美精品自慰系列寂寞少妇| 色噜噜人妻丝袜AV资源| 亚洲女人91| 黄片免费久久久久久久| 肉丝网站91| 亚洲女优有码无码高清| 在线观看成人性爱免费小视频| 亚洲五月丁香花狠狠干一区二区三区 | 少妇啪啪自拍| 99热亚洲天堂| 中国熟妇| 少妇滛荡视频| 岛国999| 日韩精品字幕| 99热综合在线| 伊人超碰97| www.人人cao| 日韩懂色网| 中文字幕丰满人妻日本| 开心五月深爱五月| 肉丝中文无码高清| 人人插人人摸人人| 99RE在线视频精品,这里只有精品| 五十路三区在线| 成片免费播放| 少妇人妻在线| 久久免费精品视频免一| 欧亚揄拍偷拍精品视频| 26UUU欧美激情一区二区| 日韩一级二级在线| 思思热在线视频在线| 夜夜嗨AV一区天天| 青草一区二区| 这里只有精品视频| 东京热综合久久一区二区| 深田咏美亚洲精品福利社| 久久人体一区二区| 超碰成人最新最好看| 国产视频小说| 免费强奸av| 骚逼自拍99| 无码人妻丰满热妇又大又粗| 欧美激情亚洲情色| 熟女视频久久| 国产一线二线三线av| 99热18| www.91视频网| 理论久久婷婷网 8| 亚洲影院365| 六月丁操逼| 无码精品久久久天天影视| 91综合国产精品| 91爆操视频| 国产97/欧美| 日日操天天操| 精品免费视频国产一区| 少妇69中文| 精品一区二区成人| 国产丁香精品露脸视频| 一区二区日韩欧美久久| 小说区 图片区色 综合区| 日本女厕偷拍| 操逼操网| 91精品人妻一区二区三区蜜臀| 91人人看| 亚洲小电影免费涩涩成人在线高清| 老女人老91妇女老热女| 91人妻Pr| 免费AV中文网在线观看| 都市激情人妻一区二区青青操视频| 黄色免费网页无码| 久久国产乱子伦精品免费女,网站| 国产有码一区| 思思性爱| 福利视频合集| 欧美最大综合网| 少妇超碰在线| 无码国产Av| 99精品九九九九九九| 亚洲免费精品一区| 日本操BAV| 蜜桃av色偷偷av老熟女| 中文字幕女同在线| 久久五月份| 十八岁啪啪视频免费看| 欧美色院| 91国产丝袜美女| 欧美v日韩欧亚洲电影天堂色诱,国产传媒| av天堂精品久久| 男人综合网| 97频视在线| 女色视频社区| 日本操BAV| 国模无码人体一区二区三| 蜜臀在线网站| 欧美情色贴图| 久久熟女人| 亚洲精品精品一区二区| 精品久久久久久无码| 人人妻人人爽一区二区三区| 欧美熟妇亚洲版| 久热色情精品| 色婷婷狠狠| 欧美日产国产在线成人第一区| 肥佬影院91| 强奸熟女一区二区三区 | 婷婷AV一区二区三区| ji熟女.com| 欧美一级在线观看成人| 极品人妻少妇综合| 国产高清在线自在拍69| 天天干天天日天天射黄色片| 天天狠| 久久ww| 亚洲色图亚洲无码强奸乱伦| 精品国产91av一区二区三区| 久久狠狠色噜噜狠狠狠狠97 | 久久久99999久网站| 伊人久久亚洲中文字幕| 九九成人| 二色av| 91干熟女| 去干网最新版| 伊人女女资源在线观看| 精品久久久久av影院| 天天懆天天日| 色欲Av人妻精品一区二| 久久色网| 亚洲在线| 9久在线视频只有精品| 中欧人妻丝袜中文字幕| 国产9l 大屁股| 抽插亚洲无码| 午夜精品久久久久久久久久久久久| 青青草五月份天| 亚洲交换| 夜夜嗨一区二区三区直播内容| 99草精| 999色欧美中文字幕| 青青草在线视频美女| 欧美人妻另类在线| 97jingpin| 骚货 中文字幕 av| 风间由美日韩欧美久久| 欧美激情内射| 热热色91| 亚洲春色一区二区三区| 五十路六十路素人熟女| 香伊人在线| 另类小说综合网| 亚欧视频在线| 欧美疯狂做爰xxxx| 99色在线| 欧美大香蕉在线观看| 久久久亚洲精品电影免费看| 1234区中文字幕在线观看_青青草国产在线_日韩一区二区 | 亚洲国产成人精品无码专区| 色牛牛AV| 开心五月天激情网| 91亚洲青青草原精品1区| 操人妻逼91| 极品AV网站在线观看| 无码精品啪啪啪一区二区三区三州| 2020中文字幕在线| 天天爱天天操| 欧美高清18A片| 久久亚洲AV无码专区国产精品| 亚洲最大网站av| 六月丁香五月婷婷| 偷窥自拍亚洲色图| 好屌色综合| 亚洲中字慕不卡| 麻豆久久精品亚洲精品88| 久久久精品91八戒| aaaa黄片| 丝袜内射| 亚洲国产精品久久久久婷婷老年| 91熟女丨91老女人| 黄色人人| 久热九九| 久久亚洲熟妇在线视频| 91天天美女| 成年人网站在线免费观看| 中文字幕精品日韩中文字幕| 97五月天| 日韩综合97P| 综合网天天| 加勒比在线视频一区二区三区| 一本道综合色图| 欧美色图 人妻| 亚洲视频精选| 高清无码 国产精品| 天天透伊人| 欧美日日人人天天| 亚洲欧洲自拍图片专区满春格| 欧美成人黄网色网站| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 性一级黄色录像片网站导航 | 综合夜夜| 久久综合激情| 加勒比海成人视频网| 亚洲精品99999| 最新国产亚洲精品精品国产亚洲综合| 九月丁香婷婷| 亚洲黄色电影| 玖玖爱免费观看视频| 欧美超碰96| 亚洲自拍97| 精品国产精品一区二区| 噜噜噜亚洲精品| www.亚洲黄色| 美女黄页| 亚洲风情在线观看| 久久久久婷婷| 九9精品| 影音先锋视频在线| 久久精品老司| 日韩欧美福利视频看看| 蜜臀久久99精品久久久老,,| 亚洲欧美天| 特级毛片特黄久久免费看| 青青操少妇| 91性色| 2020视频1区2区3区| 插插综合网天天影视网| 亚洲第一无码播放立川理惠| 超碰地址97| AV在线性爱| 好吊色一区| 黄色AV免费| 91色黑人少妇| 白丝被操91| 亚洲淫乱骚妇AV| 9国产超碰| 熟女自慰久久久| 家庭乱伦国产精品| 亚州精品丝袜-不卡成人免费| 久久久新亚洲AV| 精精夜夜| 亚洲春色一区二区三区| 蜜臀久久99精品久久久久免费观| 亚洲人成在线放东京热| 欧美综合97www| 日韩成人性日韩成人性爱视频在线免费观看 | 最新国内自拍av免费| 中文字幕免费观看| 欧美性爱无码一区二区三区| 四虎国产成人精品免费一女五男| 大香蕉免费3| 色色综合97| 亚洲乱码国产乱码精网站| 熟女一区二区三区四区| 蜜桃无码AV一区二区| 欧美性第1页| julia高潮后不停追击中出| 蜜臀久久99精品久久久久久-DVD| 欧美少妇熟女| 蜜乳视频网站| 98福利在线视频| av资源在线观看少妇| 国产精品一区二区密臀| 中日无幕一二三四区| 26uuu成人影片| 日日噜噜夜夜久久亚洲一区二区 | 国产精品免费视频人成| 日韩综合97p| 看黑人AV不卡| 强奸乱伦亚洲第一页| 天天综合站| 色97| 高清无码一区二区三区| 亚洲图片欧美另类综合免费视频大大香| 中文字幕亚洲在线一区| 97超碰超碰| 青青操在线亚洲视频观看欧美在线| 搡老女人老妇女AAA一VU麻豆 | 天天澡天天爽日日av| 一区在线观看中文字幕| av网站在线看| 97超色| 青娱乐av在线| 97人人操人人摸人人爱| 97在线免费看视频| 女人的天堂大香蕉网| 蜜桃无码AV一区二区| 97这里只有精品| 亚洲凸凹超碰成人| 日韩有码一区三区| xxx0国产在线播放| 大奶的诱惑| 爱妻综合网| 人人喜人人妻| 在线国产一区二区av| 欧美色图综合| 大香交| 青青草在线视频欧美| 99九九精品| 国产操逼视频在线观看| 78精品| 中文久久96| 精品91摸| 婷婷五月天久久久| 国产自产自拍| 久久久性| 少妇熟女一区二区三区| 91亚洲丝袜| 亚欧中文字幕在线视频| 99这里只有精品| 五月天黄色激情视频| 欧美成人A√在线一区二区| 亚洲欧美综合图片| 天天操天天谢| 美女淫穴| 中文字幕二区日韩天堂| 天美麻花大全视频| 成人a大片在线观看| 97综合在线| 亚洲狠狠入| 天堂综合| 欧美日韩精品久久| 欧美亚洲国产自久久| 亚洲综合小说另类图欧美视频激情小说色五月天 | 午夜操操操| 中出后入| 日韩电影天堂视频一区二区| 有码人妻系列| 97人妻色| 午夜精品久久久久久久男人的天堂 | 成人无码在线超碰网| 亚洲中文字幕熟女| 久久 精品| 91久| 久久国产精品m码| 亚洲色婷婷综合久久一区二区三区| 亚洲熟女乱色一区二区三区久久久 | 日韩午夜啪啪视频| 亚洲Av无码成人精品国产| 一起草日韩| 狠狠中文字幕| 另类小说综合网| 无码直播久久久| 手机午夜电影神马久久| 韩国三级一线观看久| 熟妇乱伦一区二区| 岛国爱情动作片在国产AV无码专区亚洲AV漫画 | 日本91白丝| 欧亚洲精品有视频| 一二三四日本视频高清| 亚洲色图久久成人| 黑丝少妇麻豆| 日本啊啊啊啊啊视频| 日本99一区二区| 亚洲视频二区 | 男人的天堂2018.| 欧美天堂日韩三级国产传媒| 欧美亚洲第1页| 色大师网站www永久网站视频| 清清草影| 丝袜色综合| 中文字幕国产| 97超碰日韩| 人人操人人爽人人操人人| av爱爱爱| 搡老女人老妇女AAA一VU麻豆| 国产高清成人mv在线观看| 97摸视频| 亚洲男人的天堂亚洲| 久久理论字幕视频| 色大师网站www永久网站视频| 9久精品视频在线观看| 搡老女人老91妇女熟女| 91天堂丝袜美腿| 久久精品—区二区三区内射| 青娱乐999| 午夜无码精品免费看性色| 中文字幕一区日韩精| 人人天天欧洲| 精品小视频在线| 无码九九九九| 亚洲情欲| 美国人人操人人操| 免费AV播放| 伊人国产av| 天天综合网亚洲综合网| 人妻丝袜日本| 国产一区二区在线播放量| aaaa少妇高潮大片| 97WW精品| jiujiujiujingpin| 日韩一级二级三级| 国产高清精品一区二区三区毛片| 搡老熟女老女人老熟妇免费视频| 熟女人妻av在线资源,黄色的资源| 第45页一区二区| 亚洲图片视频小说| 亚洲一区中文精品| 亚洲偷拍自拍在线视频| 丰满翘臀美女影院视频| 久久久精品视频欧州站| 精品九九九九| 玖玖爱免费观看视频| 啊啊啊啊啊啊在线看| 亚洲少妇激情一区二区三区| 老女人综合网| 色色色色网站| 青春草A| 婷婷色香伊人| 成年人性爱日韩| 一区久久久二区| 毛片99-全集电影手机免费观看完整-B029AV| 99国产精品| 亚洲各类熟们中文字幕| 91在线色| 亚洲欧美天堂| 色婷婷狠狠18禁| 日欧毛片久久| 秋霞色色影院| 色综合久| 97久久天天综合色天天综合色电影| 26uuu久久| 欧美日韩成人在线| 青青青草伊人精品| 翔田千里无码中出中文字幕| 亚洲五月丁香花狠狠干一区二区三区 | 亚洲精品97在线| 久操频道免费在线呗看| 在线观看AV片| 久久久性爱视频| 成人羞羞视频国产| 精品人妻伦一二三区久久| 久草老司机| 综合 欧美 亚洲 日本| 国产农村妇女精品一| 99re99| 色色无码| 精品少妇99| 日韩在线观看中文字幕视频| 人妻少妇久久中文| 四虎影视永久在线免费| 男人的天堂欧美| 乱伦日本中文自拍| 日本熟妇熟色97一本在线观看| 亚洲AV色图| 色综合色色| 九九九九九九精品| 国产精品成人无码av| 加勒比av网| 中文字幕狠狠玩| 超碰 国产熟女精品一区| 国产精品自拍xxxx| 欧美色日| 中文字幕亚洲热播人妻| 亚洲凸凹超碰成人| 岛国黄色短视频| 91国精产品| 玖玖玖玖精品国产剧情| 亭亭在线资源| 精品在线观看视频在线| 日韩综合色网| 五月丁香婷婷综合网| 色色操| 久久亚洲精品成人av| 国产一级片| 嗯嗯嗯啊啊在线观看| 久精品无码av一区二免费国产在线观看| 国产肏屁眼视频| 欧美性爱日韩性爱| 日本久久综合| 久操网址| 91亚洲狠狠色| 99热思思| 91亚洲色图| 91jk色拍| 97人妻免费中文字幕| 久久久久久久久国产| 国产欧美日韩在线不卡第一页| 9.1小视频| 天天做天天爱天天爽| 超清中文乱码字幕| 中文字幕在线观看网页| 精品久久久久久无码| 无码人妻精品一区二区三区九九| 日本Xx性爱| 狠狠色五月亚洲91| 久久精品欧美一区蜜桃| 超碰在线人妻中文字幕| 综合av影片| 久草大| 国产强奸无码乱伦| 亚洲色图欧美另类在线| 人人操人人大香蕉| 一起草视频在线| 97爱爱影院| 国产91久久九九免费精品无码| 九九九九精品视频| 精品视频专区| 国产精品老师| 日韩av无码网站| 日韩大香蕉精品在线视频| 大香蕉手机视频| 国产成人超碰在线| 97国产综合欧美| 欧美后进式| 性爱视频无打码在线观看| 欲色综合| 加勒比日本在线| 色婷婷综合网站| 岛国福利在线精品播放| 怡红院网站在线视频| 日本一二区免费| 免费操逼视频下载| 91狠狠综| 激情文学小说一区二区| 日韩中字av一区| 熟女人妻一区二区三区| 蜜臀视频网站| 997色在线| 91色图片| 五月天社区| 欧美一级特黄淫片在线观看| 天天爱天天操| 日韩精彩视频| 激情露脸爱| 91久热| 免费簧片在线观看| 97超碰站| 97久久综合网| 日韩不卡网操逼中文字幕日韩| 女优视频第10页| 手机看av网站在线看| WWW操逼| 欧美日韩中文视频播放| 国产外初女出血视频| 97人人爱人人做人人乐| 久久久久成人蜜桃精品| 在免费jIzzjIzz在线视频| 人人操人人摸人人看人人插| 国产97免费视频| 日韩精品人妻中文字幕不卡乱码| 欧美熟女妇同| 日韩 人妻 精品| 狠狠狠狠狠狠| 无码抄逼网| 日本免费人成视频播放120秒| 一区在线精品中文字幕| 欧美亚洲特P| 国产精品一二三| 日韩三级性| 日韩欧美天天爽爽爽天天爽爽| 亚洲不卡av在线| 99丝袜福利在线播放| 九九热精品视频在线观看| 日韩激情啪啪| 天天天天天天天天天天干美女| 久久精品欧美一区二区三区不卡| 无码国产精品96久久久久孕妇| 91精品人妻一品二品三品| 人伦四五区| 亚欧美色图| 懂色影视久久| 中文字幕精品三级久久久| 欧美熟女丝袜| 欧美日韩亚洲五月天婷婷| 91草草草| 欧美精品三区| 96久久久精品| 91国内外在线| 伊人96在线| 欧美亚洲韩国视频十五区| 女人天堂网| 亚洲中文sv| 亚洲美女精品九九视频| 日本媚薬中文字幕在线| 色97干| 东北毛片| 超碰精品日韩欧美国产| 色欲Av人妻精品一区二| 免费观看网黄| 中国大陆国产高清AⅤ毛片| 草草影院日本第一页| 美国aaaaa一级黄片| 欧美一级黄色18片免费看| 亚欧性爱在线无码| 这里只有精品视频在线| 又大又黄国产| 九九英色视频| 91激情综合| 啊啊啊 在线| 好吊色综合| 亚洲春色一区二区三区| 国产精品永久免费10000| 超97在线精品视频| 97亚洲中文| 狠狠2050在线观看| 不卡六六在线91| 青青久久艹| 我要去看2个日本美女.com曹逼| 人人看黄色视频| 约操熟妇| 久久伊人大香蕉| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 亚洲色啪| 久久秀这里有精品| 伊人国产视频| 97色欧洲| 国产福利一区二| 综合影视国产无码| 床上啊啊啊一区二区三区| 91久热| 97久久国产| 亚洲成人性爱网站在线播放| 乱伦系列一区二区| 亚洲欧洲小说图片视频 | 久草婷婷| 91伊人影视综合| 亚洲脚交| www久久国产精品| 探花一区在线| 精品人妻1237| 91美女视频电影|