国产成人欧美一区二区三区vr_久久国产精品人人爽人人爽_国产精品永久免费播放_肉欲啪啪a∨无码精品一区二区_国产超短裙jk丝袜在线_亚洲AV片高清资源在线观看_国模无码一区二区三区久久_国产成年人未进视频_中文字幕无码精品夜_一区二区三区在线视频免费看_亚洲成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
返回資訊列表
69少妇一区二区| 久久亚洲AV成人精品无码| 欧美嫩性色| 亚洲激情综合另类男同| 97亚洲色图| 97干天天| 婷婷四五区| 国产精品无套内谢| 91在线欧美| 亚欧操逼片在线观看 | 日本506070| 啊啊啊在线观看免费视频| 激情视屏国产乱伦强奸| 激情天天视频| 日韩成人人妻网站| 国产成人主播| 性色高清在线| 九九热视频这里只有精品| 亚洲第一综合| 极品色社| 亚洲天堂综合AV| 欧美日韩婷婷中文| 欧美色自拍| 欧美日韩人人精品| 神马久久久久眼| 狠狠色噜噜狠狠狠狠狠色综合久久| 神马久久午夜| 久久精品国产精品一区| 五十路熟女人妻一区二区在线观看 | 午夜福利视频在线一区| 国模限制级电影| 激情综合网五月婷婷五月天| 五月丁香社区婷婷日韩欧美精品影院 | 亚州五月| 蜜桃久久一区二区| 夫妻天天操岛国视频| 91欧| 午夜毛片亚洲精品片国产久久久| 色九久| 九久久精| 啊啊啊啊好爽好舒服一区二区易域| 国产情色第一第二页在线观看| 97视频网站在线观看| 啊啊在线| av绯色| 看日韩美女二区三区免费操逼视频| 亚洲女毛多水多21P| 日韩乱伦影音先锋| 久久性视频| 狠狠综合网| 久久性爱视频| 亚洲情色1区| 99啪啪视频| 少妇内射www在线观看视频| 久久超碰av在线| 欧洲自拍第一页| 全国男人天堂网| 欧美78P| 伊人骚琪琪亚洲天堂网站| 色噜噜国产精品视频一区二区| 欧美人妻制服| 青娱乐老司机视频| 国产激情在线观看| 麻豆 欧美 日韩| 欧美日韩大陆黑人少妇99| 96久久精品一二三区色欲| 日韩精品高清资源在线| 91精品人妻一区二区-全集完整版免费正片国语-B02AV | 97一区二区三区视频| 久久久啊啊啊| 亚洲成人精品在线一区| 午夜爽爽爽在线观看永久入口姬片| 亚洲欧美自拍偷拍| 男人的天堂久久| 天天狂操夜夜狂日| 亚洲精品a人片在线观看视| 色五月激情网| 亚洲综合 欧美| 狠日欧美| A片 AV一级在线播放观看免费| 国产成人精品亚洲日本| 精品免费一区二区三区在线亚洲人成| 久久国产精品一区二区| 脫衣舞一区二区三区| 一本久道久久综合狠狠爱| 日韩三级在线观看mp4| 久久激情视频| 国内毛片国产欧美拍| 欧美强奸一区二区诱惑| 亚洲一二三四区机械| 97精品97久久| 91国产操逼视频| 亚洲经典啪啪| 久久精品一区二区三区蜜桃臀| 啊啊啊爽爽| 99热只有这里有精品| 精品免费1| 色爱天堂| 大香蕉国产中文自拍| 日韩无码人妻中字久久三区四区| 日本性爰一道本| 国产suv精品一区二区四| 亚洲,欧美,综合网| 很很干很很操| 不卡视频一区蜜桃视频| 久热九九| 超碰色美女| 亚洲免费成人在线高清无码视频 | 91色综| 97在线观看视频| 免费无码国产精品v片在线观看| 熟妇在线视频一区二区| 人人操人人爽人人操人人| 国产乱码久久久| 国产操伦| 国产美女激情| 黄色大片免费在线| 欧美日韩一干二干| 黑人美精品 A片| 四虎国产成人精品免费一女五男| 国产资源中文字幕在线| 久久人妻丝袜一区二区三| 国产精品久久久久婷婷二区次| 成人午夜无码视频| 91色欧美| 99精品在线| 亚州欧美另类| 精品 码产区一区二-1080P高清在线www-B029AV| 91n免费处女| 无码操逼网| 国产熟女| 日本午夜操逼| 爱爱动态60秒| 超碰 av 女人天堂| 成人av影院在线观看| 97超碰天天爱天天爱| 亚洲综合另类| 爽爽爽免费视频| 精品高清一区二区三区三州| 东京热不卡视频| 亚洲av综合色区无码一| 国产农村妇女精品| 日韩久久艹| 青青操综合网| 国产9l 大屁股| 亚洲熟妇图片| 亚一综合久久久久久久久久| 青青草公开在线免费不卡视频| 这里只有精品视频| 操b在线观看| 九九热精彩视频| 69精品久久久久中文字幕| 久久大香蕉97| 欧美亚洲AN| 97国产精品在线观看| 天操老女人| 欧亚揄拍偷拍精品视频| 大香蕉 222| 亚洲色狠| 亚洲男人bt天堂| 激情五月天中文字幕色| 人人操人人射人人干| 亚洲精品乱码久久久久久蜜桃麻豆| 蜜区区视频79| 天天干2区3区| 亚洲制服欧美另类内射| 在线观看中文字幕| 欧美性少妇| 日韩情色视频| 精品一区二区成人动漫| 尤物黄色在线观看网站| 探花精品 一区二区| 日产成人久久| 香港成人一级视频在线青青草| 日本日逼视频网| 精品人妻丰满熟妇一区二区三| 久久嫩草国产成人一区| 婷婷五月天AV| 手机在线播放国产福利| 日韩在线国产字幕| 91精品导航| 亚洲综合小视频小说在线观看| 乱伦熟女区| 超碰在线香蕉| 免费av高清无码| 色吧91| 久久久久96| 欧美狠狠操| 日韩精品 资源| 人妻-91porn| 国产精品麻豆成人av| 欧美色道啊| 97国产精品国| 久久综合五月天| 亚洲成熟国产精品美女| 国产www色在线观看| 女人精品内射国产99| 午夜九九| 九九免费影片| 欧美一区二区三区成人性生活| 91天天综合在线| 欧美日韩222| 黑人免费福利视频| 亚洲欧洲无码97久久精品| 超碰天天去日穴| 天天天乱色综合全| 亚洲偷拍欧美激情| 国产AV天美传媒一区二区三区 | 久久天天摸| 九月婷婷久久| 欧美色图偷拍另类| 伊人久久亚洲中文字幕不卡| 亚洲色丰满少妇高潮| 欧美在线55555| 91欧美美女日韩国产婷婷| 色哟哟-国产专区| 青青草亚洲一区| 伊人影院中文字幕| 欧美日韩国产中文精品字幕自在自线,| 久久久人体| 天天综合网一91网| 99re在线观看| 久久久久久久六六 | 91亚洲欧美| 国产精品操| 乱性AV| 岛国在线国产| 国产激情片在线观看| 91狠狠色丁香婷婷综合久久| 天天综合~91入口| 欧美日韩人人精品| 日韩中文字幕宗合在线| 欧美成人精品一区二区男人蜜臀 | 欧美顶级黄片AAAAA在线免费看| 精品久久人妻成人网| 成人丁香五月| 人妻啪| 丁香激情五月天| 亚洲天堂,男人| 江都AV在线| 最新中文字幕av| 蜜桃臀一区二区三区久久| 国产黑白丝在线| 日韩97P| 影音先锋少妇| 亚洲中文字幕网| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 国产性爱在线视频一区二区| 欧美成人午夜免费福利785| 五月激情小说| 情色大香蕉| 成人线上超碰| 操屄不卡视频| 色盈盈影院| 欧美色图97| 亚洲精品99999| 特级特黄一级毛片免费| 九九aV| 国产传媒1234区| 亚洲精品97久久中文字幕| 香蕉欧美| 男人的天堂2010| 亚洲男人天堂2016| 综合伊人网12色| 97干在线视频| 久久精品国产99国产精品亚洲| 97精品97久久| 欧美探花网| 大香蕉免费中文| 亚洲综合图片在线| 99久久精品国产系列| 日本性爱网址| 99在线观看无大码| 成 人 A V免费视频在线观看| 黄色欧美性爱视频| 最新精品久久蜜桃 | 67194国产| 国产欧美后入| 日韩99精品视频综合区| 一区中文字幕二区日韩| 亚洲综合首页| 久久九九综合| 性天堂| 国产一级片| 国产一| 日韩精品碰碰| 青青草日本中文字幕| 91肉丝| 精品视频久久久久九九九九9999| 91久热| 人人操人人大香蕉| 天操天操夜操夜月月年年操操| 久久性生大片免费观看性| 开心五月婷婷激情| 夜夜夜爽www精品视频| 家庭乱伦网站国产| 另类欧美| 一区二区三区视频在线观看免费| 欧洲精品欧洲精品| 天天干天天狼在线视频| 久久99久久99精品天美传媒棢·纸:. | 伊人久久AV诱惑悠悠| 韩国一级婬片A片AAAAA| 国产精品另类一区大香蕉| A 天堂在线观看视频| 天天内射| 日本在线视频导航| 亚州欧美色图| 性色国产东北露脸精品视频| 欧美日本中字另类在线| 欧美日韩青操| 国产无马av| 亚洲欧美骚| 熟女人妻久久中文字幕一二区| 超碰人人干天天射| 超碰97网址| 久久精品欧美一区二区三区不卡| 欧美亚洲激情一二三| 不卡啪啪视频| 九九热九九| 吉田爱美AV在线| 黄片免费久久久久久久| 懂色AV网| 欧美色九九九| 奇米狠999| 大香交| 天天干天天干天天干| 校园春色五月天| 粉嫩国产精品久久久| 自拍视频一区在线观看| 一区二区视频在看| 5252色欧美在线| 久久久亚洲欧美综合| 日韩欧美麻豆| 91爱看| 亚卅熟女乱色| 翔田千里Av在线| 99热国产精品| 欧美黑人性猛交91| 日韩成人精品视频自拍| 天天看精品动漫视频一区| 操淫穴亚洲五月丁香 | 少妇滛荡视频| 日韩性爱视频在线免费观看| 91爱啪| 亚洲 综合 第一页| 亚洲加勒比久久日本道| 欧美在线 亚洲| 激情小说五月天| 精品欧美А∨无码黑人大荫蒂| 78精品| 四虎在线播放| 动漫av中文| 黄色视频特级毛片| 欧美在线永久天堂| 天天欲望网| 极品AV网站在线观看| 婷婷五月天_亚洲小说欧美激情另类_精品久久国产字幕 | 亚洲素人网| 肥臀熟女福利视频一区二区| 久久香蕉网| 淫荡熟女乱伦网| 日产操逼| 精品视频一二三中文| 超碰久久网| 狠狠搞 亚洲91| 五月丁香影院| 五月大香蕉| 日本五十路熟女一区二区| 无码动漫av中文字幕| 天天狂操夜夜狂日| 97久久久久| 亚洲精品九九九九九九| 午夜精品久久久久久久99| 久偷拍| 极品粉嫩一区二区| 亚州情色j区| 这里有精品| 色色婷婷五月天| 免费啪啪啪网站18岁| 久久久无码av精| 亚洲精品国产熟女| 亚洲精品无码成人久久久99| 97人妻免费中文字幕| 亚洲免费成人在线高清无码视频 | 狠狠 91| 亚洲激情av| 国产 三级自拍| 韩国一级婬片A片AAAAA| 婷婷综合五月天| www.丁香五月| 懂色综合久久久| 国产少妇与亚洲av| 亚洲s在线观看| 中文字幕在线观看AV| 久极品在线观看| 自拍丝袜美腿人妻| 欧美色图 人妻| 亚洲男人综合网| 欧美在线中M| 国产人妻精品一区二区三区秋霞| 蜜臀va69| 青娱乐休闲视频在线观看| 欧美日韩国产成人高清| 免费在线黄片视频| www.狠狠| 伊人大香蕉在线| 蜜臀99999| 九九九九一级| 久久在肏| 欧美日韩午夜精品一区二区三区| 嫩草影院在线观看精品 | 吊色| 色路综合| 思思热在线视频免费| 国产日韩精品人妻久久久久色欲网站| 人妻系列无码专区中文有码| 日韩在线76| 亚洲第一页欧美| 97精品97久久| 人妻铁牛TV| 91人妻最真实刺激绿帽| 大香蕉520| 99啪啪视频| 91伊人久久在线| 97超级久久| 成人无遮挡毛片免费看| 免费一级欧美片片线观看| 成人夜夜爽| 久久久禁| 色激情综合网站| 九月丁香综合网| 一二三四日本视频高清| 亚州操逼图| 99性视频| 超碰97在线色男人??| 中国一级αV| 国产精品视频白浆免费| 精品人妻一区二区三区-国产| 国产地址二三| 91欧美网| 亚洲国产麻豆一区二区三区| 99热精品国产| 日日摸天天爽夜夜欢| 三级网色| 麻豆婷婷成人一二三| 色97欧美| 欧美专区日本专区| 91在线丝袜视频| 毛片一区二区| 天天爽爽爽爽| 激情五月天丁香| 国产欧美日韩女同性恋ww喷水精品 | 国内毛片婷婷六月色| 99色在线| 亚洲风情在线观看| 欧美做爰无码A片视频| 国产丰满熟夫69mpp| 97操| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 亚洲精品无码少妇久久| 2017大香蕉国产精品久久| 日产操逼| 大香蕉在线86| 欧美偷拍区| 欧美久久婷婷| 国产强奸乱伦xd| 亭亭丁香激情| Sekablack无码一区| 插入综合网| 久久中文字幕在线观看| 91久久精品蜜臀| 97久久久久| 亚洲成人免费在线| 99热99在线| 国产九九九九九九| 亚洲最大网站av| 天天综合网亚洲综合网| 国产精品无码论坛| 91欧洲入口| 中文字幕精品资源在线| 欧美中日韩XXXX| 色999亚洲人成色| 亚洲无码一区成人免费午夜| 亚洲精品丝袜-不卡成人免费……| 欧美高清91| 青草视频在线看看看看看看看看看| 久久免费中文字幕在线观看| 清纯唯美综合| 欧美精品四区| 午夜国产成人精品视频| 熟女天天干| 国产精品久久99日日| 嗯~啊~快点 死我视频免费看网站| blacked精品一区国产| 黄色一区三区| 久久精品一区二区三区不卡| 日本中文字幕不卡视频 | 久久中出| 超碰综合色| 日韩久久.一级黄色片| 少妇久久久免费| AV九九| 国产精品美女| 青青欧洲黑| 操人无码| 日韩在线性爱免费视频| 久久精品一区一起草| 欧美性爱五月天| 四虎午夜影院| 国产女主播视频在线观看| 婷婷精品视频| 人人看人人插| 欧美在线电影| 欧美性生活内射| 日本99久久| 久久精品国产亚洲妲己影视| 玖玖无码超碰| 亚洲AV成人精品网站在AV| 日韩精品9999| 91ise欧美| 日韩视频啪啪| 男人女人18禁片免费看网站| 熟女高潮精品一区二区| 午夜天堂精品久久| 99性爱视频| 日韩亚洲精品一区二区| 日日摸日日碰夜夜爽视频| 九九自拍伦理| 久久免费中文字幕在线观看| 五月天黄色激情视频| 亚洲自拍偷拍视频在线| 99久久免费看精品国产一区| 天天天天天超碰| 欧美黑人猛交春色影视大全| 国产浮力影院第1页| 亚洲大色堂| 六十路日本| 蜜乳av一区二区| 搡老女人老91二区| 成人AV在线网站| 蜜屁Av| 1024亚洲中文字幕久在线看片你懂的| 在线观看精品国产免费| 91视频伊人| 精品人妻一区二区三区日产| 99久在线精品99re8| 鸥美插入视频| 青青草吊丝| 日韩97超碰中文字幕| 极品白嫩美女白浆成人福利在线看| 亚洲精品性爱片| 无码高清操逼| 久 久无码人妻AV| 久久久一区二区三区麻豆| 国产91影院| 丁香五月天啪啪| 精品对白久久不卡| 午夜毛片高清免费不卡| 韩国久久97| 国产高清无码一区三区二区| 在线二区不卡| 大肉棒导航| 北京专精特新企业招聘信息| 日本女人操逼| AV不卡在线| 天天干人人看综合| 风月影院十八禁| 精品无av| 99re6在线视频精品免费完整版安卓版| 欧美成人都市人妻| 婷婷精品视频| 日韩人妻资源在线看| 日本激情免费大片| 综合在线导航一区| 日本操逼视频导航| 爱媛媛久久国产福利| 精品美女久久久久| A级毛片在线看免费| 2017av无码免费无线播| 欧美日日操| 欧美Ⅴ性爱| 亚洲无码电影久久久| 欧美日韩中文字幕人妻| 人妻娇喘 激情视频| 99999亚洲另类| 天天干18禁| 水多多映视AV| 久久中文字幕一区不卡| 国产操逼视频在线观看| 中文字幕中文字幕一区二区| 婷婷深爱五月| 97爱免费插| 亚洲天堂另类小说男人| 亚州欧美总和| 国产精品久久久| 国产后入| 亚洲乱码尤物193YW| 色综合天天| 一区二区不卡| 丝袜AV一区二区三区| 久久男人精品| 久jiu久神马影院| 泰国AV在线观看| 无毛精品| 91丨熟女丨丰满熟女| 91色黑人少妇| 亚洲女人91| 亚洲免费成人在线高清无码视频| 99爱精品| 精人妻一区二区三区| 国产乱伦性爱区| 香蕉在线一区二区三区| 情色大香蕉| 狠狠色噜噜狠狠狠狠狠色综合久久| 美女黄频a美女大全免费皮| 神马午夜久久久| 色欧洲| 女人被添高潮免费视频| 亚洲日韩久久精品一区| 夜夜操青青草| 在线亚洲精品久久久| 亚洲毛片久久| 五月天色综合| 色五月AV| 国产超碰在线一区| av网站在线看| 成 人 影视 一区 二区 三区 四区| 亚洲欧美清纯| 欧美日韩性爱精品| 大香蕉伊人75| 丰满人妻-区二区三区免费| 99夜夜操| 亚洲第一页欧美| 91在线精品一区二区三区| 欧美色九九九| 再深点灬舒服灬太大了添视频| 国产精品久久久777| 国产人妖视频一区在线观看| av草草在线电影| 亚洲综合五月天| 污色区网站| 亚洲图片 激情小说| 久久东京伊人一本到鬼色| 欧美色图人妻| 另类图片五月| 久久美女福利是上海美女| 少好三P| 人人喜人人妻| 91精品无码人妻系列| 91制服丝袜中文字幕| 91女网站| 成年男人的天堂| 美国日韩黄色片| 亚洲图片小说欧洲| 日韩ab网 | 午夜男人天堂| AA特级绝黄| 亚洲91网| 91N综合网| 久久久国产精品亚洲精品| 久操综合在线| 欧美劲爆视频一区二区| 国产女人成人精品视频| av日韩中文字幕| 粉嫩在线一区二区懂色| 高清孕妇孕交 交| 91天天爱| 伊人国产视频| 嗯嗯啊好大| 91 国产丝袜在线放观看| av资源在线播放天堂| 国模无码一区二区三区在线| 亚洲AV麻豆Aⅴ无码电影一| 久久精品28| 91国产丝袜白虎| 好湿好紧视频| 日韩精品一区二区人人人| 日本性爱欧美性爱| 收看日本人日bb| 亚洲人妻中文在线视频| 一二三四视频中文字幕在线看| 久久精品国产精品一区| 亚洲欧洲成人在线电影| 日日骚中文字幕| 国产一区二区免费福利片| 一级黄碟在线看| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 国产尤物AV尤物在线观看不卡| 日本一区二区三区四区免费观看| 日本免费中文字幕在线| 亚洲第一成人影院色播| 欧美.亚洲.另类.丝袜.制服.诱惑| 麻豆 欧美 日韩| 97色涩| 亚洲风情综合网| 日韩无限资源| 欧美日韩中文亚洲v在线综合| 亚洲精品啪视频| 激情五月综合网| 亚洲 欧美 另类 日韩 人妻一区| 欧美天堂亚洲电影院一区在线播放| 大香蕉人妻久久| 国产女人高潮嗷嗷嗷叫小说| 色综合久久888| av72网| 亲子敌伦对白在线播放| 四虎免费看黄| 日本色日夜干| 狠狠干综合| 日韩丨制服丨中文|在线| 九九九九九九视频免费| 韩国一级做A片免费的| 日韩熟女精品无码专区一区二区| 91欧美巨乳| 亚洲电影中字一区二区| 成年男人的天堂| 男人天堂最新手机版在线青青草| 精品视频一区二区| 精品人人| 探花视频免费观看国产专区| 六月天婷婷| 懂色AV网| 国产最新AV| 国产精品播放| 久九九九九九九热| gogogo免费高清看中国国语| 综合激情97 | 国产无码成人无码| 99999精品成人| 欧美AAAA黄片| 999 久久久| 欧美人妻久久精品二区三区| 中文字幕人乱码中文字的预防方法 | 色婷婷影院| 天美传媒婬乱在| 韩国三级三级BD在线| 免费一级黄色录像影片| 玖玖超碰熟| 婷婷午夜| 1级黄色夫妻对换性交免费看| 99抽插| 午夜超爽| 9丨久久九九九| 亚洲男人天堂网久久| 97视频网站| 日产123区精品免费观看| 日本熟妇人妻中出视频| sewuyueav| 人妻少妇精品久久久| 成人电影一区| 久久午夜鲁丝片| 久久伊人影院| 久湿久久| 五月天婷婷欧美三区| 思思热在线视频免费| 美女黄色91| 蜜奶av| 婷婷五月天激情网| 青青操狠狠撩| 亚欧免费| 人妻天天爽天天爽三区| 超碰欧美97资源| 北京美女一区二区| 91痴汉| 国产美女口爆吞精| 亚洲中文字幕日产无码久久| 亚洲美女精品| 日本超碰在线国产一区| 亚洲精品亚洲人成人网| 国产一区二区三区精品观看啪| 国产品精品自在在线午夜免费| 欧美在线大香999| 另类成人首页一区| 久久久无码精品人妻二区| 欧美99999| 精品无码欧美三级| 国产精品麻豆免费视频| 思思热免费在线视频| 国产一级舔足在线观看| jazzjazz国产精品麻豆| 亚洲国产成人精品999| 亚洲欧美综合| 超碰精品日韩欧美国产| 色黄污美女啪啪啪免费网站| 91人妻人人澡人人爽人人精品| 欧美色欧美| 97超碰色色| 另类图片欧美激情综合| 久久精品国产亚洲AV高清演员表| 岛国网址国产 | 欧美色999| 欧美日韩国产色五月综合在线| 91色鬼| 91精品久久久久久77777| 情色五月天网| 青青在线视频日韩欧美| 2001天天操| 欧美一级A片在线看视频性色| 欧美 亚洲 偷拍自拍| 亚洲三级网址久久最新| 99视频自拍区| 97久久国产| 久艾草在线精品视频在线观看| 91最新综合| 啊啊啊啊好疼视频| 黄色无码高清黄色无码网站| 操比国产| 超碰1024久久| 日韩熟女无码| 欧美亚洲第一页| 白 大 人妻 区 在线| 国产精彩女在线观看视频| 日本成a人v网站在线观看| 欧美在线观看综合国产| 久久这里| 91亚洲色人| 日产国产精品中文久久婷婷| 中文字幕视频在线观看| 国产精选三级在线观看| 国产一区二区久久| 91伊人久| 午夜精品久久999热蜜桃介男人用| 国产精品免费久久久久久久久久| 五月综合色| 极品色综合| 久久男人的天堂国产| 久久精品久久久久久久| 久久曰曰| se吧提供91精品国产91久久久久久 | av操操不卡| 欧美色女人| 99re6国产精品99re在线| 嗯嗯啊好爽| 另类亚洲图色| 日韩精品1区2区中文字幕| 午夜无码熟妇丰满人妻| 激情五月天社区| 玖玖久久久| 亚洲综合113页| 乱论91| 久久久精精精| 99re3这里只有精品| 一区二区三区 日韩欧美| 国产美女口爆吞精| 超碰精品在线| 日韩性爱1级片视频| 久久久涩| 国产精品久久久久久久免牛肉蒲团 | 男人的天堂不卡一区二区| 亚洲欧洲自拍图片专区满春格| 蜜桃色院一区久久| 五月天开心网| 五月激情小说| www狠狠| 日韩一级特黄av毛片| 深夜国产福利| 天美av在线| 夜夜夜夜爽| 蘋果手機免費看成人Av| 78p欧美| 噜噜噜狠狠色综合| 国产精品熟女丝袜一区二区| 四虎影视永久在线免费| 久久久久久69国产一区二区| 九九亚洲| 羞答答AV中文字| 中文字幕一区二区无码成人| 9999亚洲精品| 日韩噜噜69| 制服中出中文人人精品| 大香蕉2017| 人妻 制服 日韩 中文 在线| 欧美91网站| 国产高清在线观看欧美| 国产精彩女在线观看视频| 黄片在线免费在线观看| 久热这里只有精品9| 女同在线视频一区| 国产一区二区免费福利片| 日本东京热大香蕉a片| 91精品人妻电影| 91丝袜| 国产熟妇一区二区| 国产精品岛国片在线观看| 欧综合网| 日本人妻天堂网站在线播放| 91黑人无码激情在线| 亚洲综合20p| 狠狠躁天天躁日日躁| 国产一区二区视频在线播放| 国产精品com| 久操av在线| 嗯嗯啊中文字幕| 国产一级内射无挡观看| 欧美性夜| 天堂综合| 99爱久久视频频| 欧美劲爆视频一区二区| av毛片aaaaa免费看| 97 国产精品| 歐美一級亂黃99在綫精品| 国产农村一一级特黄毛片| 国产精品久久久久久久久久梁医生| 亚洲女人毛茸茸91| 亚洲永久永久永久永久一级一级一级精品| 五月婷婷爱六月丁香色| 国产亚洲精品美女久久久| 97超碰色色| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 久久久夜夜嗨免费视频| A一区片| 亚洲熟女综合一区二区| 天天综合网合集91| 青草香蕉网| 亚洲精品久| 丁香五月色情| 国产强奸超碰AV| 午夜国产乱伦视频| 明星性猛交ⅹxxx乱大交| 理论久久婷婷网8| 天天综合网合集91| 久久久久78| 国产AV天美| 中文字幕一二三区| 国产精品一区二区在钱播放| 久久久久9999| 操逼逼无码| 天天射天天色成人| 白丝AV网站| 97超碰69| 日韩成人色图| 亚洲色吧网| 91粉芽高清在线一区二区| 大香蕉黄色一区| 激情五月天丁香社区| 在线综合色| 国产男人又猛又粗又爽| AV不卡在线| 亚洲最新中文字幕免费| 99精品视频在线观看免费| 午夜视频久久久久一区| 国产91会所女技师在线观看| 试看60秒 爽| 欧美在线91| 少妇久久久久久| 青春草莓视频在线观看网址| 秋霞Av理论一级在线| 2023天天操夜夜操| 久久天天艹| 天天色天天干天天爱| 日本免费专区| 国产精品无码在线| 国产成人精品日本亚洲语言| 午夜免费福利视频一区| 午夜婷婷| 九九热免费国产视频婷婷伊人| 91爱综合| 精久久久91| 久久熟女久| 久久精品操| 色婷婷一区二区三区久久| 一区二区三区美女超清| 久草精品国产99| 国产精品极品美女视频| 色色色色网站| 美女露胸露奶头| 人妻酒店出差被中出免费在线播放| 试看福利| 日韩欧视频| 国产精品ww久久| 免费一级精品啪啪视频| 国产综合永久精品日韩鬼片| 婷婷丁香六月天| 日韩国产品视频中文字| 都市激情人妻一区二区青青操视频| 9999久久久久| 色欧美亚洲| 不卡av在线中文字幕| 欧美日韩性爱精品| 啊啊啊啊视频免费| 很很很很操| 999999精品| 久久中文字幕一区不卡| 麻豆区久久久久亚| 久久精品导航| 乱伦一区二区三区‘| 免费观看啪视频| 日韩AV一区二区三区三州三州| 老熟妇一区二区三区啪啪| 网友自拍第1页 | 色色色网站| 国产熟女| 欧美+日产+中文| AV网站高清无码在线观看| 久久九九99| 神马久久69| 亚洲人天堂| 国产AV无码AV| 国产精品对白内射| 日韩欧美三级| 久久五月天婷婷丁香中文字幕| 欧美激情五月天| 97精品国产精品免费观看| 香蕉视频欧美一卡二卡| 欧美人妻精品一区二区| 曰本精品久久久| 久久久啊啊啊| 日本视频一区二区三区| 97色诱| 欧美日韩97| 伊人色综合网电影| 天天射夜夜| 高清有码一区二区| 亚洲色图大香| 亚洲在线综合| 欧美人妻久久精品二区三区 | 亚洲熟妇A V黑人| 无码聚合| 极品久久久久久久久久久久久久| 亚洲天天在线| 久久9视频| 97在线欧| 一级aaaaa欧美中文字幕录像片| 一区麻豆 高清中文字幕| 97超碰9| 香蕉久久国产AV一区二区| 97热视频在线观看| 草草影院日本第一页| 麻豆九九九| 国内亚洲高清无码| 天天91~综合入口| 国产搭汕a级片| 久久这里只精品99re66图| 无卡一区=区| 操逼操网| 亚洲骚男同com| 人摸人人操人| 黄久在线| 波多野结衣先锋影音| 人妻人妻天天碰| 99国产在线 精品 视频| 精品中文日韩字幕视频| 欧美一级久久久丰满| 91天天爱| 日本免费中文字幕在线| 久久精品中文| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 9丨久久九九九| 婷婷丁香五月综合| 午夜噜噜噜| 五月丁香六月激情综合| 婷婷午夜清品久久久久久久性色视频观| 91精品丝袜久久久久久| 91精品导航| 日本 成 人 小说 电影 一区二区| 人妻天堂网| 91在线视频免费中出| 肉动漫无遮挡h在线观看| 麻豆影音天美视频| 草草影院日本第一页| 久久精品成人一区二区三区蜜臀| 69精品久久久久中文字幕| 九九九九热只有精品| 久久性爱视频| 亚洲午夜未满十八勿入网站日本又色又爽又黄| 久久99国产综合精品女同| 一级二级三级黑人无码| 国产亚洲日本| 成人av免费观看| 视频一区二区免费在线| 黄呦呦在线| 欧美 亚洲 偷拍自拍| 精品对白久久不卡| 上床不卡网站| 亚洲AV成人无码久久精品播放| 欧洲人妻视频| 亚洲欧美爆| 国产成人bd在线观看| 综合色区偷拍| 欧美狠狠操| 人人爱人人操人人性| 精品国产乱码久久久久久蜜臀| 97人人中文网| 黑人黄片在线免费观看| 97精品网| 亚州高清色综合| 天天射影院| wwwxxx日本爽| 日本二三四区| 最新精品久久蜜桃| 99久久九九| 翔田千里AⅤHD无码| 九九九不卡| 超碰精品| 久久一二三四五六七八九区区区 | 亚洲精品久久久久久久久豆丁网| 人妻中文字幕精品无码| 偷拍盗拍亚洲色图图片 | 欧美乱伦专区| 久久九九热| 亚洲精品天天影视综合网 | 人澡逼| 美女在线H91| 国产精品青草综合久久| 高潮毛片无遮挡高清免费| 久久精品国产亚洲av水密被窝| 亚洲和欧美裸体美女双飞视频| 婷婷五月天福利| 一,爱啪啪,在线免费视频| 在线午夜成人无码视频| 桑老女人九区| 人人超碰在线观看黄| 极品色社| 色99视频| 大香蕉一线视频| 国产日韩色综合| 久久久久国产精品久久久| 色原狠狠天天天| 久久大精品乱码视频人妻熟女| 九久9热| 校园春色 男人天堂 | 日本免费一区二区不卡| 情色五月天久久久| 丝袜熟女2P| 人妻久久久久久| 久操不卡视频| 成年人一级黄色毛片大全在线观看| 最新无码国产| 久久精品人妻一区| 午夜超碰| 麻豆精品.欧美精品.日韩精品.| 丝袜天堂网| 蜜臀无码一区二区| 亚洲的天堂网| 美女主播色欲91抠b在线播放| 99re3这里只有精品| 97资源超碰| 久久久草成人网站久久久草成人久久久草久久久 | 涩五月婷婷| 99久久婷婷国产综合| 久久久久斤小| 欧日韩不卡视.频| 婷婷伊人綜合中文字幕小说| 国产亲戚伦亲在线| 国产精品色片一区二区| 久操com| 多毛小伙内射老太婆| 精品人妻1区| 欧美综合娱乐久久| 日本激情免费大片| 人人摸人人添人人操 | 日本1区2区不卡视频| 欧美福利视频啊啊啊啊| 亚洲欧美日韩制服另类| 亚洲精品自拍| 日韩无码操逼片| 欧美操逼熟女| 簧片免费看视频| 久操操|