亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

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

Feign RequestInterceptor實戰(zhàn):統(tǒng)一請求頭與防篡改簽名

Feign RequestInterceptor實戰(zhàn):統(tǒng)一請求頭與防篡改簽名 1. 攔截器解決的四個真實場景從統(tǒng)一請求頭到防篡改簽名先講一個很典型的痛點。我之前在給某開放平臺做聯(lián)調(diào)的時候要對接十幾個第三方接口每個接口都要求帶clientId、timestamp、sign這些公共參數(shù)而且服務端驗簽特別嚴格。最開始圖省事我直接在每一個 Feign 方法里手動塞請求頭代碼寫成這樣PostMapping(value /order/create, headers {X-Client-Idclient-001, X-Signabc}) Order createOrder(RequestBody OrderCreateRequest request);表面上看沒什么問題但真跑起來就難受了。簽名里往往要帶上時間戳和請求體內(nèi)容headers注解里寫的是靜態(tài)值根本無法根據(jù)每次請求動態(tài)計算。后來只能改成在方法內(nèi)部用RequestContextHolder拿請求對象、再塞進 Feign 的配置里……繞了一大圈最后還是繞回到RequestInterceptor上。我當時的結(jié)論是只要你的 Feign 客戶端需要做“每個請求都要做一遍”的事情就應該考慮攔截器而不是在業(yè)務代碼里到處復制粘貼。具體來說有四類場景特別適合用RequestInterceptor統(tǒng)一處理場景典型需求不用攔截器的后果令牌傳遞下游接口要求Authorization: Bearer xxx每個方法單獨處理漏一個就 401鏈路追蹤透傳traceId、spanId等鏈路標識排查問題時很難串起整條調(diào)用鏈多環(huán)境隔離聯(lián)調(diào)環(huán)境、預發(fā)環(huán)境路由到不同實例或帶不同標識改一處要重新編譯部署接口簽名請求頭附帶timestamp、nonce、sign防篡改防重放動態(tài)簽名根本沒法用靜態(tài)注解實現(xiàn)其中簽名這個場景最復雜后面我會專門用一整節(jié)來講。先記住一個最核心的判斷標準只要這個動作是“所有 Feign 請求都要做”的就落入RequestInterceptor的職責范圍。2. RequestInterceptor 的執(zhí)行時機為什么它在編碼器之前又為什么日志里看不到很多人第一次寫RequestInterceptor時都會有一個疑惑我明明加上了Component程序也能啟動但請求日志里看不到我設置的 header到底執(zhí)行了沒有要回答這個問題得先搞清楚 Feign 處理一次請求的完整鏈路。2.1 Feign 請求執(zhí)行的順序概括來說一次 Feign 調(diào)用的流程是通過 JDK 動態(tài)代理攔截你的接口調(diào)用MethodHandler 將方法參數(shù)解析成RequestTemplate對象依次執(zhí)行你配置的RequestInterceptor鏈對RequestTemplate進行改寫通過Encoder把方法參數(shù)編碼成請求體交給Client發(fā)起真正的 HTTP 請求通過Decoder解析響應。注意第 3 步和第 4 步的順序。RequestInterceptor是在編碼器之前執(zhí)行的也就是說攔截器拿到的是還沒有被編碼的RequestTemplate。此時如果你設置了template.body()你會發(fā)現(xiàn)它拿的是參數(shù)對象的原始字符串形式通常是 JSON 序列化之前的樣子而不是最終 HTTP 報文里的字節(jié)流。這個“先攔截、后編碼”的順序有個很實際的影響如果你想在攔截器里讀取請求體做簽名拿到的可能是LinkedHashMap序列化后的字符串而不是你最終發(fā)送的 body。我一開始在這里栽過跟頭后面講簽名時再重點展開。2.2 攔截器生效的兩種注冊方式RequestInterceptor有兩條注冊路徑很多人只知道第一種// 方式一使用默認的全局配置 Configuration public class FeignGlobalConfig { Bean public RequestInterceptor globalRequestInterceptor() { return new MyRequestInterceptor(); } }// 方式二細粒度指定給某個 FeignClient FeignClient(name order-service, configuration OrderFeignConfig.class) public interface OrderClient { // ... }方式一是全局生效所有通過 Feign 發(fā)出的請求都會走過這個攔截器方式二是局部生效只對指定的 client 生效。這里面有一個很多初學者容易踩的坑如果OrderFeignConfig類被放在了啟動類可以掃描到的包路徑下而且你又在類上加了Configuration那么這個局部配置其實會變成全局配置影響所有 Feign 客戶端。這不是玄學是 Spring 的組件掃描機制導致的。2.3 RequestTemplate 的核心操作 API攔截器的入?yún)⑹荝equestTemplate核心操作無非這幾種public class HeaderInterceptor implements RequestInterceptor { Override public void apply(RequestTemplate template) { // 添加請求頭 template.header(X-Api-Key, your-api-key); // 覆蓋請求頭如果不覆蓋重復調(diào)用會追加值 template.header(Authorization, Bearer token); // 獲取某個請求頭 CollectionString values template.headers().get(Content-Type); // 修改請求體注意body 在攔截器階段還是 String沒有經(jīng)過 Encoder 編碼 template.body({\name\:\test\}); // 修改請求路徑 template.uri(/v2 template.path()); // 獲取 query 參數(shù) MapString, CollectionString queries template.queries(); } }這里有個細節(jié)值得注意template.header()是追加語義。如果同名的 header 已經(jīng)存在再次調(diào)用會把新值追加到后面而不是替換。實際場景里下游服務如果只取第一個值可能會看不到你后來追加的。所以我習慣在設置關鍵 header 之前先template.removeHeader(X-Api-Key)或者確認原始請求不會帶這個 header。還有一個細節(jié)RequestTemplate暴露的 header 名稱在查詢時區(qū)分大小寫但 HTTP 協(xié)議本身不區(qū)分。如果你在排查時發(fā)現(xiàn)明明設置了 header 卻拿不到先檢查一下是不是大小寫不一致。3. 手寫統(tǒng)一請求頭攔截器從第一版到可上線的完整代碼這一節(jié)直接提供可抄作業(yè)的代碼。我先把一個通用的實現(xiàn)寫出來再逐步加上健壯性處理。3.1 第一版從配置文件讀取請求頭需求是給所有 Feign 請求加上X-Client-Id和X-Api-Key并且這兩個值在不同環(huán)境本地、聯(lián)調(diào)、預發(fā)不一樣所以不能寫死在代碼里。Component public class ClientInfoInterceptor implements RequestInterceptor { private static final Logger log LoggerFactory.getLogger(ClientInfoInterceptor.class); private final ClientInfoProperties properties; public ClientInfoInterceptor(ClientInfoProperties properties) { this.properties properties; } Override public void apply(RequestTemplate template) { template.header(X-Client-Id, properties.getClientId()); template.header(X-Api-Key, properties.getApiKey()); // 可選加上環(huán)境標識方便下游區(qū)分布 template.header(X-Env, properties.getEnv()); log.debug(Feign request intercepted, uri: {}, template.url()); } }對應的配置類ConfigurationProperties(prefix openapi.client) public class ClientInfoProperties { private String clientId; private String apiKey; private String env dev; // getter / setter 省略 }然后在application.yml里配置openapi: client: client-id: client-001 api-key: sk-abc123 env: local這一版能解決 80% 的靜態(tài)請求頭需求。但如果你只是需要透傳用戶身份 Token還需要繼續(xù)看下一節(jié)。3.2 第二版從當前線程上下文透傳 Token常見的業(yè)務場景是用戶 A 發(fā)起請求到你的 Spring MVC 接口這個接口內(nèi)部又通過 Feign 調(diào)用了下游服務。下游服務同樣需要校驗用戶身份所以要把用戶的Authorizationheader 原樣透傳過去。這時候攔截器里要讀取當前的ServletRequest獲取 header再設置到RequestTemplate上Component public class TokenPropagationInterceptor implements RequestInterceptor { Override public void apply(RequestTemplate template) { // 1. 從 Spring 的線程上下文中拿當前請求 RequestAttributes requestAttributes RequestContextHolder.getRequestAttributes(); if (requestAttributes instanceof ServletRequestAttributes) { HttpServletRequest request ((ServletRequestAttributes) requestAttributes).getRequest(); String authz request.getHeader(Authorization); if (StringUtils.hasText(authz)) { template.header(Authorization, authz); return; } } // 2. 拿不到就使用兜底 Token一般來自服務間調(diào)用憑證 String fallback environment.getProperty(openapi.client.service-token, ); if (StringUtils.hasText(fallback)) { template.header(Authorization, Bearer fallback); } } }這個實現(xiàn)里有個容易掉進去的坑異步線程丟上下文。如果你在業(yè)務代碼里用了Async或自定義線程池RequestContextHolder里是拿不到當前請求的因為 Spring 默認的ThreadLocal不會跨線程傳遞。遇到這種情況要么在進入異步之前手動把 Token 存入ThreadLocal并在攔截器里讀取要么使用HystrixRequestVariableDefault這類方案。我現(xiàn)在項目的做法是封裝了一個UserContextHolder在請求入口處解析用戶信息存入自定義上下文異步任務里也能拿到。3.3 加上開關控制聯(lián)調(diào)/生產(chǎn)一鍵切換另一個實踐中的剛需是攔截器要能開關。比如你在聯(lián)調(diào)時下游并不驗證簽名但一上生產(chǎn)就要驗。如果把邏輯做成硬編碼每次切換環(huán)境都要改代碼。我的做法是給攔截器加一個配置開關openapi: client: sign-enabled: trueComponent public class SigningInterceptor implements RequestInterceptor { private final ClientInfoProperties properties; Override public void apply(RequestTemplate template) { if (!properties.isSignEnabled()) { return; } // 簽名邏輯... } }同時在配置中心可以動態(tài)調(diào)整非常方便。4. 簽名場景的完整鏈路時間戳、防重放與參數(shù)排序簽名是最能體現(xiàn)RequestInterceptor價值的場景。我把它單獨拆開講因為這里面坑最深也最容易出錯。4.1 簽名流程總覽一個相對規(guī)范的開放平臺簽名方案通常包含這幾部分客戶端生成timestamp毫秒級時間戳客戶端生成nonce隨機字符串防重放將請求路徑、查詢參數(shù)、請求體等按約定規(guī)則拼接成待簽名字符串使用約定的密鑰通常是appSecret或私鑰對字符串做HMAC-SHA256或MD5簽名將timestamp、nonce、sign放入請求頭傳給服務端服務端校驗時間戳是否過期、nonce 是否第一次使用、簽名是否一致。下面這個簽名攔截器是綜合了以上要點的完整實現(xiàn)Component public class SigningInterceptor implements RequestInterceptor { private static final Logger log LoggerFactory.getLogger(SigningInterceptor.class); private final ClientInfoProperties properties; public SigningInterceptor(ClientInfoProperties properties) { this.properties properties; } Override public void apply(RequestTemplate template) { if (!properties.isSignEnabled()) { return; } String timestamp String.valueOf(System.currentTimeMillis()); String nonce UUID.randomUUID().toString().replace(-, ); // 1. 拼接待簽名內(nèi)容 String content buildSignContent(template); // 2. 計算簽名 String sign sign(timestamp, nonce, content); // 3. 放入請求頭 template.header(X-Timestamp, timestamp); template.header(X-Nonce, nonce); template.header(X-Sign, sign); template.header(X-Api-Key, properties.getApiKey()); } private String buildSignContent(RequestTemplate template) { StringBuilder sb new StringBuilder(); // 請求路徑 sb.append(template.method()).append(\n); sb.append(template.path()).append(\n); // 查詢參數(shù)排序拼接核心難點1 MapString, CollectionString queries template.queries(); if (queries ! null !queries.isEmpty()) { ListString queryParts new ArrayList(); for (Map.EntryString, CollectionString entry : queries.entrySet()) { for (String value : entry.getValue()) { queryParts.add(entry.getKey() value); } } Collections.sort(queryParts); sb.append(String.join(, queryParts)).append(\n); } // 請求體核心難點2編碼時機問題 String body template.body() null ? : new String(template.body(), StandardCharsets.UTF_8); sb.append(body); return sb.toString(); } private String sign(String timestamp, String nonce, String content) { String raw properties.getApiKey() \n timestamp \n nonce \n content \n properties.getApiSecret(); return DigestUtils.sha256Hex(raw); } }4.2 參數(shù)排序為什么是核心難點很多簽名校驗失敗問題多半出在參數(shù)順序不一致。服務端在驗簽時對查詢參數(shù)的常見處理是先按 key 字典序排序再用keyvalue形式拼接多個參數(shù)用連接。而RequestTemplate.queries()返回的是MapString, CollectionStringkey 的順序不保證是字典序。如果不排序同一個請求在客戶端簽名的順序和服務端驗簽的順序就可能不同導致簽名對不上。我建議在拼接前強制排序一次ListString queryParts new ArrayList(); // ... 拼出 keyvalue 形式 Collections.sort(queryParts);對于參數(shù)值里有中文、特殊字符的情況還涉及 URL 編碼。通常簽名用的字符串是原始值未編碼還是編碼后的值取決于接口文檔。這個必須提前和服務端對齊否則兩邊各做各的簽名永遠對不上。4.3 body 簽名的編碼時機問題前面提到攔截器的執(zhí)行時機在編碼器之前所以在攔截器里template.body()拿到的是未經(jīng) Encoder 處理的內(nèi)容。如果Encoder用的是默認的SpringEncoder它接收的是RequestBody注解的對象通常會被MappingJackson2HttpMessageConverter序列化成 JSON。這里有個非常隱蔽的問題簽名時你拿到的字符串和傳輸時真正序列化后的字符串可能不一致。例如對象中的LocalDateTime在序列化前和序列化后的格式不同字段為null時可能被JsonInclude注解過濾掉。如果你簽名用的是序列化前的原始 JSON而服務端驗簽用的卻是收到報文里的 JSON兩邊自然對不上。針對這個問題的常見解法有兩種方案一在調(diào)用 Feign 之前先把請求體序列化成字符串再傳給 Feign 方法這樣攔截器里拿到 body 就是最終字符串。String json objectMapper.writeValueAsString(orderRequest); orderClient.createOrder(json);PostMapping(/order/create) Order createOrder(RequestBody String body);這種做法的缺點是簽名語義和業(yè)務方法簽名綁定得比較緊但能保證簽名內(nèi)容與傳輸內(nèi)容完全一致。方案二注冊自定義 Encoder在 Encoder 階段統(tǒng)一序列化并在序列化過程中做簽名。這種方式鏈路更完整但實現(xiàn)復雜度高適合在真正需要精細控制的場景下使用。我現(xiàn)在項目里用的是方案一操作簡單、定位問題也快。4.4 防重放timestamp nonce 的雙保險簽名只解決了“內(nèi)容有沒有被篡改”的問題但沒有解決“同一個請求被原樣重放”的問題。如果黑客截獲了一個有效請求過幾分鐘再原樣發(fā)一次服務端驗簽依然通過。所以必須加上時間戳和 nonce 雙保險timestamp服務端校驗客戶端時間與服務器時間差在允許范圍內(nèi)通常 5 分鐘。超出范圍的直接拒絕。nonce隨機字符串服務端需要記錄一段時間內(nèi)使用過的 nonce。如果同一個 nonce 再次出現(xiàn)說明是重放請求直接拒絕。nonce 的存儲服務端可以放在 Redis 里設置與時間戳窗口相同的過期時間。這里要注意并發(fā)場景如果同一毫秒內(nèi)兩個請求生成了相同 nonce概率極低但存在。因此生成 nonce 時建議加上隨機數(shù)或線程安全手段String nonce Long.toHexString(System.nanoTime()) UUID.randomUUID().toString().replace(-, );4.5 服務端驗簽的簡易實現(xiàn)思路雖然標題講的是客戶端攔截器但服務端驗簽邏輯決定了客戶端怎么簽名。我貼一個簡單的 Controller 攔截器來模擬服務端驗簽流程方便你本地驗證Component public class VerifySignInterceptor extends HandlerInterceptorAdapter { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String timestamp request.getHeader(X-Timestamp); String nonce request.getHeader(X-Nonce); String sign request.getHeader(X-Sign); if (!StringUtils.hasText(timestamp) || !StringUtils.hasText(nonce) || !StringUtils.hasText(sign)) { response.setStatus(401); return false; } // 1. 校驗時間戳 long ts Long.parseLong(timestamp); if (Math.abs(System.currentTimeMillis() - ts) 5 * 60 * 1000) { response.setStatus(401); return false; } // 2. 校驗 nonce 是否使用過此處應查 Redis if (nonceUsed(nonce)) { response.setStatus(401); return false; } // 3. 校驗簽名偽代碼真實場景需要讀取 body String content request.getRequestURI() \n readQuerySorted(request); String expectSign DigestUtils.sha256Hex(canonicalize(content)); if (!MessageDigest.isEqual(expectSign.getBytes(StandardCharsets.UTF_8), sign.getBytes(StandardCharsets.UTF_8))) { response.setStatus(401); return false; } return true; } }看到?jīng)]服務端驗簽和客戶端簽名是一體兩面的設計??蛻舳嗽趺雌醋址斩司捅仨氃趺雌醋址畠蛇叺腸anonicalize函數(shù)必須完全一致這是簽名聯(lián)調(diào)中最容易出問題的地方。5. 自帶攔截器的“繼承陷阱”子類庫重寫 Feign 配置時為何突然失聯(lián)這一節(jié)是我自己項目的血淚經(jīng)驗。我們有一個基礎 SDK 模塊里面定義了一個公共的 Feign 配置類并注冊了一個簽名攔截器。業(yè)務模塊引入這個 SDK 后只需要寫接口和調(diào)用即可。// 基礎 SDK 里的公共配置 Configuration public class BaseFeignConfig { Bean public RequestInterceptor signInterceptor() { return new SigningInterceptor(); } }某一天新業(yè)務方接入了 SDK但他們自己定義了 Feign 客戶端時指定了一個CustomFeignConfigFeignClient(name order-service, configuration OrderFeignConfig.class) public interface OrderClient { }結(jié)果上線后聯(lián)調(diào)一直報 401簽名校驗失敗。排查了很久最后發(fā)現(xiàn)OrderFeignConfig里沒有繼承BaseFeignConfig而是自己定義了一套配置Configuration public class OrderFeignConfig { // 只配置了自定義的 decode/encoder忘了把父類的簽名攔截器帶進來 }在這個配置類生效的 Feign 客戶端上BaseFeignConfig的全局攔截器沒有生效因為 Feign 對每個 client 都會獨立構(gòu)建一套攔截器鏈局部配置可以覆蓋或替換全局配置。5.1 Feign 攔截器集合的構(gòu)建規(guī)則深入了解后我發(fā)現(xiàn)FeignClientsRegistrar在注冊每個 FeignClient 時會讀取你指定的configuration類并把這些類中的 Bean 注冊到對應 client 的 Spring 子容器中。這個子容器和全局容器是隔離的RequestInterceptor的集合也基于這個子容器構(gòu)建。所以如果局部配置類里自己也定義了一個RequestInterceptor這個攔截器會替換全局的攔截器而不是疊加。這一點很容易被忽略因為項目能正常啟動看起來沒有任何報錯。5.2 排查過程從現(xiàn)象到根因當時我們的排查鏈路是這樣的先看下游服務端日志發(fā)現(xiàn)收到的請求頭里沒有X-Sign確認攔截器確實沒有執(zhí)行在SigningInterceptor.apply()里加斷點發(fā)現(xiàn)根本沒走到檢查是否注冊了多個RequestInterceptor用ApplicationContext.getBeansOfType(RequestInterceptor.class)查看只有全局的攔截器一個但業(yè)務模塊的 FeignClient 用的并不是這個最后檢查OrderFeignConfig發(fā)現(xiàn)問題出在局部配置覆蓋了全局配置且沒有把簽名攔截器重新注冊進去。修正方式很簡單讓業(yè)務方的OrderFeignConfig繼承 SDK 的BaseFeignConfigConfiguration public class OrderFeignConfig extends BaseFeignConfig { // 業(yè)務方自己的配置簽名攔截器自動繼承 }或者更穩(wěn)妥的做法在業(yè)務模塊中不要重復定義RequestInterceptor而是通過Import(BaseFeignConfig.class)把公開配置引入。5.3 設計層面的三點建議經(jīng)歷這次踩坑后我在設計 SDK 時總結(jié)了三條原則不要在基礎配置類里寫業(yè)務相關的攔截器必要時拆成多個配置類按場景分別引入如果確定攔截器必須全局生效把它注冊成基礎配置中的一個 Bean并且讓所有局部配置類繼承基礎配置在 FeignClient 的自定義配置類上盡量不再定義RequestInterceptor類型的 Bean如果一定要就要清楚它是在替換全局攔截器而非追加。6. 調(diào)試與驗證從日志全開到一個完整的測試用例寫完了攔截器關鍵是怎么驗證它真的按照預期工作。如果只是“感覺沒問題”一旦聯(lián)調(diào)簽不上排查起來極其痛苦。6.1 打開 Feign 的日志Feign 自帶的 Logger 可以輸出請求頭、請求體等關鍵調(diào)試信息。步驟是在配置類里指定日志級別Configuration public class FeignLogConfig { Bean Logger.Level feignLoggerLevel() { return Logger.Level.FULL; // NONE、BASIC、HEADERS、FULL } }在application.yml里開啟對應包的日志輸出logging: level: com.example.openapi.client: debug然后把Logger.Level設為FULL就可以在日志中看到[OrderClient#createOrder] --- POST http://order-service/order/create HTTP/1.1 [OrderClient#createOrder] X-Timestamp: 1735023600123 [OrderClient#createOrder] X-Nonce: 6f2a5c4d8e1b4f2a [OrderClient#createOrder] X-Sign: 3b4c5d6e7f8a9b0c... [OrderClient#createOrder] Content-Type: application/json [OrderClient#createOrder] --- END HTTP (56-byte body)日志級別對照表級別輸出內(nèi)容NONE不輸出任何日志BASIC請求方法、URL、響應狀態(tài)碼、耗時HEADERSBASIC 請求和響應頭FULLHEADERS 請求和響應體如果開了 DEBUG 日志但沒看到任何輸出先檢查是不是logging.level寫的包名不對。Feign 日志的 Logger name 是FeignClient 接口的完整類名必須對應到實際接口的包名。6.2 單測不啟動服務端直接驗證攔截器最方便的驗證方式其實是寫一個單元測試直接構(gòu)造RequestTemplate然后調(diào)用攔截器的apply方法。這樣不用啟動 Spring 容器也不依賴下游服務。public class SigningInterceptorTest { Test public void testApply() { // 構(gòu)造一個請求模板 RequestTemplate template new RequestTemplate(); template.method(HttpMethod.POST); template.uri(/order/create); template.query(orderId, 10086); template.body({\name\:\張三\}); // 初始化攔截器 ClientInfoProperties properties new ClientInfoProperties(); properties.setApiKey(client-001); properties.setApiSecret(secret); properties.setSignEnabled(true); SigningInterceptor interceptor new SigningInterceptor(properties); // 執(zhí)行攔截邏輯 interceptor.apply(template); // 斷言 assertNotNull(template.headers().get(X-Timestamp)); assertNotNull(template.headers().get(X-Nonce)); assertNotNull(template.headers().get(X-Sign)); // 打印簽名結(jié)果以便和服務端算法對照 System.out.println(X-Timestamp: template.headers().get(X-Timestamp).iterator().next()); System.out.println(X-Sign: template.headers().get(X-Sign).iterator().next()); } }這種方法的好處是本地調(diào)試極其快速還能在 CI 中跑回歸。凡是涉及簽名規(guī)則調(diào)整我都會先跑一遍單測確認簽名串和服務端一致再去做接口聯(lián)調(diào)。6.3 跨庫請求體的特殊處理Content-Type 為 form 表單最后提一個我在實際項目中遇到的坑。如果 Feign 方法接收的是RequestBody MapString, Object攔截器里template.body()拿到的字符串是 JSON 格式。但如果某個接口的 Content-Type 是application/x-www-form-urlencodedbody 就是keyvaluekey2value2格式。這時候簽名字符串的拼接規(guī)則就完全不同了。針對不同 Content-Type我建議在攔截器里做分支String contentType template.headers().getOrDefault(Content-Type, List.of(application/json)).iterator().next(); if (contentType.contains(application/x-www-form-urlencoded)) { // 表單格式直接拼原始 urlencoded 字符串 } else { // JSON 格式直接拼 JSON 字符串 }表單參數(shù)在RequestTemplate中的body()拿到的可能是類字段的形式未必是最終的 urlencoded 結(jié)果這一點要特別小心。最穩(wěn)妥的方式是在調(diào)用 Feign 之前就用UriComponentsBuilder等工具手動構(gòu)造好表單字符串這樣簽名和傳輸完全一致。最后分享一個小技巧調(diào)試簽名類攔截器我強烈建議在本地啟動一個僅用于打印請求信息的最小 Mock 服務。方法很簡單寫一個 Spring Boot 接口把所有 header 和 body 打出來然后讓 Feign 指向它。這樣你能在幾分鐘內(nèi)看出攔截器到底設置哪些 header、body 是什么、簽名原文長什么樣。另外如果你的項目同時依賴了多個 Feign 庫以及重試組件要特別小心RequestInterceptor的執(zhí)行次數(shù)。遇到重試時攔截器會隨每次重試重新執(zhí)行所以簽名中的時間戳在重試時也會更新。服務端如果做了嚴格的時間窗口校驗重試太頻繁可能觸發(fā)時間戳超過允許范圍。我在項目中就是把這個時間窗口放寬到 1 分鐘同時把 nonce 的 Redis 過期時間設為 5 分鐘既防重放又不誤傷正常重試。這套RequestInterceptor的方案我已經(jīng)在多個項目中穩(wěn)定運行核心思路就是統(tǒng)一收口、動態(tài)計算、可配置開關、測試兜底。照著這個思路做你的 Feign 客戶端在接入第三方接口時會省掉很多重復勞動簽名這類復雜邏輯也能在一個文件里維護清楚。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
99热精品在线在线| 97超碰中文字幕| 精品十三区| 偷拍色图| 久久久四区| av一区二区三区不卡| 天堂射| 老师充足的奶水小说| 新怡红院| 亚洲乱色视频一区、二区在线| 欧美精品久久久久久久久88| 丁香六月婷婷久久综合| 久久综合久色欧美综合狠狠 | 五月婷婷六月色| 少妇国产不卡| 后入日本1234| 黄色不卡视频| 91天天综合日韩欧美| 久久久久久久久久久免费精品| 国产激情在线| 神马久久久久久久久久| 日婷婷| 多乙久久久久久| 久久香蕉国产传媒一区剧情天美| 青青久日| 久久久久久久久久久999| 五月天大香蕉| 97久久视频| 97精品中文字幕| av天堂5| 一区二区三区成人高清视频| 伊人网av| 欧美精品不卡一二三四在线91| 亚洲色图欧美色图另类图片| 男人天堂久久精品| nuu12国产麻豆精品| 亚洲啪啪视频免费| 国产女人高潮视频| 亚洲综合嫩| 2018天天干在线视频| 91亚州日韩高清| 九九九久| 强奸乱伦动态污图免费 | AV一起草在线| 久久久精品国产亚洲伊人| 九九热只有精品| 婷婷去俺也去六月色| 91蜜臀熟女| 91操熟女视频| 天天干天天狼在线视频| 91日产欧美| 欧美色图片| 丁香五月婷婷基地| 啊v在线观看视频| 欧美亚洲中文字幕| 91男同| 囯戸精品高潮呻吟旡码| 欧美老熟另类| 大肥女高潮bbwbbwhd视频| 97色干| 正宗无毛一线天嫩逼| 成年女人黄网站| surenchaopeng| 人妻二区| 久久伊人青青草| 亚洲日韩视频二区| 亚洲国成人情色好看电影| 曰韩人妻中文字幕在线| 99热色这里只有精品| 91熟女网| 天天插天天插| 成人线上超碰| 中文字幕在线观看AV| 日日夜夜精品视频| 人人色人人射人人妻| 91五十路| 夜夜高潮夜夜爽| 新亚洲无码| 97舔舔| 乱伦一二三| 天美一二三在线观看Av| 国产精品女生av| 欧美精品偷拍| 人人操人人叉人人插人人| 亚洲欧美综合网站| 激情小说五月天| 亚洲 欧美 第一页| 91N五十路| 18啪啪手机免费性爱| 一区二区视频你懂的| 亚洲无码?第一页| 久久久成人免费av电影| 五月婷婷六月丁香| 国产乱伦视频污| 国产极品久久久| 国语国产操逼伊人AV网| 免费视频一二三区| 狠狠图片青青草| www.99中文字幕| 国产视频小说| 色五月综合| av黄图片在线观看| 亚洲男人的天堂在线看| 久久艹逼视频| 欧美A片中文字幕| 欧美日韩亚洲五月天婷婷| 综合久久六月久久婷婷| 欧美加勒比| 人妻一区久久二区三区色播| 操逼逼福利视频| 蜜臀99精品国产高清在线观看| 99久久无色码| 双插性欧美一二三区| 日日嗷| 丁香五月影院| 日欧操屄| 亚洲做性| 蜜臀精品1区2区| 大香网站| 日韩电影在线观看网址| AV色五月天| 嗯嗯啊啊视频在线看| 综合国产影视三级| 久久久啊啊啊| 伊人991| 亚洲欧洲另类| 欧美另类精品xxxx| 欧美精品成人一区二区在线观看| 国产麻豆一区二三区| 丁香激情五月| 日韩免费看黄片| 久久国产乱子伦精品免费女,网站| 在线观看A啊啊啊| 久久这里只精品99re66图| 91色图| 亚洲综合 欧美| 夜夜騷av、一區二區| 亚洲一本大道中文字幕无码在线| 女性喷水高潮在线观看| 超碰9 7女人| 欧美九九99久久精品| 熟女六十路| 国产在线综合福利网站| 正宗无毛一线天嫩逼| 久久99操天天日| 亚洲图片欧美91N| 欧美性视频二区三区| 久久直播国产| 精品亚洲天堂| 9久久美女首页| 久久九九国产精品| 怡红院成人视频| 日韩一999精品| 超碰在线人妻中文字幕| 很很很很操| 91丨九色丨43老版熟女| 免费久久一级毛片大黄| 羞答答AV中文字| 狠狠 91| 狠狠色噜噜狠狠狠狠2018| 欧美97视频| 操美女高潮抽搐白浆| 1240青青草一区二区三区视频天爱| 国产suv精品一区二区四区999| 欧美激情视频在线一区| 综合久久2017| 青青草国产一区二区三区| 亚洲综合色网| 国产69精品久久久久99尤物| 绯色一区二区三区不卡少妇 | 啊啊啊好大好深| 老熟女熟妇| 丁香婷婷啪啪| 99超级碰免费视频| 国产一区二区三区白丝| 亚州熟女乱伦| 97超碰色情| 2017大香蕉国产精品久久| 日本三级日本三级99| 国产又色又粗又黄又爽| 校园春色五月天| 777AV电影| 中文字幕乱码在线观看| 国产一线二线三线av| 欧美页片| 99亚洲人人| 国产伦精品免编号公布| 97精品综合久久| 啪啪啪精品视频| 成人自拍三级在线观看| 色牛aV| 人妻铁牛TV| 欧洲自拍第一页| 亚州九九九精品视频| 欧美操逼视频二区| 小骚逼被操的爽不爽| 国产精品天美传媒| 国产伦精品免编号公布| 国产按摩一区二区三区| 丁香五月av| 久久国内| 日本色色网| 五月天婷婷久久| 粉嫩av在线一区二区| 自怕偷自怕亚洲精品| 日韩无码视频黄色| 波多野结衣一级视频| 国产福利合集| 久久永久无码人妻视频| 亚洲最新Av| 久久国产AⅤ| 中文乱码字字幕在线第5页| 亚洲欧美另类小说| 国产熟女精品一区二区| 亚洲精品一区二区精华| 东北老女人的激情视频| 秋霞午夜视频一区二区| 加勒比综合a∨| 91强在线播放| 好一吊区二区| 无人区高清电影免费观看一区二区三 www.qmcai2.com | 亚洲成人日韩小说| 丁香五月天激情网站| 女人喷水视频在线观看| 性色av婷婷久久一区二区点复制| 国产综合操逼高清| 欧美乱色| 美女淫穴| 色噜噜人妻av中文字幕| 九九九精品美女| 中出欧美| 黄片色区软件| 久久五月天婷婷| 大香蕉免费中文| 美女露胸露奶头| 香港日本韩国人妇99www.wccm20| 97免费视频在线观看视频| 天美传媒精品久久视频| 美女裸体无遮挡永久免费观看网站| 超碰在线欧美性爱激情| 激情久久久| 久草成人福利导航| 日本超碰色精品| 野狼福利社区| 日本不卡高清视频| 色久综合| 成人天天爽| 91精品网站| 国产成人 综合亚洲 天堂| 日本肏逼视频在线观看| 国产性刺激| 欧美天天在线| 97资源视频| 亚洲AV永久无码一区仙野| 亚洲 中文 女同| 91无码人妻| 亚洲激情视频| 激情五月综合网| 啊啊啊在线观看免费视频| 四季av一区二区凹凸精品小说| 五月亭亭六月丁香| 亚洲av无码成人精品国产| 日韩一区二区熟女| 天天天肏屄肏屄肏屄欧美欧美| 超碰日韩人妻| 91人妻视频在线| 97操碰| www.yeyecao| 天天操夜夜操| 婷婷性网| 亚洲天堂男人在线| 久久这里只精品| 久久精品高清AV| 97精品国产97久久久久久免费| 超碰视97中文| 国产综合网站在线播放| 麻豆AV96熟妇人妻| 精品人妻av区天天看片| 婷婷亚洲综合| 蜜臀99久久国产| 国产精品久久久无码AV网站| 久久蜜色情在线视频xxx免费观看| 97色香蕉| 思思99热| 91精品无码久久久久久久| 丁香六月综合激情| 97久操| 久久久久久日韩| 国产日韩人人| 综合国产影视三级| 色综合99999| 最新无码国产| 大香蕉综合| 啊啊啊免费| 婷婷色色网| 亚州高清av| 日韩色欲久久一二三四区| 91艹逼精品| 91社区伊人| 又大又白奶子| 中文字幕一二三| 婷婷丁香五月激情啪啪| 亚洲色交| 爆乳免费黄网站| 久9无限国产| 亚洲男人天堂2019| 91色伦| 久久精品国产亚洲AV无码电影| 欧亚第一综合网| 久久av无码| 少妇500双飞99| 神马久久午夜| AV天天在线观看| 啊啊啊啊操死我| 精品国产乱码久久久久久久久1| 国产农村妇女毛片精品久久| caopeng97| 国产激情视频一区区三区| 久操大香蕉手机视频在线看| 国产高清自拍| 久久精品日韩专区免费观看| 青娱乐日韩无码| 香蕉精品二区二区| 亚洲精品久久久久久久久豆丁网| 激情五月丁香五月| 91无码精品| 99自拍视频在线观看| 成人97人人超碰人人| 天天影视色香色欲| 青青操青娱乐| 91亚洲欧洲| 九九九综合精品| 看免费一级在线播放毛片| 亚洲色欲一区二区三区| 亚洲制服欧美另类内射| 酒色综合网| yiren97| 欧美十八禁导航成人| 国产人妻精品一区二区三区秋霞| 天美AV片| 黄色网址在线免费观看| 99re99在线视频| 亚洲宅男天堂| 国产AV色黄看到爽| 国产精品福利视频| 二级毛片| 久久久久久大| 婷婷久久综合| 大香蕉免费乱伦视频| 91亚洲欧美激情| 99青青草国产视频| 蜜臀少妇一区二区| 一本一道波多野毛片中文在线| 青青草原香蕉日本Ap| 国语人妻精彩刺激| 国产综合网站在线播放 | 欧成人精品一区二区三区| 欧亚乱色熟一区二区三四区| 久久久97| 国产亚洲日韩在线三区黑人| 一级性爱视频免费观看 | 色香蕉影院| 九九内射在线| 天天综合青苹果| 欧美亚洲天天| 操曰本熟女| 亚洲丝袜天堂| 日日夜夜干| 精品人妻av在线播放| 国产精品96久久久久久| 无码男人天堂| 91九九九逼| 亚洲一区二区麻豆影院| 麻豆啪啪啪视频| 欧美一级特黄淫片在线观看| 囯戸精品高潮呻吟旡码| a'v在线资源| 外国免费性情大片| 激情情色五月天| 日韩精品国产一区二区| 国产精品点击进入在线影院高清 | 婷婷久久久精品| 婷婷另类小说| 91九九九逼| 国产精品熟女AV中文字幕在线播放| 一级免费啪啪片| 人人干人人操人人..com| 99久久久无码精品国产人| 久久春色| 女人久久久| 欧美色院| 国产精品99精品视频网站| 九九九精品| 射久久| 久久 精品| 欧美色宗合| 精品人妻一区二区三区四区不卡在| 日本二三四区| 蜜臀AV午夜精品久| 亚洲天堂一区| 91高清无码下载| 国产一区二区精品久久99| 亚洲国产一区二区入口| 国产精品激情久久久久久久| 亚洲国产一区二区三区四区国产| 亚洲免费看片| 欧美色图天堂网m| 都市激情人妻一区二区青青操视频| 性爱欧美五月| 国产精品3| 9美女超碰在线免费观看| a在线观看| 91精品久久久久久综合五月天| 91狠狠色丁香婷婷综合久久精品| 欧美少妇熟女| 精品人妻一区春色| 久啪视频| 色吧5亚洲| 精品午夜福利国产一区二区在线观看| 一级做a爰片久久毛片图片| 国产AV激情无码久久无码| 嫩草影院在线观看精品| 色情五月婷婷| 啊啊啊啊啊啊啊好爽不要| AV在线播放网址| 色悠悠伊人网五月天| 亚洲97| 久久男人精品| 97九色人妻| 欧美97日韩精品| 欧美丝袜91| 黑人免费福利视频| 亚洲码专区| 狠狠躁AV| 国产风韵犹存熟妇三区| 综合网天天| 国产又粗又大硬免费色网视频| 日韩性爱毛片操骚逼| 91丨九色丨大屁股| 97这里只精品| 欧美伊人电影| 午夜超爽| 婷婷国产精品九区| 中文字幕人乱码中文字的预防方法| 国产热av| 亚洲图片色图欧美另类| 五月天激情小说网| 久久久神马影院| 一本色道综合久久欧美| 日韩黄色成人性爱| av东京热男人的天堂| 特色a在线上| 天天操天天舔| 老司机午夜福利视频一区二区| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区 | 老女人老91妇女老热女| 久综合国内精品自在自线| 性感女人网页在线观看视频| 精品少妇一区二区| 欧美人妻久久精品二区三区| 色 亚洲 91| 啊啊啊在线观看| 精品少妇一区二区三区在线视频 | 成人亚欧免费视频| 超碰97资源大奶| 熟女熟妇一区二区三四区| 91操人| 国产少妇高潮| 激情小说日韩无码| 亚洲国产综合久久久性感熟妇| 东北女人性交| 亚洲综合在线视频| 97人人夜| 欧美网站免费| 久久久极品| 国产九九九九九九九九| 亚洲s色图| 伊人操| 奸色色 男人天堂 天天射| 欧美亚洲清纯| 久久九色| 亚洲国产亚洲天堂| 强奸国产在线| 精品夜夜澡人妻无码| 99re9在线| 天天看片青娱乐| 亚洲av无码成人精品国产| 亚洲精品国产熟女久久久| 操逼视频亚洲| 老司机福利社视频在线观看| 大香蕉九九| 日本国产二线女色| 亚洲色图大香| 啊啊啊啊啊啊在线观看| 伊人五月天青青草婷婷| 国产亚洲精品一区二区三区| 日韩钢筋无码高清啾啾啾| 波多野结衣AV无码一区| 久操在97| 成人麻豆av电影网站| 精人妻无码一区二区三区伊人直播| 琪琪精品免费一区二区三区| 综合性视频99| 日日夜夜天天| 男女性感激情网站| 日本ZZ高免费A级视频| 操久久久久久| 人人看人人插| 性欧美第一页| 色妺妺在线视频| A级国产欧美激情在线| a片亚洲一本通视频| 国产 v乱码一区二| 999综合网| 免费网色网站| 天天日B狠狠操| 蜜乳AV.COM| 综合网97| 热久久这里只有精品| 波多野结衣被操50分钟免费视频| 久久久少妇诱惑精品视频| 中文字幕啊啊啊在线观看视频| 国产久久成人| 国产路线专区| 十八禁电影伊人网| 91肏屄网| 久久综合五月天| 91人妻精华帖| 久久狠狠色噜噜狠狠狠狠97| 9ⅰ久久久天天| 97免费在线视频在线观看| 91人妻做a观看视频| 九九九九精品视频| 热久久无毒不卡| 欧美一区二区情色| 中文字幕一区日韩精| 97无码视频在线播放| 97这里有精品| 伊人96在线| 诱惑人妻欧美一区在线播放| 亚洲无码99| 很很热性爱视频| 欧美五十路熟| 啪啪视频免费在线观看| 天啪| 欧美,日韩,中文,另类| 绑缚麻绳人妻寝取完整版| 国产九月婷婷| 日本三级久| 动漫爆乳3D奶水一区在线观看| 亚洲精品国语在线播放| 97视频免费在线观看| 久久精品国产99久久,亚洲日韩久久日本一区一区三区 | 亚洲欧美一区二区网址| 久久98| 国产亚洲欧美每日在线| 午夜男女爽爽大片免费观看| 91 丝袜在线播放| 97中文字幕一区| 欧美日韩国产人人| 欧美综合 站| 97色视频在线| 91骚妇| 亚洲欧洲无码97久久精品| 大稥蕉免费视频这里只有精品| 成年女人18级毛片毛片免费观看| 黄色小视频日本txt| 人妻81p| 欧美顶级黄色大片免费| 乱伦a片视频| 欧美亚洲中文| 久久久久久69国产一区二区| 日韩欧美大片免费高清啪啪| 男女日B国产| 亚洲图片色图欧美另类| 国产精品一区二区亚洲人成毛片| 99久久精品欧美国产| 爱妃国产亚洲视频中文字幕| 人人 操人人 操人人| 1级午夜影院费免区| 十八禁av无码免费网站APP| 91强热人妻| 九九性爱网| 丁香五月色| 偷拍欧美综合| 超碰在线97国产| 亚洲资源网| 日韩综合色网| 人妻精品视频一区二区| 亚州Av天美传媒| 亚洲男人天堂av| 骚熟女AV网| 天天日天天操心| 99热综合在线| 国产精品久久久久久久免牛肉蒲团 | 天天性射网| 毛片99-全集电影手机免费观看完整-B029AV | 久操操| 97天天搞在线| chaopen97久久| 97美日韩视频| 岛国在线免费视频| av天堂天堂av日韩| 精品夜夜澡人妻无码| 丁香婷婷激情五月天无毒不卡| 狠狠爱夜夜干| 香蕉欧美| 91精品伊人久久久大香线蕉91| 四色永久成人网站| 久热久| 男人的天堂Va| 亚欧视频在线| 裸体美女国产免费久久久网站| 天天影视激情欧美| 久久9免费视频| A级在线视频| www欧美性爱| 女一区二区| 人妻精品一区一区三区蜜桃91| 欧美熟妇精品黑人巨大91| 国产高清MV操逼视频| 奸色色 男人天堂 天天射| av东京热男人的天堂| 日韩无码一区二区三区| 国产白嫩漂亮KTV在线| 精品少妇后入一区二区三区四区人妻巨乳| 高清不卡一二三区视频......| 色香91| 国产成人亚洲精品无码最新在线| 日本人妻A片成人免费看片| 91精品国产综合久久久蜜臀| 四虎在线免费视频| 国产精品盗摄 偷窥盗摄| 啊啊啊不要好疼视频| 亚洲性综合| 国产JDAV无码视频在线观看| 天天操天天射天天日| 蜜乳AV色欲AVAV无码| 久久111| site:sinbotex.com| 国产99 中文字幕日韩小视频| 亚洲综合99999| 91久久青青草原精品| 制服乱伦| 婷婷10月天青娱乐| 精品一区二区亚洲国产| 啊啊啊啊啊啊啊在线| 欧美一级美片在线观看免费| 久久婷婷色综合一区二区三区| 日韩少妇在线视频| 精品国产无码中文| 九九热免费国产视频婷婷伊人五月 | 美國A片| 色男人色天堂东京热| 操操逼视频| 五月天综合网| 清纯唯美亚洲| 97亚洲一区| 国产偷人伦激情在线观看| 猛交交| 97在线免费视频观看| 天天摸,夜夜摸| 亚洲色宗合| 亚洲日韩一区电影| 亚洲精品一区二区日本| 国产农村妇女精品一| 丝袜 中出 制服 人妻 美腿 中文字幕| 日本中文字幕在线视频| 色眯眯av| 国产高潮AA片免费看| 欧美激情精品久久久久久| 色狠狠综合| 色妇综合网| 欧美国产视频| 大香蕉免费乱伦视频| 婷婷美人网| 欧美偷拍区| 在线一区| 日韩成人免费电影| 欧美在线亚洲| 夜夜爽妓女| 欧美国产精品久久九九| 久久久久久久国产| 国产精品一区二区三区,亚洲综合| 日韩特一级久久| 伊人91| 另类欧美综合| 欧美 亚洲 大香| 乱伦AVxx| 91亚州| 裸体美女久久久| 国产免费永久精品无码| 伊人久久综合影院精品久久久| 亚洲视频小说| 八戒无码国产午夜福利| 欧美丝袜亚洲| 超碰97在线 欧美 国产| 九九探花视频在线观看| 78操B| 黄呦呦在线| 国产亚洲99久久精品| 欧美偷拍区| 超碰吊日色| 欧亚不卡| 婷婷成人五月天| 欧美性爱无码一区二区三区| 熟妇人妻精品一区二区| 天天日美女的B| 欧美久久九九| 国产精品一区二区 尿失禁| 精品九九九九九九| 四虎在线免费视频| 中文字幕视频一区视频二区| 久久久青青草| 久久大陆| 狠狠操狠狠爱| 91天天看| 亚洲精品丝袜| 日韩美一区| 殴美大黄片| 乱子伦一区二区三区国产精品| 水澄无码AV| 天美国产三级传媒| 成人性生活高清视频在线播放| 综合熟女| 国产欧美一区激情交| 亚洲免费成人在线高清无码视频| 97超碰69| 五月婷婷色| 370p日韩欧美亚洲精品| 色吧91| 欧美日本不卡在线| 四虎影视永久在线观看精品免费网站| 区一在线观看| 天天综和| 亚洲另类色图片| 美腿色图| 久久久啊啊| 日韩三级一区| 99热免费| 激情婷婷五月天| www.色婷婷色综合| 色丁香五月婷婷| 天堂8在线新版官网| 亚洲第2页| 国产91啪| 日本不卡高清视频| a一区二区三区乱码在线| 十八禁av无码免费网站APP| 操逼逼一区视频| 啊啊啊啊操死我| 夜色综合| 2017av无码免费无线播| 黄色视频高清无码网站| 思思热一热婷婷热一热| 在线人成亚洲视频免费观看| 久久久久九九九九| 97爱综合| 日韩三级在线观看网站| 国产精品无码成人精品| 久久无码一区二区二三区性色| 国产中文字幕在线点播| 午夜福利av电影在线| A 天堂| 一区二区三区成人高清视频| 骚日日av| 欧美伊人电影| 超碰在线一区| 草草影院最新网址| 手机在线人成免费视频| 人人 操人人 操人人| 四虎影视永久在线免费| av天堂手机版追回| 一牛影视成人片免费| 日韩AV无码中文一区二区| 国产高清免费不卡av| 亚洲最大AV网| 一起草精品人妻| 青草av在线| 丰满人妻一区二区三区四| 黑丝少妇麻豆| 涩涩久久精品| 澳门色噜噜色噜噜色噜噜色噜噜色噜噜| 精精品人妻一区二区三区| 性综合网| 乱伦av麻豆| 欧美在线干| 婷婷伊人綜合中文字幕| av在线人气| 国产亚洲精品A在线观看下载| 26uuu国产亚洲综合| 免费啪啪一级视频| 校园春色综合| 天天操天天日天天干| 欧洲射精91| 99热91| 91天堂视频| 亚洲色图91| 欧美黄片视频在线观看免费| 欧美综合色站| 99色热国产视频精品| 人人妻人人爽 97人人看碰人免费公开视频| 亚洲码和欧洲精品激情系列| 精久久久| 少妇熟女1区2区3区| 国产av美女被艹的乱叫| 久久久久骚| 日韩精品怡红院| 久久久精品视频欧州站| 亚洲欧美首页| 怡红院一区二区熟女人妻| 九色 人妻 大香蕉| 综合性视频99| 中文字幕日韩精品久久| 亚洲国产高清福利视频| 中文字幕人妻色偷偷久久皮 | 久久性爱城| 日本999精品| 老鸭窝在线视频播放| 日日操免费视频| 天天流夜夜操| 美女上床网站| 天堂无码精品国产久| 屌逼传媒| 久久久久久无码人妻中文字幕| 国产v片在线免费观看| 五月丁香| 乱人乱色一区二区三区免费| 欧美黄色手机在线观看| 色蜜AV| 国产日韩怡红院| 亚洲一卡2卡3卡4卡乱码网站 | 亚洲伊人久久精品影院| 情趣丝袜无码操逼视频| 大香蕉宗合网在线| 欧美色网络| 人人操人人摸人人看人人干| 黄网站黄视频网站进入口| 亚洲国产中文字幕| 97在线精品观看视频| 在线观看AV不卡| 囯产精品久久久久久久久久二区三区| 中文字幕在线观看二区三区| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 日本天天吊| 国产97在线视频| 婷婷五月天影院| 一区二区三区国产在线播放| 99热只有这里有精品| 久草综合网| 久久香蕉影院| 中文字幕一区二区无码成人| 婷婷久久五月天| 国产9l 大屁股| 国产丝袜视频| 中英熟女操女| 亚州色图狠狠干| 久久久久久电影| 曰本精品久久久| 欧美性爱无码一区二区三区| 久久綜合很很很| AVE乱伦| 成人精品一区二区三区| 日本三级一区二区 在线| 精品二999| 爱av免费| 久久亚洲一区女同性恋中文字幕| 亚洲第一在线视频| 欧美中文综合| 99www.bibizy香蕉资源国产一区二区三区高清 | 91午夜无码| 国产精品3| 欧美自拍偷拍免费观看| 精品玖九九久| 后入 亚洲 美女 射| 中文字幕av亚洲精品| 国语人妻精彩刺激| 综合亚州欧美| 97 视频在线| 老司机射| 亚洲av资源| 搡老熟女免费视频| 色乱二区| 亚洲不卡不卡中文字幕不卡 | 精品欧美日韩在线观看| 人人操天天爽| 老司机福利社视频在线观看| 国产理论视频在线播放| 91黑丝操| 精品成人av一区二区三区在线| 色97综合中文字幕| 国产69精品久久久久99尤物| 国产sv美女内射| 亚洲官网在线| 无码抄逼网| 极品销魂美女一区二区| 天天操人人操骚逼网站| 亚洲va综合va国产va中文| 夜夜爽夜夜操| 69久久久久久久久久久久久| 五月天社区| 色欲av一区二区三区蜜芽| 四虎884| 五月婷婷综合网| 黄色小视频日本txt| 色姑娘综合网| 欧美极品少妇| 亚洲另类色图片| 日韩卡一卡二卡三在线| 婷婷九月丁香| 少妇人妻精品| 日本一区二区电影网站| 国内精品久久久久影院亚洲| 99e久久国产精品| 东京太热男人的天堂久久久| 久久久久ab| 91色女| 六十路日本| 国产精品久久久久无码A√| 中文字幕在线免费观看 | 69久久| 日本一久是| 婷婷五月天成人网| 国产午夜无码片在线观看影视| 亚洲欧美999| 国产精品农村妇女| 黑人干亚洲| 啊啊啊啊啊啊好湿好爽视频| 91oumei| 五月大香蕉| 日本一级性爱| 韩国一级AAA| 国产久久成人| 精品无码一区二区三区色欲| 92一区二区| 夜夜高潮夜夜爽夜夜爱爱一区| 国产精品视频播放| 老熟女熟妇| 精品.99999| 日本一区三级韩国| 理论久久婷婷网 8| 99热在线播放| 日本综合色图| 成人羞羞视频国产| 国产97在线视频| 一本色道久久综合精品婷婷| 麻豆色99999| 超碰9 7女人| 天天搞欧美| 97人人色| 超碰97护士| 亚洲色人| 欧美综合1性辶| 久久久成人免费av电影| 99热99re6国产在线播放| 亚洲AV永久无码精品成人调教| 97超碰人操| 亚洲国产精品久久久男人的天堂| 啪啪免费| 以及麻豆国产入口在线观看免费| 亚州色阁| 久久综合久色欧美综合狠狠| 91l欧美在线| 91成人在线| 五毛骚逼极品美女怕怕| 国模限制级电影| 日日干夜夜操视频h| 男人的天堂成人的社区| 欧美日韩资源在线| 大香蕉欧美日韩| 少好三P| 91A欧美电影网站| 在线观看亚洲成人精品| 白天啪啪晚上啪啪视频| 波多野结衣一级视频| 亚洲精品日韩国产欧美| 天天爽天天操| 91网站视频在线观看| 国产高清在线自在拍69| 阿姨一区二区免费视频-高清正片西瓜视频下载app-T450AV | 激情五月丁香五月| 亚州宗合另类| 人妻在线大香蕉| 高清孕妇孕交 交孕妇| 欧美激情专区| 在线播放免费av福利片| 91成人精品在线播放| 99无码精品| 情色av电影| 丰满少妇精品一区二区| 亚洲人人夜夜澡人人爽| 手机在线大香蕉| 中文字幕,人妻,日韩| 欧美麻豆成人同性GⅤ在线| 国产免费一区二区三区最新不卡| 亚洲999综合| 东京热毛片177b2viP| 国产一级内射无挡观看| 熟女字幕| 青青操97| 加勒比av网| 亚洲午夜未满十八勿入网站日本又色又爽又黄| 人人操肉肉| 97干色天堂| 偷拍亚洲情色| av一区二区三区四区| 夜夜草网站| 久久久久久亚洲精品中文字幕人妻| 蜜桃臀一区二区三区久久| 伊人天天久久动态图| 国产精品久久久久久久毛片1| 野狼激情网| 久久精品六区| 成人免费福利在线观看| 久久免费中文字幕在线观看| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 成人日韩欧美| 视频在线中文字幕| 97干在线| 亚洲国产成人高清在线| 久久伊人青青草| 精品人妻一区二区三区日产乱码| 嫖老熟女A片一二三区| 国产高清不卡视频| 日韩精品人妻| 另类天堂| 一区二区三区四区五区久久久久久| 久久国产熟女影院| 欧美熟妇视频| 天天爱天天操| 九热视频| 一本大道久| 国产精品自在线发布| 欧美精品在线观看| 色97干| 人人透人人操| 国产精品69久久久久久久| 亚一综合久久久久久久久久| 91麻豆天美国产| 中文乱码字字幕在线第5页| 99re视频在线观看这里只有精品| 91精品导航| 99在线观看| 久久伊人东京热| 亚洲色诱惑| 97天天| 久久人妻办公室视频| 日韩99999| 大香交伊人网| 色妇综合网| 另类图片五月| 久热这里| 亚洲国产一区二区三区四区国产| 锕锕好爽 死我在线观看| 无套内射人妻在线播放| 亚洲熟妇丝袜在线观看| 国产v亚洲v日韩v欧美v片另类| 精品一区二区三区蜜桃臀赵总 | 亚洲 无码 偷拍| 夜夜狼人妻| 蜜乳视频网站| 懂色av中文字幕一区二区三区天美 | 日本韩高清无砖码22o| 久久国色天香香蕉| a片久久久久久久久久久久| 亚洲不卡不卡中文字幕不卡 | 色爽爽文学| 老女人综合网| 97亚洲资源| av网页一区二区三区| 九七人妻在线| 五月香婷婷| dy888午夜老子影视达达兔| 啪啪AV导航| 激情小说激情视频| 九九aV| 久久精品国产97欧美精品亚洲| 日韩一性一交一A片俄罗斯| 黄久久| 欧美劲爆视频一区二区| 超碰久超碰久| 97精品97| 99久在线精品99re8| 色婷婷一区二区三区久久| 欧美天天综| 强歼乱伦资源网| 91n处女在线观看| 五月天综合网| 手机在线播放国产福利| 国产一区二区在线看| 好淫网一二三视区| 一区二区三区黄片免费观看| 超碰久草| 神马午夜久久久| 亚洲四虎熟女精品| 91肉丝| 日韩三级在线观看mp4| 亚洲欧综合另类无码一区| 久久大香蕉97| 丝袜喷水在线| 亚洲AV成人无码一区二区三区在线观看| 性猛交| 久热网| 西西美女视频网| 激情小说五月天| 26UUU欧美激情一区二区| 激情内射| 国产超碰在线一区| 黄污污污污| 免费少妇一区二区| 97碰碰色| com 首页 18岁 禁区 女优 免费 精选 同城 | 激情开心五月天| 在线观看亚洲成人精品| 亚洲成人帖图| 亚洲色图国产另类| 青青草在线视频人人想人人上| 性爱精品一区| 2019精品国产无码成人| 日本国产亚洲一区在线观看| 丁香五月激情综合| 国产探花精品在线| 一二三区操逼国产91| 婷婷丁香人妻 | 亚洲美欧999| 丁香五月影院| 国产乱伦性爱AV| 国内精品久久人妻性色av| 深喉吞精| 久久久久亚洲精品| 国产传媒一区日韩| 校园春色制服丝袜中文字亚洲| 丁香六月东京热| 日本视频一区二区三区| 草草电影院| 久久男人天堂| 精品国产乱子伦一区二区三区,精品一| 99热8| 美腿丝袜偷拍亚洲欧美| 操人妻丝袜高跟| 91丨九色丨大屁股| 十八禁成人网站在线观看| 日韩一性一交一A片俄罗斯| 97色97好| 午夜精品久久久久久久久久久久久| 中文一区二区| 久久99精品九九久久久婷婷| 91艹逼精品| 午夜呻吟欧美| 日本A级视频| 日韩久久三区| 欧美久热| 99久久com免费视频′| 久久91精品国产9丨久久分亭| 在线中文字幕| 国产精品久久天天干| xxxx网站亚洲精品| 大香蕉淫人| 亚洲熟女综合网| 日本一级特级毛片视频|