欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,av无码精品一区二区久久,欧美性爱视频不卡一区三区,欧美乱人伦视频在线观看,国产一级牲交高潮

ARTICLE DETAIL

資訊詳情

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

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

前后端JSON交互實(shí)戰(zhàn):從序列化配置到線上排查全指南 很長一段時(shí)間里我前后端分離的項(xiàng)目一多就發(fā)現(xiàn)一個(gè)特別有意思的現(xiàn)象兩邊同事明明都覺得自己沒寫錯(cuò)接口一聯(lián)調(diào)就開始扯皮。前端說后端接口返回的JSON字段對不上后端說前端傳的JSON格式我解析不了。這類問題聽上去是小事可一旦進(jìn)入線上輕則功能白屏重則數(shù)據(jù)錯(cuò)亂。所以后來我專門把JSON交互處理這套東西整理成了一套筆記這次干脆把筆記改寫成一篇可以直接拿去參考的實(shí)操文章。這篇文章圍繞的就是一件事前后端之間、服務(wù)與服務(wù)之間的JSON數(shù)據(jù)到底怎么做到“發(fā)得出去、收得回來、兩邊都看得懂”。我會從JSON的本質(zhì)、Java里的JSON處理庫選型、Spring Boot中JSON交互的落地配置一直聊到自定義序列化器和線上排查手段。內(nèi)容不算難但信息量不小適合剛接觸接口開發(fā)的初學(xué)者也適合被JSON解析問題折磨過、想系統(tǒng)梳理一遍的后端開發(fā)。1. 從一次前后端聯(lián)調(diào)事故說起JSON交互到底卡在哪1.1 前后端各說各話的典型現(xiàn)場我印象很深的一次事故發(fā)生在某電商促銷項(xiàng)目聯(lián)調(diào)階段。后端寫了一個(gè)商品詳情的接口返回的是這樣的結(jié)構(gòu){ code: 200, data: { goodsId: 12345, goodsName: 某品牌保溫杯, createTime: 1719820800000 }, msg: success }結(jié)果前端拿著這個(gè)JSON直接懵了我要的商品名是goodsName你給我的字段倒是這個(gè)可createTime為什么是一串?dāng)?shù)字我們頁面上要顯示“2024-07-01 12:00:00”這串毫秒時(shí)間戳我怎么展示后端同事也很委屈數(shù)據(jù)庫存的本來就是datetime我用接口工具測的時(shí)候看到的也是正常時(shí)間啊怎么一傳到前端就變成數(shù)字了這個(gè)場景各位寫過前后端分離項(xiàng)目的朋友應(yīng)該都不陌生。問題根本不在“誰對誰錯(cuò)”而是兩邊的數(shù)據(jù)契約沒有對齊。后端返回的是Java對象序列化之后的JSON前端看到的是JSON解析之后的對象中間經(jīng)過序列化和反序列化這兩道工序只要有一道工序的配置不一致看到的東西就不一樣。1.2 JSON交互的本質(zhì)一份兩端共同遵守的協(xié)議我把JSON交互拆成三個(gè)關(guān)鍵詞結(jié)構(gòu)約定、序列化規(guī)則、解析規(guī)則。結(jié)構(gòu)約定是雙方對字段名、嵌套層級、數(shù)據(jù)類型達(dá)成的一致意見序列化規(guī)則是后端把Java對象變成JSON字符串時(shí)如何轉(zhuǎn)換類型和格式解析規(guī)則是前端或下游服務(wù)拿到JSON字符串后如何還原成自己需要的對象。三者缺一個(gè)交互就會出現(xiàn)偏差。舉個(gè)最直觀的說法JSON交互就像兩個(gè)人約定用同一種語言寫信。約定用中文是結(jié)構(gòu)約定按語法把想法寫成句子是序列化對方讀到句子后理解意思是解析。如果寫信的人用中文但收信的人以為信里全是英文或者寫信人把日期寫成“7月1日”收信人卻當(dāng)成“1月7日”信息就悄悄變了。所以我在項(xiàng)目里定了一個(gè)規(guī)矩任何接口在動(dòng)工前先寫一份字段對照表。字段叫什么名、什么類型、空值怎么處理、時(shí)間用什么格式、嵌套多深全部寫清楚。這個(gè)習(xí)慣看起來麻煩卻能省掉后面大量“我這邊對你那邊錯(cuò)”的爭論。1.3 交互處理的最小鏈路拆解一次完整的JSON交互鏈路大概是這樣的后端收到HTTP請求取出請求體里的JSON字符串交給反序列化器轉(zhuǎn)成Java對象然后業(yè)務(wù)邏輯處理再把返回結(jié)果交給序列化器轉(zhuǎn)成JSON字符串最后寫進(jìn)HTTP響應(yīng)。前端拿到響應(yīng)后再做一次JSON解析。用代碼表達(dá)就是// 請求側(cè)字符串 - Java對象 String requestJson ...; ObjectMapper mapper new ObjectMapper(); GoodsQuery query mapper.readValue(requestJson, GoodsQuery.class); // 響應(yīng)側(cè)Java對象 - 字符串 GoodsDetail detail goodsService.queryDetail(query); String responseJson mapper.writeValueAsString(detail);看起來只有兩行核心代碼但里面藏著大量細(xì)節(jié)日期類型轉(zhuǎn)成什么格式、枚舉轉(zhuǎn)成字符串還是序號、數(shù)組空的時(shí)候是輸出[]還是null、下劃線命名的字段和駝峰命名的字段怎么映射、對象里有循環(huán)引用怎么辦……每一個(gè)細(xì)節(jié)都可能成為線上事故的導(dǎo)火索。2. 別說“不就轉(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)來看。第一種是閱讀態(tài)也就是你在接口文檔、網(wǎng)頁格式化工具里看到的那個(gè)文本帶縮進(jìn)、帶引號人能直接看懂。第二種是內(nèi)存態(tài)比如Java里那個(gè)帶著屬性、類型、嵌套關(guān)系的對象它活在JVM堆里。第三種是傳輸態(tài)就是HTTP請求體或響應(yīng)體里實(shí)際的字節(jié)流可能是被壓縮過的、被轉(zhuǎn)義過的、按某種編碼傳輸?shù)?。很多解析問題本質(zhì)上就是這三種狀態(tài)之間轉(zhuǎn)換時(shí)出了問題。比如后端把對象轉(zhuǎn)成字符串時(shí)沒配置日期格式內(nèi)存態(tài)里好好的LocalDateTime到傳輸態(tài)就變成了時(shí)間戳再比如前端給后端傳JSON中間經(jīng)過網(wǎng)關(guān)時(shí)被重新編碼中文字符出現(xiàn)亂碼那就是傳輸態(tài)這里出了問題。認(rèn)清這三種形態(tài)之后排查問題會有一個(gè)很清晰的方向先看問題是出在序列化、傳輸還是反序列化。不要一上來就懷疑代碼邏輯寫錯(cuò)了。2.2 String轉(zhuǎn)對象和對象轉(zhuǎn)String遠(yuǎn)不是new一個(gè)ObjectMapper很多新手覺得JSON轉(zhuǎn)換不就是new ObjectMapper()然后調(diào)用兩個(gè)方法嗎表面上沒錯(cuò)但一旦牽扯到復(fù)雜類型事情就沒那么簡單。舉個(gè)例子前端傳過來一個(gè)JSON數(shù)組[ {userId: 1, userName: A同學(xué)}, {userId: 2, userName: B同學(xué)} ]后端如果直接寫ListUser userList mapper.readValue(json, List.class);這段代碼能跑但運(yùn)行到userList.get(0).getUserName()的時(shí)候大概率會報(bào)ClassCastException。原因很簡單List.class只能告訴反序列化器“目標(biāo)是List”卻沒法告訴它“List里裝的是User”。泛型信息在運(yùn)行時(shí)被擦除了Jackson拿到的只是一個(gè)泛型List它只能按LinkedHashMap來解析。正確寫法是用TypeReference把泛型帶進(jìn)去ListUser userList mapper.readValue(json, new TypeReferenceListUser() {});這個(gè)坑幾乎所有寫過Java接口的人都踩過。我當(dāng)時(shí)給新人講的時(shí)候打了個(gè)比方你要快遞員送一箱蘋果光說“送一箱”是不夠的得說清楚箱子里是什么。List.class就是那個(gè)沒說清楚的“一箱”而new TypeReferenceListUser() {}就是“一箱蘋果”。2.3 為什么空值、特殊字符在轉(zhuǎn)換中最容易出問題序列化和反序列化里最容易出問題的不是常規(guī)數(shù)據(jù)而是邊界數(shù)據(jù)??罩稻褪堑湫?。后端有一個(gè)對象某個(gè)字段是null默認(rèn)序列化之后這個(gè)字段可能直接消失也可能輸出null取決于全局配置。前端如果寫死了要取這個(gè)字段拿到的卻是undefined頁面上可能就渲染異常。特殊字符是另一個(gè)重災(zāi)區(qū)。JSON字符串里如果包含換行符、引號、反斜杠序列化時(shí)必須正確轉(zhuǎn)義否則生成的JSON就是非法JSON前端一解析就報(bào)錯(cuò)。更隱蔽的是那些不可見字符比如某些業(yè)務(wù)系統(tǒng)從別的地方復(fù)制過來的文本里帶了特殊空白符肉眼完全看不出來但JSON解析器對某些字符的處理邏輯并不一致同一個(gè)字符串在A庫解析成功在B庫解析失敗。我對這個(gè)問題的處理思路很樸素在所有對外接口的序列化配置里把空值處理策略顯式地定好要么統(tǒng)一輸出null要么統(tǒng)一忽略同時(shí)在接口測試階段就覆蓋“字符串帶引號、帶換行、帶emoji”這類用例別等上線了再由用戶幫我們發(fā)現(xiàn)。3. 三個(gè)主流JSON庫的取舍選型不該只看百度搜到哪篇3.1 三庫差異對照我實(shí)際用下來的感受Java生態(tài)里處理JSON的庫翻來覆去就那么幾個(gè)Spring Boot默認(rèn)自帶的Jackson、國內(nèi)用得多的Fastjson、老牌的Gson。網(wǎng)上關(guān)于它們誰快的文章一抓一大把但真正到項(xiàng)目選型時(shí)我更看重的是穩(wěn)定性和可控性。先說我自己的使用感受。Jackson是Spring Boot的默認(rèn)選擇這意味著在Spring項(xiàng)目里引入它幾乎零成本而且Spring Boot的自動(dòng)配置已經(jīng)幫你把序列化器接好了注解支持也最豐富。Gson是Google出品的API設(shè)計(jì)很簡潔new Gson().toJson(obj)和fromJson兩個(gè)方法搞定大部分場景但功能深度不如Jackson。Fastjson最大的特點(diǎn)是序列化性能在某些場景下確實(shí)快API寫起來也很順手但歷史上暴露過的安全漏洞讓我在核心鏈路上不太敢用它。我做過的幾個(gè)老項(xiàng)目里這三種庫都出現(xiàn)過。有些項(xiàng)目因?yàn)闅v史原因從Fastjson切到過Jackson單純是因?yàn)橥ㄓ眯愿?、社區(qū)維護(hù)頻率更高。Gson我一般只用在一些自己寫的小工具里圖它輕便。3.2 性能不是唯一標(biāo)準(zhǔn)安全性和可控性更關(guān)鍵如果你去搜“Fastjson為什么快”會看到一堆壓測數(shù)據(jù)確實(shí)在某些場景下它的表現(xiàn)不錯(cuò)。但我選JSON庫從來不把性能當(dāng)成第一指標(biāo)因?yàn)閷τ诮^大多數(shù)業(yè)務(wù)系統(tǒng)來說JSON序列化根本不在性能瓶頸上真正耗時(shí)的是數(shù)據(jù)庫查詢和遠(yuǎn)程調(diào)用。我更在意的是三點(diǎn)。第一是否支持自定義序列化器和反序列化器因?yàn)闃I(yè)務(wù)里總有一些特殊字段需要特殊處理比如脫敏。第二對未知字段、循環(huán)引用、深層嵌套這類極端情況的默認(rèn)行為是否可控能不能通過配置兜住。第三框架自動(dòng)配置的深度換句話說就是我是不是只寫一個(gè)注解就能讓整個(gè)項(xiàng)目的JSON交互行為發(fā)生改變。拿Jackson舉例它支持JsonIgnore、JsonProperty、JsonFormat、JsonSerialize、JsonDeserialize幾乎覆蓋了我遇到過的所有需求。Gson也可以用TypeAdapter做到類似效果但寫起來會繁瑣不少。3.3 一個(gè)項(xiàng)目究竟該怎么選我的選型建議是這樣的如果是Spring Boot新項(xiàng)目直接用Jackson沒必要額外引庫因?yàn)镴ackson已經(jīng)深度集成在Spring Boot的MVC里日期格式化、空值處理、字段命名策略都能通過配置文件統(tǒng)一管理如果是一個(gè)老項(xiàng)目想重構(gòu)且現(xiàn)有代碼大量使用了Fastjson的API也不要急著全換一步一步把高危鏈路先切到Jackson測試穩(wěn)定后再推進(jìn)如果只是寫個(gè)腳本或者做本地小工具Gson完全夠用。這里有個(gè)特別容易踩的雷一個(gè)項(xiàng)目里同時(shí)引了多個(gè)JSON庫平時(shí)各用各的看起來相安無事等某一天工具類里混用了這兩個(gè)庫的注解和API序列化結(jié)果就會出現(xiàn)莫名其妙的差異。項(xiàng)目里最好統(tǒng)一一個(gè)主JSON庫工具類只封裝這一個(gè)庫的API別給自己留混用的機(jī)會。4. Spring Boot里JSON交互的落地姿勢與全局配置4.1 RequestBody和ResponseBody到底做了什么在Spring Boot的Web層JSON交互最核心的就是兩個(gè)注解RequestBody和ResponseBody。很多新手只是會用但并不完全清楚它們背后的機(jī)制。RequestBody作用在方法參數(shù)上告訴Spring把HTTP請求體里的JSON字符串反序列化成后面的Java對象。這個(gè)過程中Spring用的就是當(dāng)前容器里注冊的MappingJackson2HttpMessageConverter消息轉(zhuǎn)換器負(fù)責(zé)把請求體字符串轉(zhuǎn)成對象。ResponseBody作用在返回值上或者直接加在類上讓所有方法生效告訴Spring把Java對象序列化成JSON字符串寫進(jìn)響應(yīng)體。用RestController就相當(dāng)于在類上同時(shí)加上了Controller和ResponseBody這也是現(xiàn)在最主流的寫法。如果你遇到一個(gè)問題后端寫好的RequestBody User user前端傳了JSON過來但user對象里某些字段為null。不要急著懷疑前端先想想是不是前后端字段名沒對上。默認(rèn)情況下Jackson是把JSON字段名和Java屬性名做一一映射的前端傳的userName后端對象里屬性也是userName才能正確對應(yīng)。如果前端習(xí)慣傳下劃線風(fēng)格user_name后端就得加全局配置或者用JsonProperty(user_name)做映射。4.2 全局Jackson配置日期、空值、命名策略一網(wǎng)打盡全局配置的意義在于你不必在每個(gè)字段上都寫注解只需要在配置文件里聲明一套默認(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ū)會導(dǎo)致日期序列化出來差8個(gè)小時(shí)第三行表示序列化時(shí)忽略值為null的字段第四行讓日期序列化時(shí)不輸出時(shí)間戳而是輸出格式化字符串第五行是反序列化時(shí)遇到未知字段不報(bào)錯(cuò)這對于前端多傳冗余字段的情況很友好。日期格式在這個(gè)配置里是全局生效的但業(yè)務(wù)里總有幾個(gè)接口需要用不同的日期格式這時(shí)候可以用JsonFormat在字段上覆蓋全局配置。記住一個(gè)原則全局定默認(rèn)局部做覆蓋注釋里說清楚為什么覆蓋。4.3 統(tǒng)一響應(yīng)包裝把“成功/失敗”的反饋規(guī)則先定下來JSON交互里另一個(gè)被忽略但很重要的問題就是響應(yīng)結(jié)構(gòu)不統(tǒng)一。有的接口成功時(shí)返回的是一個(gè)對象失敗時(shí)返回的是一個(gè)字符串或者成功和失敗字段的嵌套層級完全不同。前端對接起來就非常痛苦每個(gè)接口都要單獨(dú)寫解析邏輯。我習(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ī)則就固定下來了。統(tǒng)一包裝看起來是件小事但它在整個(gè)團(tuán)隊(duì)里建立的是一套交互契約。每次開會討論接口時(shí)大家只需要關(guān)心data里是什么而不需要擔(dān)心外面那層殼今天會不會變。5. 實(shí)戰(zhàn)踩坑清單日期、循環(huán)引用、泛型丟失、中文亂碼5.1 日期格式不一致典型的“兩邊都對合不上”接著開頭那個(gè)案例繼續(xù)說。日期格式不一致是JSON交互里出現(xiàn)頻率最高的坑而且它的結(jié)構(gòu)非常一致后端認(rèn)為自己在序列化時(shí)輸出了格式化字符串前端看到的是時(shí)間戳或者前端給后端傳了一個(gè)2024-07-01 12:00:00后端反序列化時(shí)也按這個(gè)格式解析但由于時(shí)區(qū)不對入庫時(shí)間成了2024-06-30 04:00:00。排查日期問題的順序我一般是先看序列化配置里有沒有指定格式和時(shí)區(qū)再看字段上有沒有被JsonFormat單獨(dú)覆蓋最后看傳輸過程中是否有中間層重新處理了日期字段。有一次我們排查了很久最后發(fā)現(xiàn)是網(wǎng)關(guān)層對響應(yīng)體做了字符串替換把時(shí)間格式里的斜杠替換成了橫杠結(jié)果后端看到的是橫杠格式的字符串再次序列化時(shí)格式全亂了。所以排查要覆蓋鏈路中的每一個(gè)節(jié)點(diǎn)不能只看服務(wù)端。5.2 循環(huán)引用和懶加載一序列化就整頁報(bào)錯(cuò)循環(huán)引用是后端對象序列化中最讓人頭疼的問題。舉個(gè)常見的場景一個(gè)訂單對象里有用戶對象用戶對象里又有一個(gè)訂單列表序列化訂單時(shí)Jackson發(fā)現(xiàn)訂單里有用戶用戶又有訂單訂單里又有用戶……如果不做任何限制它就會無限嵌套下去最后棧溢出。解決循環(huán)引用有三個(gè)方向。第一個(gè)是業(yè)務(wù)上明確不需要閉環(huán)直接在某一端用JsonIgnore把不需要的字段忽略掉第二個(gè)是用JsonIdentityInfo讓相同對象在序列化時(shí)以ID引用而不是展開完整對象第三個(gè)是從設(shè)計(jì)上避免雙向?qū)ο笾苯颖┞督o前端改用DTO數(shù)據(jù)傳輸對象只返回前端需要的那幾個(gè)字段。還有一個(gè)讓很多人踩過的坑是Hibernate的懶加載。一個(gè)實(shí)體類里有OneToMany的關(guān)系屬性沒被訪問時(shí)它是一個(gè)代理對象直接序列化時(shí)會觸發(fā)LazyInitializationException。這種情況我一般也用DTO解決顯式地把需要的數(shù)據(jù)查出來再組裝成返回對象而不是試圖把JPA實(shí)體直接丟給序列化器。5.3 泛型與類型擦除List 接口返回前端拿不到全字段前面提到了TypeReference這里展開講一個(gè)實(shí)際案例。有個(gè)接口返回ListUser實(shí)現(xiàn)時(shí)直接用了List.class作為反序列化目標(biāo)。結(jié)果前端拿到數(shù)據(jù)后發(fā)現(xiàn)user對象里混著一堆LinkedHashMap的結(jié)構(gòu)所有的字段都變成了map.get(xxx)的取值方式。前端說接口文檔寫得不對后端說我返回的就是數(shù)組。兩邊都很委屈但根源只有一個(gè)反序列化時(shí)泛型信息丟失。Jackson在反序列化時(shí)如果無法得知目標(biāo)元素類型只會按照最通用的Map結(jié)構(gòu)處理。這個(gè)問題不光影響List任何帶泛型的類型都會遇到比如MapString, User、PageResultUser處理方式都一樣要么用TypeReference要么在繼承類時(shí)把泛型固定下來比如定義一個(gè)UserList extends ArrayListUser這是個(gè)很偏門但有效的技巧。5.4 中文亂碼與特殊字符Tomcat配置和轉(zhuǎn)義策略中文亂碼在JSON交互里雖然不像以前那么常見但一旦出現(xiàn)就特別難排查因?yàn)樗皇呛蠖舜a的問題而是整個(gè)鏈路的編碼不統(tǒng)一。HTTP請求和響應(yīng)都有各自的字符集如果服務(wù)端返回Content-Type: application/json;charsetUTF-8而中間某層把它改成了別的編碼中文就會變成亂碼。Spring Boot里可以這樣顯式地設(shè)置響應(yīng)編碼server: servlet: encoding: charset: UTF-8 enabled: true force: trueforce: true表示強(qiáng)制所有請求和響應(yīng)都使用UTF-8避免因?yàn)榭蛻舳藳]帶編碼參數(shù)導(dǎo)致的亂碼。另外還要注意JSON字符串本身對控制字符是有限制的比如\u0000這類字符不能被直接放進(jìn)JSON字符串。如果業(yè)務(wù)數(shù)據(jù)里可能包含這類字符序列化時(shí)往往會被丟棄或轉(zhuǎn)義兩端看到的文本就不同。對于包含接口日志的數(shù)據(jù)我建議在寫日志時(shí)把請求體和響應(yīng)體做一次JSON美化輸出同時(shí)打印轉(zhuǎn)義后的可見字符串這樣定位問題才不會被特殊字符干擾。6. 自定義序列化器把敏感字段的“對外長相”攥在自己手里6.1 什么場景值得寫一個(gè)自定義序列化器全局配置解決的是通用問題但業(yè)務(wù)里總有那么幾個(gè)字段不按常理出牌。最常見的場景就是數(shù)據(jù)脫敏。比如用戶手機(jī)號數(shù)據(jù)庫里存的是13812345678接口返回給前端時(shí)頁面可能只需要展示138****5678。這個(gè)需求如果用JsonIgnore把字段整個(gè)忽略掉前端就拿不到數(shù)據(jù)了如果讓前端自己截?cái)嗄堑扔诎衙撁暨壿媮G給了用戶也不合理。更合理的做法是數(shù)據(jù)庫存原始數(shù)據(jù)接口按場景決定“對外長相”。后端默認(rèn)配置下敏感字段可以統(tǒng)一掛一個(gè)自定義序列化器序列化時(shí)自動(dòng)脫敏。這樣業(yè)務(wù)代碼里不需要寫任何脫敏邏輯前端拿到手的就是已經(jīng)處理好的數(shù)據(jù)。6.2 手機(jī)號脫敏字段一個(gè)10行的自定義序列化器在Jackson里實(shí)現(xiàn)自定義序列化器很簡單繼承JsonSerializerT重寫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ī)號夠不夠7位不夠就直接輸出夠就把中間四位替換成星號。字段類上掛注解后Jackson在序列化這個(gè)字段時(shí)就會走進(jìn)這個(gè)邏輯。這個(gè)思路還能延伸到很多地方身份證號脫敏、郵箱地址脫敏、銀行卡號脫敏。規(guī)則不同但寫法大同小異。我用這個(gè)方式在項(xiàng)目里統(tǒng)一處理過一批敏感字段效果很好最大的好處是脫敏規(guī)則收斂在序列化器里而不是散落在各個(gè)業(yè)務(wù)方法的if/else里。6.3 自定義反序列化處理前端多態(tài)字段的實(shí)踐自定義反序列化的場景相對少一些但一遇到就是硬需求。舉個(gè)真實(shí)例子前端有一個(gè)值可能是字符串也可能是字符串?dāng)?shù)組也可能是單個(gè)對象也可能是對象數(shù)組。這種不確定的入?yún)⒑蠖巳绻欢x一種類型必有一半的請求解析失敗。我的處理方式是在反序列化器里做兼容。繼承JsonDeserializerT重寫deserialize先看當(dāng)前JsonToken是什么類型如果是VALUE_STRING就按字符串解析如果是START_ARRAY就遍歷數(shù)組把元素收集起來然后統(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; } }這種靈活反序列化器能解決接口兼容問題但我建議只用在做舊接口兼容、第三方回調(diào)適配這類場景。新寫的內(nèi)部接口能定死類型就定死類型別為了省事什么都兼容不然代碼越寫越復(fù)雜最后自己都搞不清一個(gè)字段到底有多少種可能性。7. 聯(lián)調(diào)與線上排查我慣用的三板斧7.1 聯(lián)調(diào)期用哪些手段快速驗(yàn)證JSON交互聯(lián)調(diào)階段最容易發(fā)現(xiàn)JSON交互問題這時(shí)候我很少直接打開瀏覽器看頁面而是先用接口測試工具把請求和響應(yīng)分開驗(yàn)證。我常用的驗(yàn)證步驟是第一步新建請求寫入JSON請求體確認(rèn)HTTP狀態(tài)碼和響應(yīng)結(jié)構(gòu)第二步檢查響應(yīng)JSON里每個(gè)字段的類型重點(diǎn)關(guān)注時(shí)間、金額、數(shù)組空值第三步把響應(yīng)JSON復(fù)制到格式化工具里看一眼整體嵌套對不對。如果是一個(gè)比較復(fù)雜的JSON結(jié)構(gòu)前端同學(xué)經(jīng)常會問“這個(gè)字段到底是字符串還是數(shù)字”。為了避免這個(gè)溝通成本我習(xí)慣在接口文檔里直接標(biāo)注示例值示例值能寫123的字符串還是123的字符串都要寫清楚。很多字段歧義本質(zhì)上就是示例值不明確造成的。7.2 線上JSON解析異常日志的定位思路線上環(huán)境沒有接口測試工具那么方便所以日志是排查的主通道。JSON解析異常常見報(bào)錯(cuò)有幾種JsonParseException表示請求體根本不是合法JSON多半是前端拼錯(cuò)了字符或者被中間層截?cái)郙ismatchedInputException表示JSON結(jié)構(gòu)合法但類型對不上比如前端傳了字符串后端定義的是數(shù)字InvalidDefinitionException表示序列化目標(biāo)本身有問題比如循環(huán)引用、找不到getter方法。我的定位思路是先看異常信息里指向的字段名再拿原始請求體做一次本機(jī)復(fù)現(xiàn)。很多線上解析問題本地一復(fù)現(xiàn)就能定位因?yàn)閳?bào)錯(cuò)信息已經(jīng)告訴你字段名了。真正難的是那種“偶發(fā)解析失敗”這種情況多半和特定輸入值有關(guān)比如某個(gè)字符串里帶了換行符某個(gè)字符串特別長超過了中間件限制。解決偶發(fā)問題的辦法是把請求體完整打到日志里一次復(fù)現(xiàn)就什么都能看出來。7.3 一次排查經(jīng)歷請求體過大與嵌套JSON邊界問題最后分享一個(gè)印象比較深的排查經(jīng)歷。當(dāng)時(shí)線上有個(gè)接口偶爾報(bào)錯(cuò)錯(cuò)誤信息是“Unexpected character...”但同樣的請求參數(shù)重新提交一次又能成功。從表現(xiàn)看像是數(shù)據(jù)傳輸過程中內(nèi)容被截?cái)嗔?。查了一圈最后定位到是網(wǎng)關(guān)層對請求體大小做了限制超過限制的請求體被攔下一部分后端收到的是半截JSON自然解析失敗。解決方法是調(diào)大請求體限制并在網(wǎng)關(guān)層增加對Content-Length的校驗(yàn)超長的請求提前返回明確提示而不是讓它進(jìn)入后端變成一條看不懂的解析異常。這個(gè)案例給我的啟發(fā)是JSON交互問題不能只盯著JSON本身還要看承載它的整個(gè)管道。HTTP頭部、網(wǎng)關(guān)配置、代理層、編碼設(shè)置每一層都有可能改動(dòng)JSON的實(shí)際內(nèi)容。排查看鏈路這六個(gè)字是我處理這類問題最核心的心得。再補(bǔ)充一個(gè)實(shí)際經(jīng)驗(yàn)JSON交互想要少出問題接口文檔和前后端契約是最前線的防線。數(shù)據(jù)格式再簡單也要把示例寫清楚字段再多也要統(tǒng)一空值處理。這些東西看起來算不上核心技術(shù)但真到了線上報(bào)錯(cuò)搶救的時(shí)候每一份清晰的約定都能幫你少點(diǎn)一次應(yīng)急工單。希望這篇文章里梳理的思路能讓你在下次遇到JSON交互問題時(shí)手里有一張完整的排查地圖。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
亚洲国产精品综合色区| 国产SUV精品一区二区6| 五月色 亚洲| 婷婷5月久久综合网站| 日韩三级高清无码| 天天天日天天天干| 天干天天干天天天天天| 婷婷丁香熟妇综合网| 色色婷婷综合| 99热9| 狠狠干伊人| 婷婷射图| 中文字幕丰满人妻无码专区| 国产av网| 牛牛澡牛牛爽| 嫩BBB搡BBBB榛BBBB| 欧美精品18| 69五月天视频| 五月天 综合 在线| 久久五月丁香婷婷| 色五月超碰| 99久久久| 伊人久久大香线蕉av最新| 久色中文| 我爱婷婷五月天综合88| 人妻操逼| 开心深爱五月天| 婷婷五月丁香色播| 18久久| 人人爱操| 亚洲亚洲人成综合网络| 人妻无码视频网| 成人在线视频网| 亚洲a色| 亚洲婷婷丁香五月亚洲| 五月天亚洲最大成人| 丁香五月欧美色综合| 99精品成人无码A片观看金桔| www.五月天色色.com| 婷婷色情小说| 丁香五月无码| 狠狠激情五月天| 五月综亚洲| 天天爽在线视频| 色五月婷婷91| 婷婷久久大香蕉| 五月丁香六月婷婷成人| 五月色婷婷影院| 五月天丁香欧美激情| 国产欧美日韩综合精品一区二区| 亚洲妇女熟BBW| 欧美性爱五月天| www,色婷婷| 婷婷色六月| 色偷偷狠狠| 99热这里只有精品96| 亚洲性爱99| 无码四色色色| 婷婷五月天手机版视频| 毛片色五月| 欧美婷婷五月天综合| 天天免费成年人视频| 激情五月婷婷丁香六月| 丁香六月色婷婷欧美| 久久大香蕉| 狠狠综合网| 婷婷丁香社区网| 99热成人永久免费| 久久机热这里只有 | 黄网在线播放| 激情五月综合视频| 深爱激情六月| 欧美久久网| 欧美综合五月丁香六月婷| 8区视频在线| 亚州操操| AA片在线观看视频在线播放| 大香蕉视频99| 丁香花色色网| 99精品久久久久久久婷婷久久| 五月天五月色婷婷综合| 婷婷五月伦理| 天天射综合网站| 91狠狠色丁香婷婷综合久久精品| 五月婷婷丁香| 色天堂操| www.激情五月天.com| 激情小说五月天中文字幕| 欧美黑人巨大猛烈cuckold| 色综合五月在线| 婷婷五月天人妻| 99热只有这里才是精品| Av九九| 婷婷午夜| 激情婷婷黄色五月| 九九综合视频在线观看| 蜜臀九九九九| 九九这里是免费的视频5| 婷婷色导航| 青草视频在线观看视频| 日韩在线成人电影| 日本的α片xxxwww| 播五月丁香三月婷婷| 五月丁香婷婷综合网| 99热自拍| 天天综合网91| 99热这里只有精品一区| 狠狠色狠狠操| 91 九色 入口| 激情丁香网| 六月丁香婷婷综合在线| 嫩草AV久久伊人妇女超级A| 婷婷碰碰| 麻豆科斗777| 日韩爱操视频| 97 天堂| 狠狠色丁香久久| 日本色婷婷综合| 色婷婷久久综合中文久久一本| 色情综合网| 久久九网| 久久黄色网扯| 天天色综网| 玖玖@三月天天丁香婷婷| 91丨九色丨白浆秘| 99久久这里只有精品| 丁香五月偷拍| 日本色色图| 婷婷五月天性| 欧美性猛交 XXXX 乱大交| 成片免费观看大全| 色婷婷色情| 久久东京热婷婷五月| 亚洲乱码精品久久久久..| 丁香婷婷五月人体| 亚洲成人va| 成人短视频在线| 伊人久久婷婷| 色婷婷影视| 色亚洲欧洲| 日本色色网| 99精品国产在热久久婷婷| 99这里只有免费的精品| 狠狠插狠狠插| 婷婷激情小说网| 丁香五月在线播放| 色色丁香五月天社区| 婷婷 久综合| 丁香五月欧美午夜视频| 操人精品| 丁香五月天堂网| 91久久日日| 亚洲午夜精品久久久久久人妖| 色色色色色色网站| 婷婷综合伊人| 综合久久六月| 97丁香视频| 日本成人噜噜噜噜噜| 色婷婷丁香五月| 婷婷综合日本| 生活片五区| www.99热. com这里只有精品| 思思热在线观看| 五月色激情综合网| 欧洲亚洲精品| 久热69| 九九热在线视频观看| 日本人妻伦在线中文字幕| 热99国产精品| 九九在线精品| 天天摸,天天爽| 狠狠狠狠狠狠狠狠| 色五月成人婷婷| 99无码视频| 激情久久久久久久久久| 97狠狠色| 六月色日韩| 久久久er热| 久久婷婷精品| 色五月婷婷五月丁香五月激情五月视频 | 色色色色五月天| 97久久超视频| 久超超碰| wWwCom夜操wwW| 久久婷五月婷| 欧洲亚洲免费视频区| 色情婷婷| 99热在线观看免费| 九9九9无码| 丁香五月天激情视频| 大香蕉娱乐| 97色色色色色| 丁香婷婷老司机久操| 婷婷五月天六月| 久久婷婷五月综合色区| 色五月人妻| 玖玖激情五月天| 欧美日韩成人免费在线| 丁香六月色香蕉视频| 亚洲精品字幕| 天天澡天天狠天天天做| 亚洲最大在线| 国产婷婷色综合AV蜜臀AV | 亚洲成人电影aaaa| 色色色天堂网| 天天爱天天狠天天透| 婷婷色五月激情强奸四射| 五月丁香六月成人| 天天摸天天舔天天爽| 成人无码髙潮喷水A片| 天天操夜夜夜拍拍拍| 91性交在线播放| 亚洲天天综合| 99综合视频一体| www.超碰| 婷婷五月影院| 亚洲熟妇AV综合网五月丁香伊人| 久久九久久| 天天做天天爽| 人人舔人人色人人高潮| 九九十99视频| 亚洲深喉aV| 九九热精品视频| 久久多色| 五月色婷婷夜色| PORNY九色9l自拍视频成人| 五月天婷婷基地丁香| 搡BBBB搡BBB搡18| 婷婷丁香五月亚洲免费| 九九国产精视频| 激情5月婷婷| 丁香婷五月天开心六月| 综合激情五月丁香| 99精品自拍视频| 欧美大肥婆大肥BBBBB| 久久色五月天激情小说| 五月丁香婷婷爱激情综合网| 婷婷玖玖丁香| A短视频免费在线观看| 激情五月丁香婷婷| 五月丁香久久呀| 婷婷五月激情综合啪啪| 色婷婷成人做爰A片免费看网站 | 综合网啪| 欧美性爱5月天天天看| 中文字幕成| 九九热精品视频在线观看| 五月开心色| 色五月丁香五月激情五月激情| 丁香五月天社区婷婷| 亚洲精品电影| 五月丁香色综合| 欧美色播综合在线观看| 97色干| 亚洲中文AV网站| 欧美激情五月天| 五月婷婷综合久久| 五月丁香婷婷久久| 亚洲激情亚洲激情| 久久婷婷五月天懂色| 成人草榴视频| 黄桃AV无码免费一区二区三区| 伊人玖玖网| 婷婷五月丁香激情| 五月婷婷综合网| 婷婷成人五月天| 天天操天天操天天操| 国产99久久久| 亚洲精品电影| 欧美 日韩 成人在线| 婷婷黄色网| 六月婷婷色综合| 成人AV中文字幕| 天天日天天狠狠操| 久久欧洲久久| 99在线精品观看99| 99热99在线| 婷婷五月天AV在| 婷婷五月天天| 国产99久久久国产精品免费看| 大香蕉九九| 五月天婷婷综合网| AV在线免费播放| 丁香五月婷婷激情蜜桃| 亚洲六月色| 人妻丰满精品一区二区A片| 亚洲成人网站在线观看| 五月天色图| 日韩狠狠色| 九九免费视频| 五月天成人综合| 五月综合无码| 六月婷婷八月丁香| 色碰碰| 天天操天天爱天天玩| 丁香六月 人妻| 人人玩人人橾| 亚洲丁香五月美女| 国产日日操夜夜操的肉棒视频| 亚洲性爱99| 六月丁香婷婷视频综合在线观看 | 婷婷情色激情| 五月天综合婷婷| 深爱激情网噜噜色| 成人五月天视频播放| 婷婷亚洲色| 五月六月激情| 激情综合网色播五月| 99热这里只有精品在线观看| 亭亭色网| 六月婷婷啪啪| 九九在线精点品| 高清无码网址| 91se精品国产| 色婷婷激情五月天| 婷婷无码视频| 久久婷婷成人综合色怡春院| 亚州美女| 婷婷丁香六月天激情四射网| 9999热在线免费观看| 欧洲精品爱爱| 99视频色在线观看| 99热精品一| 久久久久人妻精选| 高清视频一区| 日本人人超碰| 久久久免费图片视频| 丁香五月婷婷综合91| 天堂久久性| 五月丁香啪啪啪啪| a v色婷婷| 中国激情网| 天天日天天摸| 五月综合激情| 丁香五月天社区婷婷| 色五月婷婷影院| 丁香婷婷人妻| 激情综合五月婷婷六月丁香| 久久99热这里只有精品| 丁香六月在线综合| 欧美激情综合色综合啪啪五月| 色五月综合网| 这里只有精品久| 26UUU精品一区二区| 久婷婷婷| 色婷婷六月| 伊人久久大香天蕉亚洲特级| 激情五月天婷婷免费观看| 国产精品-91JQ就要激情网91JQ6.91JQ27.CASA:16888 | 伊人久久大香蕉网| 人妻在线中文字幕久久| 99在线观看精品| 狠狠色婷婷7777久| 五月丁香久人妻中文| 性爱在线播放av| 79精品视频| 99热网站| 91色干| 婷婷五月激情图片| 无码人妻激情| 亚州日本欧州韩美高青高潮一| 丁香色婷婷| 人妻久久久久久久 | 欧美A级网站| 五月婷色啪| 色七七九九| ..真实国产乱子伦对白在线_欧 | 五月丁香成年黄色| 6080av| 五月丁香久久网| 丁香婷婷九月在线| 日本色频| 人人色婷婷| 国产真实乱了老女人视频| 在线看黄色| 色婷婷成人在线| 五月天四色房丁香亭亭| 婷婷无五月无码视频| 天天日天天舔| 97色一二三| 秋霞电影一级黄| 日韩1区2区| 亚洲视频在线观看| 97在线精品| 激情婷婷五月| 色综合女人99| 六月婷婷影院| 免费无码毛片一区二区A片| 手机在线日韩视频中文字幕| 久久ab| 97在线观视频免费观看| 深爱五月激情综合| 婷婷丁香十月| 狼人久草| 婷婷无码五月天| 电影91久久久| 狠狠干在线视频| 五月天婷婷色色| 色五月天丁香婷婷色| 99re26视频| 亚洲超碰在线| 色婷婷WWW| 色综合久久44| 欧美在线看| 五月天国产| 狠狠色综合图片| 五月色婷婷AV| 丁香五月欧美婷婷综合| 天天综合天天玩夜夜玩天天玩夜夜玩 | 丁香丁香激情网| 亚洲欧洲国产精品| 九月激情综合| 色噜噜狠狠色综合成人网| 丁香五月婷综合| 激情二色月| 大伊香蕉精品视频在线| 激情小说五月天中文字幕| 91九色在线| 婷婷五月天色色| 玖玖爱伊人| 久久综合色五月| 日日操夜夜操中国无码| 婷婷五月天免费视频| 色亭亭丁香五月天| 婷婷五月AV| 婷婷欠久少妇| 99成人免费热视频| 久久加勒比| 人人色婷婷| ′久久99一| 国产精品成人AV在线| 超碰97久久| 嫩草乱码一区三区四区| 99色日本| 天天插综合| 超碰三级秋霞| 日韩欧美不卡| 五月六月婷| 狠狠爱婷婷| 操97| 精品国产va久| 亚洲成人在线电影网站| 99精品免费| 婷婷五月综合网| 丁香六月色婷婷| 色热久资源| 亚洲妇女熟BBW| 啪啪婷婷五月天激情| 色狠狠色噜噜AV天堂五区| 欧美丁香六月激情视频| 亚洲在线成人| 婷婷五月天开心网| 人人干AV| 性高潮久久久久久-九九九九九九九九九九热-成人AV | 97在线干| 亚洲综合五月| 天天射夜夜骑| 婷婷色情网| 色999亚洲人成色| 这里只有精品99www| 亚洲无码免费看| 99精品久久久久| 色色网站免费在线视频| 丁香五月伊人| 三级黄网站| 丁香五月天啪啪| 五月婷婷网站| 色999五月色| 久久国产一区二区三区| 婷婷激情欧美| 五月天久久久| 亚洲天堂玖玖| 五月丁香网站| 九九视频在线观看| 99re思思在线视频| 久久五月婷婷视频| 激情五月天视频| 国产精品婷婷午夜在线观看| 色欲久久综合| 亚洲啪| 91色色色| 五月天.com| 五月天丁香成人社| 免费看欧美成人A片无码| 99免费视频在线观看爱| 色色色欧美| 五月成人丁香av91| 97色婷婷| 五月丁香啪| 中文字幕AV在线播放| 性爱激情综合网| 婷婷久久五月丁香| 99热这里只有精品3| 大香蕉久久伊人婷婷五月丁香| 操逼电影免费看| 岛国AV网| 日本狠狠干| 丁香亚洲婷婷五月| 人妻22p| 五月停亭久久电影| 亚洲精品又粗又大又爽A片 | 婷婷色五月激情| 天天撸天天干天天插| 玖热精品综合视频| 91久久综合亚洲噜噜成人在线| 日本精品人妻无码77777| www激情com| 久久婷婷成人视频| 五月丁香啪啪啪啪| 超碰97免费在线| 婷婷福利影院| 婷婷丁香五月综合网| 久久婷婷人人| 26uuu最新地址| 草AV9999| 深爱婷婷色| 亚洲成人免费在线| 久99久精品| 婷婷六月丁综合| 99久久国产宗和精品1上映| 五月丁香久人妻中文| 久久久人妻系列| 激情五月无码| 色色色视频| 99色综合网| 91黄址| 婷婷五月天午夜激情影院| 玖玖婷婷免费| 蜜臀综合久草| 91久女| 激情婷婷丁香五月| 女人被躁到高潮嗷嗷叫小| 婷婷色导航| 九九热这里| 伊人久久五月天| 91丁香五月| 日本婷久久| 色色色色色色色色色色色色色97| 狠狠狠色激情综合适合| 99视频在线观看网址| 色五月激情婷婷| 婷婷五月天综合小说网| 51avj视频大全| 色噜噜婷婷| www好屌操| 五月丁香六月婷婷色| 色青青五月| 丁香伊人激情| www.lingjunshare.com| 五月丁香激情六月| 天天色色天天| 日本WWW九九九| 久久精品系列| 色综合久久天天综合网| 五月婷婷六月丁香| 天堂久久精品| 99精品视频在线观看| 91中文在线| 国产精品扒开腿做爽爽爽A片唱戏 青青草国产亚洲精品久久 | AV九九| 思思热在线| 婷婷五月成人| 99碰碰。| 97色女人在线| 亚洲日韩国产黑丝黑丝AVAV一区二区三区| 久久丁香五月婷婷激情综合网| www.久久爱| 天天操天天爱天天日| 色色影院aaaav| 午夜婷婷五月天在线| 婷婷五月花西瓜| 综合啪啪| 五月丁香综合| 久综合4| 东北黄色一级| 色五月激情综合网| 天天撸夜夜爽| 天天干,夜夜爽| 337p大胆噜噜噜噜噜91Av| 色欲天天综合网| 熟女强人妻一区二区三区四区无| 牛牛色av| 狠狠搞五月天| 婷婷六月激情在线视频| 自拍盗摄 另类| 超碰日日操| 五月天婷婷综合网| 黄色短视频在线观看| 亚洲无码成人| 丁香丁香激情网| 人人草人人爱手机视频看看| 九九99九九99| 成人超碰网| 草榴视频网| 五月丁香久久综合| 天天操比比| 色色99| 色9999综合久久| 婷婷永久在线| 婷婷5月九九| 超碰在线人妻| 久久玖玖99| 香蕉婷婷| 婷婷五月天成人小说| 色香欲综合| 亚洲成人在线观看网址| 狠狠色婷婷在线| 婷婷五月亚洲一本在线丁香| 五月丁香久| 天天综合天综合久久网| 五月婷婷黄色| 久久亚洲无码| 国产精品男人AV不卡| 1024日韩| 五月天婷综合| 伊大人久久| 天天色播| 噜噜噜久久| 综合六月久久| 毛片网站谁有| 曰曰久久| 大香蕉人人网| 可以直接看的AV网站| 国产 码在线成人网站| 涩丁香91| 九九一综合精品| 久热99| 99热在线观看成人| 亚洲丁香婷婷五月天综合色| 久久色天堂| 一区操| 米奇激情婷婷| 99色综合| www99热| 182TV大香蕉| 久久3级片| 欧美群妇大交乱婬网| 伊人五月天| 婷婷操婷婷干婷婷射| 婷婷中合| 五五月五月| 成人在线99| 亚洲综合婷婷五月| 狠狠色97| 色五月婷婷91| 亚洲婷婷成人五月天| 69精品人人人人| 五月丁香六月色婷婷综合五月天| 97碰| 五月天婷婷网站888| 玖玖婷婷五月天| 不卡成人免费| 亚洲激情网站| 丁香啪啪中文字幕| 婷婷五月天电影在线| 野战J办公桌椅H| 精品无码色| 久热九九| 深爱网深爱综合网| 情欲禁地| 五月天激情婷婷丁香| 人妻熟人中文字幕一区二区| 丁香五月六月婷婷自拍| 天堂成人A片永久免费网站| 99 热| 色五月首页| 欧美美女国产日韩一区二区久| 久久久免费精彩视频| 国产婷婷色五月| 婷婷天天日婷婷| 久久久婷婷婷| 可以免费观看的AV| 激情图片婷婷| 香蕉久久国产AV一区二区| 丁香婷婷久久激情| 秋霞少妇AV网站| 婷婷五月天日日日干干干| BBWCUCKOLD精品熟妇| 99久久综合网| 九九色网| 操操自拍| 性爱动图国产麻豆一区二区三区| 久久XX| 99热这里只有精品13| 丁香8月手机综合| 日韩99色99| 亚洲顶级VA在线观看-高清完整版在线影院观看-S022AV | 天天爽天天做| 97在线日本| 亚洲乱码在线观看| 五月丁香综合啪啪啪啪啪| 五月丁香激情综合| 开心五月丁香婷婷| 五月亭亭欧美女人| 九九久久精品| 操日本人妻视频| 91伦| 天天色图| xx综合网| 亚洲AV无码成人精品电影| 久久精品噜噜噜成人A∨色欲| 天天色视频| 啊v视频在线观看| 中文毛片无遮挡高潮免费| 天天操天天草天天草天天| 婷婷中文网站| 泰州成人视频| 婷婷五点亚洲| 丁香六月婷婷开心| 97色色网| 天天爽天天透天天爱| AV六月丁香| 大香蕉伊人久久| 亚洲中文乱字字幕线在永久| 天天综合久久| av亚洲国产小电影| 色婷婷在线视频| 婷婷综合五月天| 江苏少妇性BBB搡BBB爽爽爽 | 中文激情网| 激情五月黄色| 秋霞性爱AV| www夜夜操wwwcon| 综合久久综合久久| 九九综合九| 成人av在线电影| 国产精品久久久60086| 激情五月天啪啪| 国产黄大片在线观看画质优化| 丁香五月婷婷基地| 美女要搞搞天天搞搞搞网站| 丰满少妇乱A片无码| 在线观看免费狠狠色丁香香综合| 99色视频在线观看| 日韩久操婷婷| 夜精品无码A片一区二区蜜桃| 99热色精品| 停停色综合伊人| 非洲一级AV| 五月婷A V在线| 另类视频在线| 色五月人妻| 婷婷六月丁香激情综合| 激情六月婷婷| 久久久免费图片视频| 欧美成人精品A片免费一区99| 99亚洲精品| 色爱综合视频| 91操熟女| 亚洲午夜一区二区| 665566 无码| 91操人视频| 99碰网站| 99热精品中文字幕| 丁香婷婷激情综合五月激情| 人人操操| 黄色网址五月婷婷| 99热思思| 色久综合| 国产亚洲99久久精品| 天天爽天天| 天天综合社区| 丁香婷婷六月激情综合| 538在线| 97超碰综合| 婷婷狠狠操| 婷婷丁香五月天熟女丝袜| www.9操| www.超碰| 国产67194| 涩涩涩五月天| 99精品久久| 碰超99| 久久人操-久草婷婷-成人AV| 五月丁香色停停啪啪啪| 最近中文字幕2019视频1| 五月激情小说| www夜夜| 久久婷婷成人综合色怡春院| 九月婷婷久久| 久久98| 另类天堂| 国产亚洲色婷婷久久99精品91| 激情五月天综合网| www.91在线观看| 99久久www| 五月激情婷婷综合| 国产97色在线| 久草A片| 噜噜噜狠狠色综| 久久婷婷网| 91色在线/日韩| 99热老司机| 五月婷婷AV| 五月天婷婷激情| 丁香五月在线播放| 五月婷婷六月色| 欧美日韩aaaa| 激情五月天小说|五月天开心激情网|亚洲精品国产自在现线|黄色五月天 | 99re66热这里只有精品| 人妻视频在线| 97干在线| 玖玖资源部在线播放| 亚洲第一色色色色| 五月丁香成人| 5月丁香六月婷婷| 天天天操天天天日| 丁香五月六月激情久久| 色色色色色色网站| 五月丁香综合激情网| 亚洲国产成人在线| 色五月综合网| 五月丁香六月激情网站| 超碰啪啪网| 伊人色综合久久久| 91干| 色婷婷精品小视频| 五月欧美色播| 五月天激情日色在线| 日日狠狠久久偷偷四色综合免费| 伊人五月天在线| 人妻视频在线| 色色99| 北条麻妃伊人| 婷婷五月丁香91| www.99热| 米奇影视五月天| 丁香五月天婷婷激情| 亚洲中文字幕av| www.婷婷| 九九激情视频| 成久综合视频| 夜夜撸天天日| 色婷婷五月色| 日本猛少妇色XXXXX猛叫| 色久五月| 日日干日日| 婷婷伊人网| 久久丁香婷| 久久婷狠狠色| 丁香婷停五月激情综合深爱| 亚洲无码色色| 狠狠色综合网| 九色亚洲| 五月婷婷免费在线| 国产另类综合| 91精品久久久久久久| 狠狠精品干练久久久无码中文字幕 | 丁香婷婷网| 婷婷丁香九色| 婷婷四色五月| 五月天深爱激情网| 丁香五月久久| 色婷婷丁香AV综合| 色色色色热热| 五月天亚洲色| 亚洲操操操| 91岛国片| 激情五月亚洲综合网| 99久久玖玖| 五月网站| 婷婷色在线观看| 五月开行婷婷色五月| 99热这里只| 久久久日韩特色特黄AAAA| 色综合色色| 丁香五月亚综合图片| 啪啪一区| 五月激情网站| 激情五月天色婷婷综合| 久久综合人妻| 丁香五月婷婷天堂大香蕉| 婷婷五月天,影院| 99热e| 五月丁香婷婷激情图片| 色色色综合色| 六月丁香社区| 99日韩| 996热re视频在线观看视频| 色欲Av五月天| 激情另类综合| 丁香六月色| oVV4WIB3vFi8D| 国产成人+综合亚洲+天堂| www.夜夜爱.com| 青青操avbb| 久久婷婷综合网| 超碰99热在线观看| 玖玖九九99| 日本色婷婷| 色婷婷操逼| 丁香五月天啪啪a日本| 国产又黄又爽又色的免费| 啪啪啪综合网| 91狠狠色丁香| 久久婷婷六月综合综合| 性爱在线播放av| 久久婷婷激情| 激情视频综合| 五月丁香六月激情在线| 无码AV大香线蕉伊人| 色五月aV| 国外亚洲成AV人片在线观看| 色色99| 深爱激情综合网| 久久99精品久| 五月丁香六月婷婷a v| A久久| 综合激情网五月激情| 91精品久久久久久综合五月天| 丁香五月综合久久| www五月天com| 成人va在线| 五月丁香六月婷婷亚洲视频| 婷婷五月天com| www.婷婷五月| 国产成人在线不卡AV| 色综合另类| 99啪啪网| 91久久婷婷| av 一区三区四区| 国产亚洲精品久久久久久郑州| 美女要搞搞天天搞搞搞网站| 欧美69久成人做爰视频| 激情五月天色婷婷综合| 亚洲国产黄色电影| 色五月五月婷婷| 丁香婷婷六月天| 日日干天天爽| 五月综合婷婷网| 丁香婷婷五月色综合| 99热这里只有精品官网| 亚洲成人AV一区在线观看| 天天草天天日| 婷婷丁香色女人| 狠狠色综合精品视频在线| 日韩啪图| 久久综合影院| 一本久道综合色婷婷五月| 九月色婷婷| 六月婷婷无码| 欧美综合激情| 色狠狠色噜噜AV天堂五区消防| 人操91在线| 婷婷六月天| 久久久中文| 99热99在线| 91操操操| AA片在线观看视频在线播放| 激情九九综合网| 99在线爽| 五月久久婷婷| 日韩啪啪视频| 欧美韩国日本| 婷婷开心久久| 亚洲天堂AV综合网| 第四色五月婷婷| 婷婷大香蕉| 国精产品一区一区三区免费视频| 99高级会所久久| 久久曰9| 激情图片婷婷丁香五月| 开心婷婷中文字慕| 久久久国产精品黄毛片| 襙逼网| 色色丁香五月天社区| 东京热伊人| 五月人妻婷婷| 日韩天堂久久| 色色操| 草操网| 色九九九综合| 一级性爱视频| wwwwww.色| 99热9| 婷婷五月日本| 午夜爱爱网站| 99热a片免| 在线观看免费观看在线9久| 五月丁香另类图片| 五月天婷五月天综合网小说首页-五月天激激婷婷大综合,婷婷亚洲综合五月天小说 | 骚货艹网站视频| 久色网址| 97色碰碰公开视频| 精品人妻伦一二三区久| 色婷婷五月在线| 99高级会所久久| 色欲影香| dingxiangtingtingliuyue| 大香蕉婷婷五月| 中文字幕婷婷9月天| 超碰在线成人| 国产精品色婷婷AV综合色色| site:901-07.com| 2022人人操人人看| 国产黄色在线观看| 人人摸人人搞| 狠狠干五月天| 丁香激情六月天婷婷| 婷婷五月色| 最新AV在线观看| 五月丁久久| 开心五月网 | 激情五月天综合| 五月丁香婷婷基地| 激情丁香五月激情婷婷| 亚洲色婷婷| 日本久久精品18| 91人人妻人人操人人爽| 99视频只有精品| 亚洲天堂热| 丁婷婷五月天在线播放| 99热精这里只有精品| 婷婷丁香色五月亚洲| 色婷婷国产精品综合在线观看| 日韩一级| 牛色色碰| 色婷婷六月| 婷婷丁香五月亚洲| 成人婷婷| 五月天婷婷AV| 免费不卡狠操美女视频网| 色色婷婷综合网| 亚洲精品操一操、噜一噜、摸一摸、爽 | 91九色视频在线观看| 天天爽综合网| 婷婷五月天激情五月天网站| 5月丁香婷婷| 狠狠看狠狠| 色播五月婷婷| 五月婷婷激情网| 久久激情五月天| 97热在线精品| 五月激情射| 五月婷婷黄| 亚洲免费在线观看岛国| 99热黄| 禁片二区| 99视频啪啪| 9999热免费视频视频| ai97re99一本| 狠狠干五月| 激情五月天婷婷播播久久综合91| 人与禽A片啪啪| 丰满少妇猛烈A片免费看观看| 婷婷91| 婷婷五月丁香五月| 九九伊人网| 国产成人精品123区免费视频| 麻豆AV一区二区三区| 天天做天天爽| 日本精品人妻无码77777| 白人荫道BBWBBB大荫道| 国产人妻人伦精品一区二区| 日日干日日| 白人荫道BBWBBB大荫道| 国产偷人爽久久久久久老妇APP | 襙比视频| 天天干天天干天天干天天干天天干天天干天天| 婷婷五六日| 99色热综合| 午夜激情五月天| 天天玩夜夜操| 欧美激情综合色综合啪啪五月| 97热精品| 色播五月| 白人荫道BBWBBB大荫道| 成人草榴视频| 禁片二区| 一起草无码| 天天骑日日爽| 春色激情第四色| 五月综合缴情网| 久久久久人妻网址| 色色免费网站| 午夜色婷婷| 色五月丁香五| 久操人| 99在线热| 五月花成人网| 婷婷五月天综合小说网| 色香久久| 天天操综合网| 日韩精品视频中文字幕| 99re在线免费视频| 久九色| 五月婷婷综合网| 欧美精品中文字幕亚洲专区| 亚洲综合色婷婷文学| 五月婷婷黄| 人妻操逼视频。| 亚洲综合色丁香五月天| 99热这里只有精品86| 国产在线中文字幕| 疯狂做受XXXX高潮A片动画| 国产亚洲成人综合| 99九九在线| 99精品视频在线| 激情五月激情综合网| 五月婷婷五月天| 91久女| 婷婷综合精品| 色视五月天婷婷| 五月天激情婷婷| 婷婷午夜| 第1影院之五月婷婷| 99精品在线| 九月丁香五月婷婷| 色色婷婷丁香| 99在线视频。| 丁香五月婷婷超碰在线| 涩涩网五月天| 97操在线视频| 激情五月婷婷综合网| 97人人搞| 天天色天天爱天天爽| 99热青青草| 丁香五月之久操视频| 99热播放| 九九热视频免费| 久久机热/这里只有精品| 影音先锋一区二区资源站| 国产成人综合网| 深爱婷婷丁香五月激情| 久久婷婷综合五月天| 激情五月天情色| 精品无码av丁香五月激情| 综合久久99| 噼里啪啦完整版中文在线观看 | 丰满少妇乱A片无码| 久99久热| 五月丁香花婷婷玉莉AV| 天天综合精品| 超碰高清在线| 久香草视频在线观看| 九九久久99| 国产亚洲成AV人片在线| 激情伊人六| 丁香五月婷婷啪| 五月天堂六月丁香亚州中文字幕久久| 高清无码.com| 五月婷激情影院| 亚洲AV成人无码精品| 久久婷婷五月国产激情综合片| 狠狠狠狠狠干| 五月天婷久久| 亚洲婷婷丁香五月在线| 日本天堂免费99| 操逼电影免费看| 五月婷婷色男女| www.99热| 久久精品综合色| 五月情婷婷| 免费无码毛片一区二区A片 | 99热只有精品在线观看| 99成人在线观看| 五月丁香婷婷色色色| 丁香狠狠色婷婷久久无码视频| 99干日日干| 丁香婷婷五月激情综合| 五月丁香六月婷综合成人综合| 欧美精品A片一区在线观看| 天天精品视频在线观看视频| CHINESE熟女老女人HD视频| 亚洲五月婷婷| 激情综合国产| 狠狠色婷婷7777久综合| 米奇影视五月天| 成人亚洲精品久久久久| 五月天天天操天天爽夜夜操| 久久综合激情| www.97碰碰com| 77799热| 婷婷色网| aa久久| www.日韩国产| 日韩1区2区| 六月色 亚洲| 久久婷婷五月天激情唯美| 极品人妻VIDEOSSS人妻| 欧美狠狠一在草| 五月婷婷婷| 九九人人操| 色欲天天综合网| 殴美日比视频| 亚洲精品国产成人AV在线| 国产成人AV在线播放| 久久怡红院| 91在线视频综合| 五月婷婷丁香五月 | 狠狠狠狠狠狠狠狠| 中文字幕精品推荐免费在线观| 天天夜夜操| 夜色.cnm| 第四色五月天| WWW久| 少妇人妻人伦A片| 在线天堂9| 久久激情五月| 蜜臀丁香黄色婷婷五月天| 五月激情影视| 《战争与艾拉》完整版| 日日夜夜天天| 五月天婷婷伊人| 97干在线视频精品店| 婷婷色爱| 99热99天堂| 大香婷婷| 深爱激情综合网| 操日视频| 五月天婷婷视频| 5月色婷婷| 精品国产一区二区三区四区阿崩| 婷婷六月中文字幕| 婷婷情色五月| 色综合色| 五月丁香六月香香蕉| 看片视频在线免费日产在线看| 色色亚洲无码| 色五月婷婷在线观看第一页舔| 色色网五月激情| 丁香 久久| 激情五月天综合网| 亚洲成人电影aaaa| 九九热青青草| 五月婷精品| 六月激情婷婷色| 五月婷婷很很色| 九九热最新| AV九九| 黄色视频网站在线播放| 亚州色色色| 欧美 日韩 成人在线| 五月丁香影院| 色综合色色色色色| 六月丁香婷婷色狠狠久久| 色吧五月| 五月天婷婷色小说| 很很色丁香久久停停| 婷婷午夜| 99性感视频| 九月婷婷激情| 丁香五月激情综合| 操操操AV| 久久久97| 丁香五月-激情综合| 九九色大香蕉| 激情网 五月天| 丁香六月色| 人妻人人操| 五月天久久综合婷婷丁香| 丁香狠狠色婷婷| 九九热视频在线观看| 综合网视频| 99免费成人网| 婷婷五月天天激情| 天天干天天干天天干天天干天| 丁香五月天激情小说| 亚洲视频操| 无码成人AAAAA毛片AI换脸| 色五月婷婷老师| 婷婷五月俺要去| 色色色在线观看| BBWCUCKOLD精品熟妇| 99男人的天堂| 另类综合国产|