久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码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字段對(duì)不上后端說前端傳的JSON格式我解析不了。這類問題聽上去是小事可一旦進(jìn)入線上輕則功能白屏重則數(shù)據(jù)錯(cuò)亂。所以后來我專門把JSON交互處理這套東西整理成了一套筆記這次干脆把筆記改寫成一篇可以直接拿去參考的實(shí)操文章。這篇文章圍繞的就是一件事前后端之間、服務(wù)與服務(wù)之間的JSON數(shù)據(jù)到底怎么做到“發(fā)得出去、收得回來、兩邊都看得懂”。我會(huì)從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)場(chǎng)我印象很深的一次事故發(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我用接口工具測(cè)的時(shí)候看到的也是正常時(shí)間啊怎么一傳到前端就變成數(shù)字了這個(gè)場(chǎng)景各位寫過前后端分離項(xiàng)目的朋友應(yīng)該都不陌生。問題根本不在“誰對(duì)誰錯(cuò)”而是兩邊的數(shù)據(jù)契約沒有對(duì)齊。后端返回的是Java對(duì)象序列化之后的JSON前端看到的是JSON解析之后的對(duì)象中間經(jīng)過序列化和反序列化這兩道工序只要有一道工序的配置不一致看到的東西就不一樣。1.2 JSON交互的本質(zhì)一份兩端共同遵守的協(xié)議我把JSON交互拆成三個(gè)關(guān)鍵詞結(jié)構(gòu)約定、序列化規(guī)則、解析規(guī)則。結(jié)構(gòu)約定是雙方對(duì)字段名、嵌套層級(jí)、數(shù)據(jù)類型達(dá)成的一致意見序列化規(guī)則是后端把Java對(duì)象變成JSON字符串時(shí)如何轉(zhuǎn)換類型和格式解析規(guī)則是前端或下游服務(wù)拿到JSON字符串后如何還原成自己需要的對(duì)象。三者缺一個(gè)交互就會(huì)出現(xiàn)偏差。舉個(gè)最直觀的說法JSON交互就像兩個(gè)人約定用同一種語言寫信。約定用中文是結(jié)構(gòu)約定按語法把想法寫成句子是序列化對(duì)方讀到句子后理解意思是解析。如果寫信的人用中文但收信的人以為信里全是英文或者寫信人把日期寫成“7月1日”收信人卻當(dāng)成“1月7日”信息就悄悄變了。所以我在項(xiàng)目里定了一個(gè)規(guī)矩任何接口在動(dòng)工前先寫一份字段對(duì)照表。字段叫什么名、什么類型、空值怎么處理、時(shí)間用什么格式、嵌套多深全部寫清楚。這個(gè)習(xí)慣看起來麻煩卻能省掉后面大量“我這邊對(duì)你那邊錯(cuò)”的爭論。1.3 交互處理的最小鏈路拆解一次完整的JSON交互鏈路大概是這樣的后端收到HTTP請(qǐng)求取出請(qǐng)求體里的JSON字符串交給反序列化器轉(zhuǎn)成Java對(duì)象然后業(yè)務(wù)邏輯處理再把返回結(jié)果交給序列化器轉(zhuǎn)成JSON字符串最后寫進(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);看起來只有兩行核心代碼但里面藏著大量細(xì)節(jié)日期類型轉(zhuǎn)成什么格式、枚舉轉(zhuǎn)成字符串還是序號(hào)、數(shù)組空的時(shí)候是輸出[]還是null、下劃線命名的字段和駝峰命名的字段怎么映射、對(duì)象里有循環(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)、帶引號(hào)人能直接看懂。第二種是內(nèi)存態(tài)比如Java里那個(gè)帶著屬性、類型、嵌套關(guān)系的對(duì)象它活在JVM堆里。第三種是傳輸態(tài)就是HTTP請(qǐng)求體或響應(yīng)體里實(shí)際的字節(jié)流可能是被壓縮過的、被轉(zhuǎn)義過的、按某種編碼傳輸?shù)?。很多解析問題本質(zhì)上就是這三種狀態(tài)之間轉(zhuǎn)換時(shí)出了問題。比如后端把對(duì)象轉(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)之后排查問題會(huì)有一個(gè)很清晰的方向先看問題是出在序列化、傳輸還是反序列化。不要一上來就懷疑代碼邏輯寫錯(cuò)了。2.2 String轉(zhuǎn)對(duì)象和對(duì)象轉(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í)候大概率會(huì)報(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è)對(duì)象某個(gè)字段是null默認(rèn)序列化之后這個(gè)字段可能直接消失也可能輸出null取決于全局配置。前端如果寫死了要取這個(gè)字段拿到的卻是undefined頁面上可能就渲染異常。特殊字符是另一個(gè)重災(zāi)區(qū)。JSON字符串里如果包含換行符、引號(hào)、反斜杠序列化時(shí)必須正確轉(zhuǎn)義否則生成的JSON就是非法JSON前端一解析就報(bào)錯(cuò)。更隱蔽的是那些不可見字符比如某些業(yè)務(wù)系統(tǒng)從別的地方復(fù)制過來的文本里帶了特殊空白符肉眼完全看不出來但JSON解析器對(duì)某些字符的處理邏輯并不一致同一個(gè)字符串在A庫解析成功在B庫解析失敗。我對(duì)這個(gè)問題的處理思路很樸素在所有對(duì)外接口的序列化配置里把空值處理策略顯式地定好要么統(tǒng)一輸出null要么統(tǒng)一忽略同時(shí)在接口測(cè)試階段就覆蓋“字符串帶引號(hào)、帶換行、帶emoji”這類用例別等上線了再由用戶幫我們發(fā)現(xiàn)。3. 三個(gè)主流JSON庫的取舍選型不該只看百度搜到哪篇3.1 三庫差異對(duì)照我實(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è)方法搞定大部分場(chǎng)景但功能深度不如Jackson。Fastjson最大的特點(diǎn)是序列化性能在某些場(chǎng)景下確實(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為什么快”會(huì)看到一堆壓測(cè)數(shù)據(jù)確實(shí)在某些場(chǎng)景下它的表現(xiàn)不錯(cuò)。但我選JSON庫從來不把性能當(dāng)成第一指標(biāo)因?yàn)閷?duì)于絕大多數(shù)業(yè)務(wù)系統(tǒng)來說JSON序列化根本不在性能瓶頸上真正耗時(shí)的是數(shù)據(jù)庫查詢和遠(yuǎn)程調(diào)用。我更在意的是三點(diǎn)。第一是否支持自定義序列化器和反序列化器因?yàn)闃I(yè)務(wù)里總有一些特殊字段需要特殊處理比如脫敏。第二對(duì)未知字段、循環(huán)引用、深層嵌套這類極端情況的默認(rèn)行為是否可控能不能通過配置兜住。第三框架自動(dòng)配置的深度換句話說就是我是不是只寫一個(gè)注解就能讓整個(gè)項(xiàng)目的JSON交互行為發(fā)生改變。拿Jackson舉例它支持JsonIgnore、JsonProperty、JsonFormat、JsonSerialize、JsonDeserialize幾乎覆蓋了我遇到過的所有需求。Gson也可以用TypeAdapter做到類似效果但寫起來會(huì)繁瑣不少。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測(cè)試穩(wěn)定后再推進(jìn)如果只是寫個(gè)腳本或者做本地小工具Gson完全夠用。這里有個(gè)特別容易踩的雷一個(gè)項(xiàng)目里同時(shí)引了多個(gè)JSON庫平時(shí)各用各的看起來相安無事等某一天工具類里混用了這兩個(gè)庫的注解和API序列化結(jié)果就會(huì)出現(xiàn)莫名其妙的差異。項(xiàng)目里最好統(tǒng)一一個(gè)主JSON庫工具類只封裝這一個(gè)庫的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è)過程中Spring用的就是當(dāng)前容器里注冊(cè)的MappingJackson2HttpMessageConverter消息轉(zhuǎn)換器負(fù)責(zé)把請(qǐng)求體字符串轉(zhuǎn)成對(duì)象。ResponseBody作用在返回值上或者直接加在類上讓所有方法生效告訴Spring把Java對(duì)象序列化成JSON字符串寫進(jìn)響應(yīng)體。用RestController就相當(dāng)于在類上同時(shí)加上了Controller和ResponseBody這也是現(xiàn)在最主流的寫法。如果你遇到一個(gè)問題后端寫好的RequestBody User user前端傳了JSON過來但user對(duì)象里某些字段為null。不要急著懷疑前端先想想是不是前后端字段名沒對(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è)字段上都寫注解只需要在配置文件里聲明一套默認(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)致日期序列化出來差8個(gè)小時(shí)第三行表示序列化時(shí)忽略值為null的字段第四行讓日期序列化時(shí)不輸出時(shí)間戳而是輸出格式化字符串第五行是反序列化時(shí)遇到未知字段不報(bào)錯(cuò)這對(duì)于前端多傳冗余字段的情況很友好。日期格式在這個(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è)對(duì)象失敗時(shí)返回的是一個(gè)字符串或者成功和失敗字段的嵌套層級(jí)完全不同。前端對(duì)接起來就非常痛苦每個(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ì)里建立的是一套交互契約。每次開會(huì)討論接口時(shí)大家只需要關(guān)心data里是什么而不需要擔(dān)心外面那層殼今天會(huì)不會(huì)變。5. 實(shí)戰(zhàn)踩坑清單日期、循環(huán)引用、泛型丟失、中文亂碼5.1 日期格式不一致典型的“兩邊都對(duì)合不上”接著開頭那個(gè)案例繼續(xù)說。日期格式不一致是JSON交互里出現(xiàn)頻率最高的坑而且它的結(jié)構(gòu)非常一致后端認(rèn)為自己在序列化時(shí)輸出了格式化字符串前端看到的是時(shí)間戳或者前端給后端傳了一個(gè)2024-07-01 12:00:00后端反序列化時(shí)也按這個(gè)格式解析但由于時(shí)區(qū)不對(duì)入庫時(shí)間成了2024-06-30 04:00:00。排查日期問題的順序我一般是先看序列化配置里有沒有指定格式和時(shí)區(qū)再看字段上有沒有被JsonFormat單獨(dú)覆蓋最后看傳輸過程中是否有中間層重新處理了日期字段。有一次我們排查了很久最后發(fā)現(xiàn)是網(wǎng)關(guān)層對(duì)響應(yīng)體做了字符串替換把時(shí)間格式里的斜杠替換成了橫杠結(jié)果后端看到的是橫杠格式的字符串再次序列化時(shí)格式全亂了。所以排查要覆蓋鏈路中的每一個(gè)節(jié)點(diǎn)不能只看服務(wù)端。5.2 循環(huán)引用和懶加載一序列化就整頁報(bào)錯(cuò)循環(huán)引用是后端對(duì)象序列化中最讓人頭疼的問題。舉個(gè)常見的場(chǎng)景一個(gè)訂單對(duì)象里有用戶對(duì)象用戶對(duì)象里又有一個(gè)訂單列表序列化訂單時(shí)Jackson發(fā)現(xiàn)訂單里有用戶用戶又有訂單訂單里又有用戶……如果不做任何限制它就會(huì)無限嵌套下去最后棧溢出。解決循環(huán)引用有三個(gè)方向。第一個(gè)是業(yè)務(wù)上明確不需要閉環(huán)直接在某一端用JsonIgnore把不需要的字段忽略掉第二個(gè)是用JsonIdentityInfo讓相同對(duì)象在序列化時(shí)以ID引用而不是展開完整對(duì)象第三個(gè)是從設(shè)計(jì)上避免雙向?qū)ο笾苯颖┞督o前端改用DTO數(shù)據(jù)傳輸對(duì)象只返回前端需要的那幾個(gè)字段。還有一個(gè)讓很多人踩過的坑是Hibernate的懶加載。一個(gè)實(shí)體類里有OneToMany的關(guān)系屬性沒被訪問時(shí)它是一個(gè)代理對(duì)象直接序列化時(shí)會(huì)觸發(fā)LazyInitializationException。這種情況我一般也用DTO解決顯式地把需要的數(shù)據(jù)查出來再組裝成返回對(duì)象而不是試圖把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對(duì)象里混著一堆LinkedHashMap的結(jié)構(gòu)所有的字段都變成了map.get(xxx)的取值方式。前端說接口文檔寫得不對(duì)后端說我返回的就是數(shù)組。兩邊都很委屈但根源只有一個(gè)反序列化時(shí)泛型信息丟失。Jackson在反序列化時(shí)如果無法得知目標(biāo)元素類型只會(huì)按照最通用的Map結(jié)構(gòu)處理。這個(gè)問題不光影響List任何帶泛型的類型都會(huì)遇到比如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請(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)榭蛻舳藳]帶編碼參數(shù)導(dǎo)致的亂碼。另外還要注意JSON字符串本身對(duì)控制字符是有限制的比如\u0000這類字符不能被直接放進(jìn)JSON字符串。如果業(yè)務(wù)數(shù)據(jù)里可能包含這類字符序列化時(shí)往往會(huì)被丟棄或轉(zhuǎn)義兩端看到的文本就不同。對(duì)于包含接口日志的數(shù)據(jù)我建議在寫日志時(shí)把請(qǐng)求體和響應(yīng)體做一次JSON美化輸出同時(shí)打印轉(zhuǎn)義后的可見字符串這樣定位問題才不會(huì)被特殊字符干擾。6. 自定義序列化器把敏感字段的“對(duì)外長相”攥在自己手里6.1 什么場(chǎng)景值得寫一個(gè)自定義序列化器全局配置解決的是通用問題但業(yè)務(wù)里總有那么幾個(gè)字段不按常理出牌。最常見的場(chǎng)景就是數(shù)據(jù)脫敏。比如用戶手機(jī)號(hào)數(shù)據(jù)庫里存的是13812345678接口返回給前端時(shí)頁面可能只需要展示138****5678。這個(gè)需求如果用JsonIgnore把字段整個(gè)忽略掉前端就拿不到數(shù)據(jù)了如果讓前端自己截?cái)嗄堑扔诎衙撁暨壿媮G給了用戶也不合理。更合理的做法是數(shù)據(jù)庫存原始數(shù)據(jù)接口按場(chǎng)景決定“對(duì)外長相”。后端默認(rèn)配置下敏感字段可以統(tǒng)一掛一個(gè)自定義序列化器序列化時(shí)自動(dòng)脫敏。這樣業(yè)務(wù)代碼里不需要寫任何脫敏邏輯前端拿到手的就是已經(jīng)處理好的數(shù)據(jù)。6.2 手機(jī)號(hào)脫敏字段一個(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ī)號(hào)夠不夠7位不夠就直接輸出夠就把中間四位替換成星號(hào)。字段類上掛注解后Jackson在序列化這個(gè)字段時(shí)就會(huì)走進(jìn)這個(gè)邏輯。這個(gè)思路還能延伸到很多地方身份證號(hào)脫敏、郵箱地址脫敏、銀行卡號(hào)脫敏。規(guī)則不同但寫法大同小異。我用這個(gè)方式在項(xiàng)目里統(tǒng)一處理過一批敏感字段效果很好最大的好處是脫敏規(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重寫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)適配這類場(chǎng)景。新寫的內(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í)候我很少直接打開瀏覽器看頁面而是先用接口測(cè)試工具把請(qǐng)求和響應(yīng)分開驗(yàn)證。我常用的驗(yàn)證步驟是第一步新建請(qǐng)求寫入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ì)問“這個(gè)字段到底是字符串還是數(shù)字”。為了避免這個(gè)溝通成本我習(xí)慣在接口文檔里直接標(biāo)注示例值示例值能寫123的字符串還是123的字符串都要寫清楚。很多字段歧義本質(zhì)上就是示例值不明確造成的。7.2 線上JSON解析異常日志的定位思路線上環(huán)境沒有接口測(cè)試工具那么方便所以日志是排查的主通道。JSON解析異常常見報(bào)錯(cuò)有幾種JsonParseException表示請(qǐng)求體根本不是合法JSON多半是前端拼錯(cuò)了字符或者被中間層截?cái)郙ismatchedInputException表示JSON結(jié)構(gòu)合法但類型對(duì)不上比如前端傳了字符串后端定義的是數(shù)字InvalidDefinitionException表示序列化目標(biāo)本身有問題比如循環(huán)引用、找不到getter方法。我的定位思路是先看異常信息里指向的字段名再拿原始請(qǐng)求體做一次本機(jī)復(fù)現(xiàn)。很多線上解析問題本地一復(fù)現(xiàn)就能定位因?yàn)閳?bào)錯(cuò)信息已經(jīng)告訴你字段名了。真正難的是那種“偶發(fā)解析失敗”這種情況多半和特定輸入值有關(guān)比如某個(gè)字符串里帶了換行符某個(gè)字符串特別長超過了中間件限制。解決偶發(fā)問題的辦法是把請(qǐng)求體完整打到日志里一次復(fù)現(xiàn)就什么都能看出來。7.3 一次排查經(jīng)歷請(qǐng)求體過大與嵌套JSON邊界問題最后分享一個(gè)印象比較深的排查經(jīng)歷。當(dāng)時(shí)線上有個(gè)接口偶爾報(bào)錯(cuò)錯(cuò)誤信息是“Unexpected character...”但同樣的請(qǐng)求參數(shù)重新提交一次又能成功。從表現(xiàn)看像是數(shù)據(jù)傳輸過程中內(nèi)容被截?cái)嗔?。查了一圈最后定位到是網(wǎng)關(guān)層對(duì)請(qǐng)求體大小做了限制超過限制的請(qǐng)求體被攔下一部分后端收到的是半截JSON自然解析失敗。解決方法是調(diào)大請(qǐng)求體限制并在網(wǎng)關(guān)層增加對(duì)Content-Length的校驗(yàn)超長的請(qǐng)求提前返回明確提示而不是讓它進(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
返回資訊列表
91w欧美| 99rre在线精品99re8| 91无码中出人妻视频| 人妻一区二区三区| 久久春色| 超碰91在线| 日韩色图 一区二区| 操逼啊啊啊91| 99精品综合久久久久五月天| 三级激情网站| 亚洲性综合| av影片在线观看不卡| 探花激情视频| 少妇高潮九九九九九九九| 国产亚洲日韩欧| 狠综合网| 手机在线人成免费视频| 欧美激情1区| 精品精品精品| 91精品人妻偷情| 丝袜熟女2P| 91美女片在线| 99色婷婷中文字幕乱色| 在线无码操| 综合情欲网| 性色av蜜臀av色欲aV| 亚洲精品1区| 91久久久久久久| 夜夜欢天天干| 欧美国产视频| 人人搡人人肉久久精品| 97超碰人人模人人拍人人| 久久久男人的天堂| 亚洲丝袜色| a男人的天堂久久一级A毛片| 欧美影音在线| 99精品无码| 91久久| 97国产天堂岛| ,国产乱人伦精品一区二区三区| 八戒午夜福利理论片| 日韩欧美蜜桃精品久久中文字幕久久 | 中文字幕精品一区二区精| 超碰综合97在线| 艹我哪美一区无码| 91久久免费视频互動交流| 97精品在线| 久久偷拍人| 九九久久精品| 性一交一乱一交A片久久四色| 94色色电影网| 婷婷色色五月天| 久久性爱视频免费看| 久久精品电影| 人妻大香蕉| 激情AV| 熟女精品va中文字幕| 亚洲第一页第二页激情| 欧美天天干| 麻豆区久久久久亚| 亚洲精品蜜桃久久久久久久| 日本999精品视频| 国产欧美第五页| 国产亚洲深夜激情| 国产在线激情视频| 丝袜剧情| 狠狠操夜夜操蜜桃视频三区| av天天在线观看| 九月婷婷综合| 九九玖玖精品| 欧洲精品久久| 在线免费试看60秒| 亚洲日韩久久精品一区| 亚洲丝袜99| 操逼片国产| 操屄日韩| 色色色天美视频| 91超碰人人操| 亚洲中文电影| 九九九九精品精| 立川理惠被中出无码| 2021国产成人精品久久| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 97操| 综合色色婷婷| 伊色综合天堂色97| 日欧毛片久久| 一区二区影视| 天天干,天天日| 色 婷97| 加勒比综合网| 96久久精品一二三区色欲| 人人爱操| JuliaAnnXXX888| 亚洲精品久久久久毛片A片拉屎| 一级一性爱免费视频| 日本性爱网址| 日本一片一区| 91中出| 女人爽到高潮潮喷18禁网站| 国产久久一区二区三区野外在线| 久久色精品视频在线| 国产亚洲美日韩Aⅴ中文字幕无码成人| 丁香九月激情啪| 夜色97| 热久久国产| 国内外色色色色色成人视频| 91黄射| 黑人狂躁日本妞一区二区三区| 精品精品精品| 中文字幕天堂在线| 日日骚 av| 一级二级三级黑人无码| 97精品国产手机| 牛牛操视频逼| 日日干日日摸| 一区二区三区 丝袜 高跟 美腿| 91精品导航| 婷婷亚洲五月***久久| 性色av一区二区| 九九综合久久中文字幕| 2017超碰| 亚洲欧美国产其他二区| 99久在线精品99re8| 加勒比久久综合网高清| 丝袜足交视频| 日韩美女,国产传媒,视频一区| 日韩性爱人人爱人人操| 中文字幕一二三av| 成人天天看站长推荐| 国产视频一区二区三区久久亚洲天堂| 狠狠操,使劲操| 久久视频,这里只有精品| 欧美一级色| 人人操人人摸人人骑| 欧美日本天堂| 天天操夜夜操| 亚洲无线观看久久| 欧美性爱一区二区三区| 超碰久久网| 久久久久人妻| 婷婷五月天成人网| www.黄色在线| 蜜乳中文字幕a在线| 国产日产欧产美韩系列麻豆免费| 大香蕉十区| 亚洲成人无码影院| 欧美日韩另类在线播放| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 欧美中文字幕日韩在线| 久久久四区| 久久极品伊人| 欧美日韩国产高清在线一二三区 | 色亚洲欧美| 久久久久婷婷精品av电影| 日本丝袜美腿人妻九九| 午夜呻吟欧美| 欧州色图区| 伊人五月天| 中文字幕中文字幕一区二区| 久操网视频| 日本人妻丰满熟妇久久久久久| 91操熟女视频| 色欧美在线| 韩日精品福利视频一区不卡在线免| 精品久久在线区一区| 久久精品人体AV| 开心五月婷婷| 亚洲美乱| 色综合久久夜色精品国产天堂| 美女的肌被草喷水视频| 嗯嗯嗯不要不要免费视频| 校园春色综合| 人妻色情天天操| 色综九九九一区| 清纯唯美亚洲另类| 欧美色91| 久久久久久日韩| 插入逼91| 日韩精品碰碰| 在线观看黄色电话| 夜夜中出国产| 欧美黄色大片在线观看| 日本性爱网址| 婷婷中文字幕| 亚洲天堂日本| 九九九九精品| 久久草在线综合视频| 九九热最新| 日韩一区二区熟女| 久久精品人妻一区二区三区| 99人妻| 国产精品一区二区手机看片| 亚殴在线| 亚欧美综合网| 大香蕉琪琪日本女优不卡| 国产综合永久精品日韩鬼片| 蜜乳AV色欲AVAV无码| 日韩伦理久 久久 清纯| 中文字幕av一区二区三区人妻少妇 | 欧美丝袜91| 91搡老女人老妇女老熟女歌词翻译| 操逼操逼视频操逼| 一区二区三区国产在线播放| 色色婷| 操老熟女AV| 国内毛片热久久思思热| 久久婷婷五月| 欧美精品一二三| 99热色精品| 传媒在线观看一区二区三区| 精品一区二区综合熟妇| 99www.bibizy香蕉资源国产一区二区三区高清 | 久久草在线综合视频| 男人的天堂久久狠| 人人操人人爽人人操人人| 色官网在线| 激情文学小说一区二区| 亚洲一级性爱视频免费看| 精品网站9999| 国产对白刺激视频| 人妻无码视频一区二区三区久久| 激情干在线| 裸体女人草逼视频播放一区,二区,三区,四区,五区 | 98福利在线视频| 草草草视频在线免费看| 久久精品视频在线观看| 免费一级a毛片久久久久久鸭绿欲| 2025亚洲男人天堂| 日韩精品中文字幕一| 婷婷九月丁香| 91老司机在线视频免费观看| 摸奶性爱视频网站在线免费播放| 久久精品国产99国产精品亚洲| 亚洲国产精品V?在线播放| 99黄页网站| 深夜激情无码| 1769一区| 久久精品天美| 尤物一级在线免费观看| 日韩中文字墓| 激情亚洲天堂| 91狠狠综合久久| 日本色色色网站免费看不卡| 亚洲性爱免费电影| 美欧色综合| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 国产1727欧美| 熟女字幕| 在线视频免费播放一区| 翔田千里AⅤHD无码| 大香蕉欧美| 久久久久久综合久久伊人蜜月| 久99在线免费观看视频| 综合熟妇一区二区三区| 日韩一卡二卡三卡| 91女优在线观看 | 天天看特黄的免费网站| 操B久久| 热久久九九热| 国产精品久久久久久久免牛肉蒲团| 观看免费区二区三区二| 亚洲三级网址久久最新| 欧洲一区二区三区四区在线观看| 午夜激情成人在线观看| 国产女人高潮嗷嗷嗷叫小说| 亚洲最新a在线观看| 色婷婷在线视频| 1024久久高清视频| 在线一区| 91亚洲在线| 男人高清无码一区二区| 五月天开心网| 天美传媒在线一区| 91欧美综合| 国产AV激情无码久久无码| 天天日天天爽| yazhouzaixian| 精品一级毛片在线观看| 翔田千里av一区二区三区| 亚洲熟妇图片| 欧美美女视频| 亚洲s在线观看| a在线观看| 欧美伦乱| 久久国产对白激情浪潮| 亚洲天堂99| 欧美视频一区二区在线| 亚洲成人无码影院| 在线综合 亚洲 欧美中文字幕| 手机在线人成免费视频| 在线毛片片免费观看| 亚洲欧美洲综合| 久久久久久久9| 中文熟女五十乱码在线| 欧美丝袜美女电影一二三四区| 亚洲免费97免费| 超碰97最新人妻| 国产性爱欧美性爱在线| 风间由美日韩欧美久久| 91精品导航| 国产精品视频在线观看| 亚洲A曰本VA欧美VA视频| 日韩成人无码| 手机在线人成免费视频| 999国产精品999| 2018色综合天天操| 一区=区三区视频| 精久久久| 97干在线视频| 九月丁香婷婷色| 97在线观看免费视频l| 免费超碰97久久| 欧洲精品欧洲精品| 国产肏逼网站| 激情五月天婷婷| 欧美在线色图| 中文字幕在线免费观看 | 天天躁日日躁AAAAXXXX国产| 色婷五月| 97天天插| 超碰4A| 亚洲一区二区三区在线激情| 亚洲日本韩国在线| 超碰97综合网| 亚洲最大无码中文字幕网站| 日han少妇无码| 好属操| 亚洲AV成人在线| 欧美激色| 欧日a| 欧美少妇性乱| 熟女激情综合网| 色五月婷婷麻豆在| 精品免费囯产一区二区三区| 夜夜高潮夜夜爽| 玖玖大干人妻| 女同性恋久久| 九九九不卡| 蜜桃久久一区二区三区| 99国产女人| 91 在线亚洲| 久久婷婷电影网| 久久色激情一区二区三区| 成 人 A V免费视频在线观看| 日韩黄色成人性爱| 亚洲中文字幕av | 97国产精品一区二区传媒公司| 97精品综合久久| 天干天干天干天天做| 久操精品网| 伊人操| 校园春色中文字幕AV| 中国一级操逼视频| 天天性射网| 中国熟女91| 人人插人人搞人人操| 91欧美经典| 98一区二区精品| 女生91网站| 日韩/97| 人看人人摸人人操| 欧美亚洲厕所精品偷拍91| 熟妇的味道HD中文字幕| 一区二区三区四区在线不卡| 亚洲精品美女久久久久久久久| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 伊人五月天青青草婷婷| 777奇米影视777四色| 欧美人妻熟女在线| 中文字幕日韩综合| 亚洲第2页| 在线视频亚洲无码| 久久综合久色欧美综合狠狠| 欧美色综合图片| 日语五十路和六十路亚洲国产精品| 国产av热热色| 欧美日韩天堂| 欧美激情综合| 精品人妻一区二区视频| 校园春色亚洲色图| 欧美色图成人网一区二区 | 免费av在线播放二区| 性一级黄色录像片网站导航 | 香蕉综合网| 国产AV久久久蜜爱影集| 日韩免费高清大片在线| 欧美欧美少妇| 亚洲天堂男人天堂网| 五月天精品| 校园春色中文字幕AV| 日本三级日本三级三级人妇四虎| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 天天综合官网| 大奶的诱惑| 欧美色图欧美| 1000部熟女视频在线观看| 好吊色青靑草| 欧美极品| 日本激情免费大片| 黄色高清无码无码破解免费暗网| 国产v片在线免费观看| 免费看片黄| 黑人无码一区二区| 国产亚洲一黄| 日韩熟女精品无码专区一区二区| 神马视频久久久久久| 97玖玖人妻| 日本天天干天天搞一区| 天天操熟妇| a片在线播放| 樱花蜜乳av| 亚洲一级性爱视频免费看| 色小视频蜜乳| 欧美在线视频播放| 99re在线精品78| A级片日韩欧美国产欧美视频精选观看| 久久久久熟女| 人妻偷拍一区二区三区| 国产一区二区三区精品观看啪| 国语人妻精彩刺激| 中出789在线视频| 性欧美91| 国产精品亚洲一区二区三区四区| 亚洲欧美伦综合| 91东京热男人的天堂| 欧亚乱色熟女一区二区| 欧美性天天影视| 九九久精品| 成人三一级一片aaa| 亚洲色五月| 久久啊啊啊视频| 九九热av| 96精品在线| 91精品国产91熟女| 日本一区二区不卡精品| 久久久久亚洲精品| 欧美AB在线| 高清在线偷拍自拍视频| 加勒比人妻综合| 俄罗斯一区二区视频在线观看 | 色噜噜综合在线| 欧美日韩人妻精品一区二区三区| 多毛小伙内射老太婆| 欧美久久婷| 亚洲国产精品无石码久久| 一个人免费HD91视频| 中文字幕天天操| 国产一级特黄大片处女| 国产老熟女| 78超碰| 亚洲日本韩国极品一区二区| 美国日韩黄片| 国产欧美日韩臀| 热99这里有精品综合久久| 美女诱惑1区2区| 亚州综合色| 亚洲欧洲无码97久久精品| 午夜福利激情在线视频| 都市激情人妻一区二区青青操视频| 国产一区自拍欧美日韩| 午夜九九| 日本三级网页| 欧美少妇高潮| 九九热免费在线国产视频伊人五月| 思思视频免费看网站| 国产风韵犹存熟妇三区| 亚洲国产剧情少妇激情| 女同性恋久久| 一区二区影院| av天堂精品久久| 999国产精品999久久久久久| 强奸熟女一区二区三区 | 性影在线视频| 日本韩国国产精品一区| suv精产一二三区| 日韩电影天堂视频一区二区| 亚洲人精| 久久深夜无码| 久久9精品视频| 麻豆国产尤物AV| 婷婷综合网站| www.99在线| 被男人吃奶很爽的毛片| 神马久久久久久| 久久亚洲一区二区色婷婷| 色综合中文字幕不卡| 久久社区一区二区三区| 香蕉国产精品麻豆亚洲欧美日韩 | 和协影院中文字幕三区| 东京热一区二区三区四区五区六区| 狠狠干狠狠干| 黄色av一区二区在线| 婷婷操视频| 久久久久久久97| 国产精品成人AV片免费看网站 | 国产欧美精选激情视频| 久久精品店| 青椒国产97在线熟女| 成人无码在线视频网站| 亚洲精品国产专区在线观看| 思思热久久成人| 男人高清无码一区二区| 91天堂色男人的天堂| 99久久久久| 天天爽夜夜操| 大香蕉碰| 欧美精品 - 91爱爱| 亚洲综合另类色图| 久久在线观看免费视频| 无码动漫av中文字幕| 欧美激情另类一区二区| 国产97视频| 亚洲国产一级黄色视频| 一区二区三区在线美女| 强奸乱伦Av网| 中文高清一区二区的| 国产欧美成人精品| 久久久亚洲精品中文字幕人妻| 日韩图色| 91人妻最真实刺激绿帽| 四虎AV在线观看| 久久发布国产伦子伦精品| 好看的91视频| 91欧美www| 欧美性爱第一区| 99热这里只有精| 少妇内射视频| 国产一级片| 91麻豆天美国产欧美日| 亚洲在线综合| 日本高清_区二区三区| 九九九久千久久激情蜜桃在线看| 精品国产乱码久久久兰草影视| 亚洲熟妇AV日韩熟妇在线| 日本国产亚洲一区在线观看| 白丝1区2区3区| 久久成人网站| 人人干黄色| 亚洲欧综合另类无码一区| 麻豆 亚洲 97| 91操熟女| 九色97| 天天操妹子| 五月婷婷AV| 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 日产狠狠干| 久久久成人免费av电影| 午夜αv| 奸色色 男人天堂 天天射| 嗯嗯啊啊啊好爽| 留下AⅤ黄色片| 性交一区二区在线播放| 成人性爱高清视频免费看| 91日日夜夜| 亚洲成熟国产精品美女| 日本好吊色视频| 黄色小视频日本txt| 国产97/欧美| 日本午夜久久电影| 亚洲激情欧美色图 | 国产白嫩漂亮KTV在线| 老女人老91妇女老热女| 色婷婷网| www欧美91| 99精品在线观看| 人妻少妇精品视频一区二区三区| 天天综合91在线| yaouchengrenav| 330dv亚洲成年视频网| 亚欧成人中文字幕一区| 91无遮挡| 极品人妻少妇综合| 亚洲男人天堂网久久| 国产又黄又爽又刺激久久久久久| 天天摸天天舔天天操| 强奸乱伦麻豆| 91精品91久久久中77777| 亚洲精品久久久久毛片A片拉屎| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 91色碰| 国产日韩在线播放av| 亚洲 在线| 国产精品另类一区大香蕉| 狠狠干综合| 强奸乱伦亚洲第一页| 欧姜老司机| 色五月AV在线| 麻豆精品A片免费观看| 婷婷中文字幕| 极品色www影院| 国产欧美精选激情视频| 国产熟女精品一区二区| 97久操| 天啪| 麻豆AV一区二区天美传媒| 干B| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 欧美日韩欧美| 思思久热在线精品66| 天久久久噜噜噜久久国产精品爽爽| 97视频900| 麻豆区99999| 人妻美腿丝袜制服诱惑综合天堂-| 免费看日产一区二区三区| 熟女人妇一区二区三区| 色婷婷视频| 人妻碰碰碰碰碰碰| 精品夜夜澡人妻无码| 欧美图片偷拍| 色天堂在线观看| 九草在线大香蕉| 今日头条成人一区二区三区四虎精品| 绯色AV粉色AV蜜臀AV| 蜜臀亚洲综合一二三四区| 人妻另类| 国产精品久久久久久久AV大片| 黄色av网站在线播放| 综合 欧美 亚洲 日本| 日韩AV无码中文一区二区| 性爱乱伦网址| 欧美制服另类丝袜| 国产不卡中文字幕免费avi| 国产精品一区二区手机看片| 黄色小视频日本txt| 九九九九久久久| 九热大香蕉| 久久欧美激情| 人妻一区二区三区视频| 日韩人妻精品久久久久| 密乳视频在线| 欧美亚洲一级在线观看| 国产精品久久久视频| 91天天综合在线观看| 九月丁香婷婷色| 亚洲第一在线视频| 狠狠狠狠狠狠| 久草这里只有精品 | 亚洲国产一区二区三区四区国产| 性爱欧美五月| 9118禁| 亚洲av无线观看| 亚洲综合贴图91 | 性九九九九九九| 躁躁躁日日躁2020| 亚洲成人福利电影免费 | 超碰人妻久久| 久久精品性| 黄色交缠性感爆操91国产精品免费一区二区三区| 97网色| 丁香六月啪| 天天日骚逼熟女| 国产成人自拍视频视频| 婷婷丁香五月激情啪啪| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 蜜臀色乳| 欧美性爱18观看| 亚洲精品欧美专业| 啪啪啪东京| 夜夜操夜夜爽夜夜高潮| 亚洲97超碰| 欧美有码亚洲中文字幕一区二区三区四区| 亚洲毛片久久| 精品国产乱码久久久久久久久1| 99re28在线观看| 亚洲精品久久久久久久久豆丁网| 91这里只有精品| 久久亚洲熟妇在线视频| 欧美激情中文字幕另类小说| 欧美色老汉| 9超碰免费| 极品极品色影院| 国产91影院| www.男人天堂| 美中韩AV综合网| 天堂俺去俺来也www久久婷婷| 欧美人妻熟女在线| 粘花网06av视频| 3028国产精品| AVE乱伦| 美女视频尤物网在线看| 欧美狠狠鲁| 亚洲精品一区二区三区在线播放| 少妇一区二区三区| 欧洲精品网| 久久精彩免费视频| 久久的免费性爱视频| 色偷偷超碰亚洲| 巨爆乳肉感一区二区三区竹菊影视 | 午夜男女爽爽爽影院视频| 亚洲人在线成线成人| 久久这里是精品| 亚洲欧美日韩中文播放| 熟女精品一区二区在线观看| 日韩天堂av电影在线观看| 日本人妻A片成人免费看片| 中日韩一区二区三区欧美| 91色亚洲| 乱人乱色一区二区三区免费| 色诱中文字幕| 亚洲国产欧美日韩人妻日中文| 婷婷色五月激情| 日本综合久久| 91久久免费视频互動交流| 亚洲中文字幕精品一区| 最新无码国产| 亚洲图片小说欧洲| 午夜视频久久久| 亚洲欧美日韩电影网站一区 | 欧亚洲精品有视频| 日韩欧美亚洲一区二区三区影院| 亚洲暴力强奸AV| 精品无码产区一区二| 色婷婷五月综合| 逼逼逼逼操操操操操操操操操午夜剧场| 欧美成年人性爱视频免费观看| 久久熟女嫩草成人片免费 | 欧美,日韩,中文,另类| 台湾大香蕉99热| 亚洲综合小视频小说在线观看| 无码自拍SM| 免费家庭乱伦视频| 日韩无码黄色片| 午夜免费福利视频一区| 国产av白丝| 60秒免费小视频| 黑白配性爱AV成| 亚洲激情深爱文学小说网站| 殴美性天天| 操逼www.| 国产成人无码a| 亚洲欧洲国产综合av| 亚洲男人天堂Av| 色香阁在线| 91在线国产后入风骚翘臀美女素人| 78精品| 国产精品直播在线观看直播| 新版天堂中文资源8在线| 婷婷综合五月| 五十路熟女工口| 欧美日韩亚洲少妇寂寞影院正在播放| 91美女小视频| 91日本在线观看| 精品国产99| 中文字幕三四五区| 国产精品高潮呻吟av久久4虎| 99热国产| 蜜臀99久久精品久久久久久| 日韩一级欧美一级国产一级台湾| 啪啪一区| 蜜臀99精品国产高清在线观看| 懂色aV一区二区天美传媒| 一级啊性爱在线视频| 另类av天堂| 欧美综合色,www| 再深点灬舒服灬太大了好硬好爽| 夜夜免费视频| 先锋色眉乱伦资源| 一区二区国产视频在线观看| 精品国产乱子伦一区二区三区,精品一| 亚洲天堂另类小说男人| 78精品| 色青青久久影视| 精品中文一区二区| 亚洲国产高清福利视频| 精人妻无码一区二区三区伊人直播 | 大香蕉免| 成人性爱美曰韩| 人妻天天爽夜夜爽2| 热思思免费视频| 九九热超碰97亚洲最新香蕉| www.亚洲黄色| 校园春色亚洲无码| 亚欧Av| 亚洲欧美小说| 欧美天天综| 欧美久久人人网| 亚洲熟久久| 最新国产亚洲精品精品国产亚洲综合| 青青草依人大香蕉| 亚洲午夜免费狠狠干| 富女玩鸭子一级毛片| 97在线观视频免费观看| 国产精品无码在线| 日本一区二区亚洲综合| 亚洲日韩东京热一区| 九九综合久久| 日本淫乱女一区二区三区视频| 91欧美综合在线| 中日高清无码操逼视频| 中国少妇啪啪视频| 超碰1997| 亚洲有码 视频一区| 日本操逼视频在线| 老女人碰碰在线碰碰视频| 开心五月深爱五月| 日本视频在线中文字幕| 欧美精品亚洲精品日韩传电影| 观看免费区二区三区二| 无码少妇精品一区二区60岁老人| PMv在线观看| 不卡六六在线91| 免费看毛片操穴| AV免费在线播放一区| 97超级久久| 台欧久久精品视频| 日韩人妻资源在线看| 国产熟女乱论| 久久久久久69国产一区二区| 久久AV无码AV| 91丨人妻丨国产丨丝袜| 屁股久久久久久| 欧美综合另类| 亚洲天天自拍| 亚洲视频精选| 东京热男人的天堂| 熟女激情综合网| 日本人妻最新在线中| 欧美天天干| 亚洲中文字幕在线视频一区二区| 色婷婷国产精品一区在线观看| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 一级乱伦网站| 亚洲阿v天堂在线| 五月丁香六月综合缴清无码| 97精品一区二区视频| 午夜舔阴达高潮视频免费看| 久啪视频| 97美日韩视频| 欧美高清无码免费视频高清版| 看日韩黄片| 1769国内精品视频| 亚洲色欲天天天堂色欲网女| 午夜福利免费福利视频| 五月婷婷色| 免费久久9999| 日韩一级二级三级| 先锋女优在线观看视频| 欧美片第一页| 五月天色五月| 久久久性少妇| 欧美一区二区日韩三区| 欧美丰满熟妇XXXX性ppX人交| 91欧美高清| 婷婷精品国产欧美精品亚洲人人爽| 啊啊啊好想要| 久久婷婷亚洲| 2026国产精品视频| 国产无码三级视频在线观看| 97超碰人人操人人操| 欧美极度丰满熟妇hd| 香港成人一级视频在线青青草| 九九热精品视频六| HEYZO高无码国产精品227| 深夜国产一区二区三区在线看| 98一区二区精品| 久操免费观看| 婷色五月天| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 精品福利| 国产成人亚洲精品自产在线| 天天超级碰碰碰| 亚洲性爱电影| 少妇500双飞99| 四虎精品永久在线播放| 亚洲另类综合欧美| 欧美性天天影院| 精品成人动漫一区二区| 屌妞视频久久久久久久久久久久| 少妇特黄一区二区三区| AV天堂国产| 亚洲精品一区二区三区新线路| 久久久久女教师免费一区| 这里只有精品视频在线观看麻豆| 婷婷激情综合网| 国产搭汕a级片| 99久久99九九99九九九| 五月天人妻综合| 久久精品国产亚洲AV成人直播| 在线啊啊啊啊| 日本韩国国产精品一区| 330Dv国产女人终合视频极品人与兽| 欧美亚洲情色| 老熟女熟妇| www成人啪啪18秘 免费| 亚州欧美在线| 日韩av乱伦| 乱性AV| 午夜AV污污污| 色色色色网站| 天天综合~91| 亚洲无限观看| 久久久久久欧美精品se一二三四| 亚洲天堂精品日韩电影| 亚洲视频二区 | 国产精品久久久鸭无码的功能| 男女啊啊啊| 97色视频在线| 玖玖婷婷五月天| 综合伊人激情| 老鸭窝在线视频播放| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 综合97久久| 久久人妻97久久久久久久| 国产a级午夜毛片| 一本一道波多野毛片中文在线| 九九综合九九综合| 国产熟女无套内射| 天天天干977| 九九九九九九免费视频| 亚av顶级裸体一区二区三区四区五区| 无码自拍SM| 亚洲国产成人福利在线观看| 国产白丝网站| 91精品久久久久| 91超碰丝袜制服| 综合网亚洲1| 蜜桃臀AV在线| 日韩在线观看AV| 国产97综合| 欧美伊人电影| 蜜臀久久99精品久久久久久婷婷 | 91+欧美| 97干在线看| 美女裸体麻豆天美蜜桃91| 97视频7| 91欧美性| 欧美日本不卡在线| 色97干| 乱伦日本中文自拍| 国内精品久久人妻性色av| 亚洲天堂人妻熟妇视频| 日韩乱插| 91女人的网站| 熟女露脸激情自拍视频| 性感女人网页在线观看视频| 久久视网78| 97色论| 伊人四虎综合| 亚洲在线A| 尤物视频视频官网| 377p欧洲日本亚洲大胆| 久久九九网| 熟妇熟女一区二三区| 欧美人妻中出| 亚洲一区二区三区婷婷| 免费公开人人操| 亚州情色j区| 人澡逼| 日韩黄色片子| 91色婷婷综合久久中文字幕二区| 熟女人妻av在线资源,黄色的资源| 亚洲一二三四区机械| 91欧美长吊| 久久中文字幕女同性恋一区| KK色在线影院| 91亚洲人| 亚洲偷拍自拍在线视频| 中文字幕精品丝袜| 亚洲。天堂。日本在线观看| 久久尹人大香焦视| 国产av波波国产精品| 亚洲欧美精品一区天堂久久 | 日韩欧洲操屄视频| www.99色| 中文字幕少妇色| 欧美美女视频| 午夜福利成人免费视频| 久久视频,这里只有精品| 国产精品99精品视频网站| 亚洲欧洲视频小说在线观看| 色97欧美| 久久婷婷六月综合| 久久99久久99精品天美传媒棢·纸:.| 试看日韩黄片| 天天射网| 日本色色色网站免费看不卡| 91久久久久免| 久久在肏| 欧美亚洲玖玖玖| 国产强奸乱伦第1页| 韩日精品四区| 中文字幕后石码四区五区| 深爱激情五月天| 中文字幕黄色一起草| 日韩三级久久久| 中文字幕制服诱惑| 天天摸夜夜摸| 26uuu欧美日韩| 蜜臀va69| 男人的天堂不卡一区二区| 2023天天操夜夜操| 日本999精品视频| 一区二区视频在线播放| 78超碰| 亚州图片第一页| 婷婷情色综合网| 免费伦费视频在线观看| 天美麻豆一区二区三区| 五月天久久婷婷亚洲| 国产 v乱码一区二| 国产后入| 91日韩网站| 午夜综合在线| 亚洲综合网电影91| 18禁看网站一区| 欧美偷| 肉丝网站91| 97综合在线| 26uuu久久| 久久神马影院| 99少妇精品视频| AA特级绝黄| 丰满少妇一区二区三区免费看| 超碰97欧美日韩| 97色在线观看| 加勒比大香蕉视频在线| 国产欧美精选自拍一区| 2024黄色视频| 久久男人| 东北老熟女| 中文字幕亚洲欧美在线不卡| 亚洲色图91欧美日韩| 亚洲无套久久嗯嗯| 色吧综合网| 综合久| 十八禁啪啦拍视频无遮挡| 免费一级a毛片久久久久久鸭绿欲 国产精品亚洲天堂网址 | 超碰诱惑| 国产白丝网站| 日本精品一区二区三| 亚洲精品人伦一区二区| 99www.bibizy香蕉资源国产一区二区三区高清 | 久久美女福利是上海美女| 超清福利精品视频在线| 十八禁视频一区二区| 欧美色欧美| se吧提供国产乱老熟视频胖女人| 97香蕉网| 亚洲精品无码成人久久久99| 国产日韩精品人妻久久久久色欲网站| 一区二区三区在线美女| 日韩特级毛片免费观看全集| 视频一区二区三区精品| 亚洲一区二区在线观看91| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 久久综合女优| 91天堂色男人的天堂| 婷婷色在线| 久久AV无码网址| 97国产精品国| 欧美日韩系列| 中文字幕丰满子伦无码专区在线视频最新| 91精品国产一区三一| 欧州一区二区三区四区| 日韩三A大片在线观看| 啪一啪免费视频| 天天色悠悠激情| 久草精品一区 | 777超碰| 少妇厨房愉情理伦片bd在线观看 | 9999伦理视频| 长久操视频| 欧美黄页| 99re6在线视频精品免费完整版安卓版| 不卡视频一区蜜桃视频 | 丝袜高跟澳门91视频| 无码久久国产| 精品一区二区三区蜜桃臀赵总 | 欧美日韩在线国产在线| 欧美日韩国产中文精品字幕自在自线, | 中出91视频| 丰满人妻无码一区二区三区| 丝袜狠狠草尤物人妻av91| 亚洲a色| 日日摸夜夜夜夜爽| 亚洲中文电影| 中文字幕97| 97色插| 性91| 国产伦精品免编号公布| 热热色91| 色香色欲天天综合网天天来吧| 婷婷丁香一区二区三区| 亚洲欧美97√| 色99色| 久热这里只有精品9| 亚洲国产成人高清在线| 欧洲站一级二级三级h| 中文字幕av亚洲在线| 亚州高清AV| 九九色逼| 在线视频97| 久久综合18p| 亚洲av综合色区图片亚洲| 亚洲综合色男人网| 午夜福利在线合集| 盗摄女人妻在线| 91爱欧美| a网站免费观看| 亚洲欧洲日本精品中文a∨| 欧美熟妇精品黑人巨大一二三区| 日本人妻中文字幕精品| 91女优在线观看 | 国产亲戚伦亲在线| 亚洲蜜臀精品视频久久| 亚洲精品视频二区| 无码久久国产 | 美女网站91| 久草热制服丝袜在线观看| 欧美性爱视频免费一区一A| 麻豆 亚洲 97| 97色色婷婷| 另类亚洲一区二区三区| 激情终合网| 亚洲AV成人无码一区二区三区在线观看 | 欧美精品在线观看| 天天看天天在线精品| 亚洲清纯综合| 啊灬快c我灬啊灬用力灬啊灬-国产精品性做久久久久久-成人AV | 亚洲综合91| 人妖欧美一区二区| 91色五月俺来也| 日韩人妻精品久久久久| 久久久国产亚洲精品系列| 60秒不遮不挡| 少妇大屁屁| 亚洲AV色图一区| 天欧美在线| 久草久日| 99亚洲人人| 美女91在线观看| 亚洲五区熟女| 女同在线视频一区| 天天日夜夜| 日本女优在线视频福利| 中国国产精品一区视频| 北约熟女超碰| 狠狠爱大香蕉| 亚洲欧美日韩免费观看| 日韩在线观看三级电影| 伊香蕉综合久久久久久久噜噜噜| 这里都是精品| 欧美日韩亚洲天堂| 国内外内射高清视频| 91网九色蝌蚪操熟女| 女欧美一区二三区| 久久男人精品| 亚洲最大无码中文字幕网站| 在线综合色| 狠狠狠狠狠干| 国产一区二区三区不卡手机在线| 91oumei| 日日夜夜青青草母狗| 亚洲诱惑天堂| 日本女人久久久| 波多野42部无码喷潮在线观看 | 澳门人妻久久| 啊啊啊用力在线观看| 久久夜夜夜夜|