久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術(shù)文章
文章詳情頁

Spring Cloud Gateway 記錄請求應(yīng)答數(shù)據(jù)日志操作

瀏覽:51日期:2023-07-30 13:58:45

我就廢話不多說了,大家還是直接看代碼吧~

public class GatewayContext { public static final String CACHE_GATEWAY_CONTEXT = 'cacheGatewayContext'; /** * cache json body */ private String cacheBody; /** * cache formdata */ private MultiValueMap<String, String> formData; /** * cache reqeust path */ private String path; public String getCacheBody() { return cacheBody; } public void setCacheBody(String cacheBody) { this.cacheBody = cacheBody; } public MultiValueMap<String, String> getFormData() { return formData; } public void setFormData(MultiValueMap<String, String> formData) { this.formData = formData; } public String getPath() { return path; } public void setPath(String path) { this.path = path; }}

import java.io.UnsupportedEncodingException;import java.net.URLEncoder;import java.nio.charset.Charset;import java.nio.charset.StandardCharsets;import java.util.List;import java.util.Map;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.cloud.gateway.filter.GatewayFilterChain;import org.springframework.cloud.gateway.filter.GlobalFilter;import org.springframework.core.io.ByteArrayResource;import org.springframework.core.io.buffer.DataBuffer;import org.springframework.core.io.buffer.DataBufferUtils;import org.springframework.core.io.buffer.NettyDataBufferFactory;import org.springframework.http.HttpHeaders;import org.springframework.http.HttpMethod;import org.springframework.http.MediaType;import org.springframework.http.codec.HttpMessageReader;import org.springframework.http.server.reactive.ServerHttpRequest;import org.springframework.http.server.reactive.ServerHttpRequestDecorator;import org.springframework.stereotype.Component;import org.springframework.util.MultiValueMap;import org.springframework.web.reactive.function.server.HandlerStrategies;import org.springframework.web.reactive.function.server.ServerRequest;import org.springframework.web.server.ServerWebExchange;import io.netty.buffer.ByteBufAllocator;import reactor.core.publisher.Flux;import reactor.core.publisher.Mono;// https://segmentfault.com/a/1190000017898354@Componentpublic class LogRequestGlobalFilter implements GlobalFilter { /** * default HttpMessageReader */ private static final List<HttpMessageReader<?>> messageReaders = HandlerStrategies.withDefaults().messageReaders(); private Logger log = LoggerFactory.getLogger(LogRequestGlobalFilter.class); @Override public Mono<Void> filter( ServerWebExchange exchange, GatewayFilterChain chain) { /** * save request path and serviceId into gateway context */ ServerHttpRequest request = exchange.getRequest(); String path = request.getPath().pathWithinApplication().value(); GatewayContext gatewayContext = new GatewayContext(); gatewayContext.setPath(path); /** * save gateway context into exchange */ exchange.getAttributes().put(GatewayContext.CACHE_GATEWAY_CONTEXT, gatewayContext); HttpHeaders headers = request.getHeaders(); MediaType contentType = headers.getContentType(); log.info('start-------------------------------------------------'); log.info('HttpMethod:{},Url:{}', request.getMethod(), request.getURI().getRawPath()); log.info('Headers token: {}', headers.getFirst('token')); if (request.getMethod() == HttpMethod.GET) { log.info('end-------------------------------------------------'); } if (request.getMethod() == HttpMethod.POST) { Mono<Void> voidMono = null; if (MediaType.APPLICATION_JSON.equals(contentType) || MediaType.APPLICATION_JSON_UTF8.equals(contentType)) { voidMono = readBody(exchange, chain, gatewayContext); } if (MediaType.APPLICATION_FORM_URLENCODED.equals(contentType)) { voidMono = readFormData(exchange, chain, gatewayContext); } return voidMono; } /* log.debug( '[GatewayContext]ContentType:{},Gateway context is set with {}', contentType, gatewayContext);*/ return chain.filter(exchange); } /** * ReadFormData * * @param exchange * @param chain * @return */ private Mono<Void> readFormData( ServerWebExchange exchange, GatewayFilterChain chain, GatewayContext gatewayContext) { final ServerHttpRequest request = exchange.getRequest(); HttpHeaders headers = request.getHeaders(); return exchange.getFormData() .doOnNext(multiValueMap -> { gatewayContext.setFormData(multiValueMap); log.info('Post x-www-form-urlencoded:{}', multiValueMap); log.info( 'end-------------------------------------------------'); }) .then(Mono.defer(() -> { Charset charset = headers.getContentType().getCharset(); charset = charset == null ? StandardCharsets.UTF_8 : charset; String charsetName = charset.name(); MultiValueMap<String, String> formData = gatewayContext.getFormData(); /** * formData is empty just return */ if (null == formData || formData.isEmpty()) { return chain.filter(exchange); } StringBuilder formDataBodyBuilder = new StringBuilder(); String entryKey; List<String> entryValue; try { /** * repackage form data */ for (Map.Entry<String, List<String>> entry : formData.entrySet()) { entryKey = entry.getKey(); entryValue = entry.getValue(); if (entryValue.size() > 1) {for (String value : entryValue) { formDataBodyBuilder.append(entryKey).append('=') .append( URLEncoder.encode(value, charsetName)) .append('&');} } else {formDataBodyBuilder .append(entryKey).append('=').append(URLEncoder .encode(entryValue.get(0), charsetName)) .append('&'); } } } catch (UnsupportedEncodingException e) { // ignore URLEncode Exception } /** * substring with the last char ’&’ */ String formDataBodyString = ''; if (formDataBodyBuilder.length() > 0) { formDataBodyString = formDataBodyBuilder.substring(0,formDataBodyBuilder.length() - 1); } /** * get data bytes */ byte[] bodyBytes = formDataBodyString.getBytes(charset); int contentLength = bodyBytes.length; ServerHttpRequestDecorator decorator = new ServerHttpRequestDecorator( request) {/** * change content-length * * @return */@Overridepublic HttpHeaders getHeaders() { HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.putAll(super.getHeaders()); if (contentLength > 0) { httpHeaders.setContentLength(contentLength); } else { httpHeaders.set(HttpHeaders.TRANSFER_ENCODING, 'chunked'); } return httpHeaders;}/** * read bytes to Flux<Databuffer> * * @return */@Overridepublic Flux<DataBuffer> getBody() { return DataBufferUtils .read(new ByteArrayResource(bodyBytes), new NettyDataBufferFactory( ByteBufAllocator.DEFAULT), contentLength);} }; ServerWebExchange mutateExchange = exchange.mutate().request(decorator).build(); /* log.info('[GatewayContext]Rewrite Form Data :{}', formDataBodyString);*/ return chain.filter(mutateExchange); })); } /** * ReadJsonBody * * @param exchange * @param chain * @return */ private Mono<Void> readBody( ServerWebExchange exchange, GatewayFilterChain chain, GatewayContext gatewayContext) { /** * join the body */ return DataBufferUtils.join(exchange.getRequest().getBody()) .flatMap(dataBuffer -> { /* * read the body Flux<DataBuffer>, and release the buffer * //TODO when SpringCloudGateway Version Release To G.SR2,this can be update with the new version’s feature * see PR https://github.com/spring-cloud/spring-cloud-gateway/pull/1095 */ byte[] bytes = new byte[dataBuffer.readableByteCount()]; dataBuffer.read(bytes); DataBufferUtils.release(dataBuffer); Flux<DataBuffer> cachedFlux = Flux.defer(() -> { DataBuffer buffer =exchange.getResponse().bufferFactory().wrap(bytes); DataBufferUtils.retain(buffer); return Mono.just(buffer); }); /** * repackage ServerHttpRequest */ ServerHttpRequest mutatedRequest = new ServerHttpRequestDecorator(exchange.getRequest()) {@Overridepublic Flux<DataBuffer> getBody() { return cachedFlux;} }; /** * mutate exchage with new ServerHttpRequest */ ServerWebExchange mutatedExchange = exchange.mutate().request(mutatedRequest).build(); /** * read body string with default messageReaders */ return ServerRequest.create(mutatedExchange, messageReaders) .bodyToMono(String.class) .doOnNext(objectValue -> {log.info('PostBody:{}', objectValue);log.info( 'end-------------------------------------------------');gatewayContext.setCacheBody(objectValue); /* log.debug('[GatewayContext]Read JsonBody:{}',objectValue);*/ }).then(chain.filter(mutatedExchange)); }); }}

import lombok.extern.slf4j.Slf4j;import org.reactivestreams.Publisher;import org.springframework.cloud.gateway.filter.GatewayFilterChain;import org.springframework.cloud.gateway.filter.GlobalFilter;import org.springframework.core.Ordered;import org.springframework.core.io.buffer.DataBuffer;import org.springframework.core.io.buffer.DataBufferFactory;import org.springframework.http.HttpHeaders;import org.springframework.http.HttpMethod;import org.springframework.http.server.reactive.ServerHttpRequest;import org.springframework.http.server.reactive.ServerHttpResponse;import org.springframework.http.server.reactive.ServerHttpResponseDecorator;import org.springframework.stereotype.Component;import org.springframework.web.server.ServerWebExchange;import reactor.core.publisher.Flux;import reactor.core.publisher.Mono;import java.net.InetSocketAddress;import java.net.URI;import java.nio.CharBuffer;import java.nio.charset.Charset;import java.nio.charset.StandardCharsets;import java.util.concurrent.atomic.AtomicReference;@Component@Slf4jpublic class LogResponseGlobalFilter implements GlobalFilter, Ordered { private static final String REQUEST_PREFIX = 'Request Info [ '; private static final String REQUEST_TAIL = ' ]'; private static final String RESPONSE_PREFIX = 'Response Info [ '; private static final String RESPONSE_TAIL = ' ]'; private StringBuilder normalMsg = new StringBuilder(); @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest request = exchange.getRequest(); ServerHttpResponse response = exchange.getResponse(); DataBufferFactory bufferFactory = response.bufferFactory(); normalMsg.append(RESPONSE_PREFIX); ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(response) { @Override public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) { if (body instanceof Flux) { Flux<? extends DataBuffer> fluxBody = (Flux<? extends DataBuffer>) body; return super.writeWith(fluxBody.map(dataBuffer -> { // probably should reuse buffers byte[] content = new byte[dataBuffer.readableByteCount()]; dataBuffer.read(content); String responseResult = new String(content, Charset.forName('UTF-8')); normalMsg.append('status=').append(this.getStatusCode()); normalMsg.append(';header=').append(this.getHeaders()); normalMsg.append(';responseResult=').append(responseResult); normalMsg.append(RESPONSE_TAIL); log.info(normalMsg.toString()); return bufferFactory.wrap(content); })); } return super.writeWith(body); // if body is not a flux. never got there. } }; return chain.filter(exchange.mutate().response(decoratedResponse).build()); } @Override public int getOrder() { return -2; }}

補充知識:Spring Cloud Gateway 2.x 打印 Log

場景

在服務(wù)網(wǎng)關(guān)層面,需要打印出用戶每次的請求body和其他的參數(shù),gateway使用的是Reactor響應(yīng)式編程,和Zuul網(wǎng)關(guān)獲取流的寫法還有些不同,

不過基本的思路是一樣的,都是在filter中讀取body流,然后緩存回去,因為body流,框架默認只允許讀取一次。

思路

1. 添加一個filter做一次請求的攔截

GatewayConfig.java

添加一個配置類,配置一個高優(yōu)先級的filter,并且注入一個PayloadServerWebExchangeDecorator 對request和response做包裝的類。

package com.demo.gateway2x.config;import com.demo.gateway2x.decorator.PayloadServerWebExchangeDecorator;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.Ordered;import org.springframework.core.annotation.Order;import org.springframework.web.server.WebFilter;@Configurationpublic class GatewayConfig { @Bean @Order(Ordered.HIGHEST_PRECEDENCE) //過濾器順序 public WebFilter webFilter() { return (exchange, chain) -> chain.filter(new PayloadServerWebExchangeDecorator(exchange)); }}

PayloadServerWebExchangeDecorator.java

這個類中,我們實現(xiàn)了框架的ServerWebExchangeDecorator類,同時注入了自定義的兩個類,PartnerServerHttpRequestDecorator 和 PartnerServerHttpResponseDecorator ,

這兩個類用于后面對請求與響應(yīng)的攔截。

package com.demo.gateway2x.decorator;import org.springframework.http.server.reactive.ServerHttpRequest;import org.springframework.http.server.reactive.ServerHttpResponse;import org.springframework.web.server.ServerWebExchange;import org.springframework.web.server.ServerWebExchangeDecorator;public class PayloadServerWebExchangeDecorator extends ServerWebExchangeDecorator { private PartnerServerHttpRequestDecorator requestDecorator; private PartnerServerHttpResponseDecorator responseDecorator; public PayloadServerWebExchangeDecorator(ServerWebExchange delegate) { super(delegate); requestDecorator = new PartnerServerHttpRequestDecorator(delegate.getRequest()); responseDecorator = new PartnerServerHttpResponseDecorator(delegate.getResponse()); } @Override public ServerHttpRequest getRequest() { return requestDecorator; } @Override public ServerHttpResponse getResponse() { return responseDecorator; }}

2. 在請求進入時,對request做一次攔截

PartnerServerHttpRequestDecorator.java

這個類實現(xiàn)了 ServerHttpRequestDecorator , 并在構(gòu)造函數(shù)中,使用響應(yīng)式編程,調(diào)用了打印log的方法,注意關(guān)注 Mono<DataBuffer> mono = DataBufferUtils.join(flux); ,

這里將Flux合并成了一個Mono,因為如果不這么做,body內(nèi)容過多,將會被分段打印,這里是一個恒重要的點,

在打印RequestParamsHandle.chain打印過日志后,我們又返回了一個dataBuffer,用作向下傳遞,否則dataBuffer被讀取過一次后就不能繼續(xù)使用了。

package com.demo.gateway2x.decorator;import lombok.extern.slf4j.Slf4j;import org.springframework.core.io.buffer.DataBuffer;import org.springframework.core.io.buffer.DataBufferUtils;import org.springframework.http.server.reactive.ServerHttpRequest;import org.springframework.http.server.reactive.ServerHttpRequestDecorator;import reactor.core.publisher.Flux;import reactor.core.publisher.Mono;import static reactor.core.scheduler.Schedulers.single;@Slf4jpublic class PartnerServerHttpRequestDecorator extends ServerHttpRequestDecorator { private Flux<DataBuffer> body; public PartnerServerHttpRequestDecorator(ServerHttpRequest delegate) { super(delegate); Flux<DataBuffer> flux = super.getBody(); if (ParamsUtils.CHAIN_MEDIA_TYPE.contains(delegate.getHeaders().getContentType())) { Mono<DataBuffer> mono = DataBufferUtils.join(flux); body = mono.publishOn(single()).map(dataBuffer -> RequestParamsHandle.chain(delegate, log, dataBuffer)).flux(); } else { body = flux; } } @Override public Flux<DataBuffer> getBody() { return body; }}

RequestParamsHandle.java

這個類主要用來讀取dataBuffer并做了日志打印處理,也可以做一些其他的例如參數(shù)校驗等使用。

package com.demo.gateway2x.decorator;import com.alibaba.fastjson.JSON;import org.slf4j.Logger;import org.springframework.core.io.buffer.DataBuffer;import org.springframework.http.server.reactive.ServerHttpRequest;import org.springframework.util.StringUtils;import java.util.HashMap;import java.util.Map;public class RequestParamsHandle { public static <T extends DataBuffer> T chain(ServerHttpRequest delegate, Logger log, T buffer) { ParamsUtils.BodyDecorator bodyDecorator = ParamsUtils.buildBodyDecorator(buffer); // 參數(shù)校驗 和 參數(shù)打印 log.info('Payload: {}', JSON.toJSONString(validParams(getParams(delegate, bodyDecorator.getBody())))); return (T) bodyDecorator.getDataBuffer(); } public static Map<String,Object> getParams(ServerHttpRequest delegate, String body) { // 整理參數(shù) Map<String,Object> params = new HashMap<>(); if (delegate.getQueryParams() != null) { params.putAll(delegate.getQueryParams()); } if (!StringUtils.isEmpty(body)) { params.putAll(JSON.parseObject(body)); } return params; } public static Map<String,Object> validParams(Map<String,Object> params) { // todo 參數(shù)校驗 return params; }}

3. 在結(jié)果返回時,對response做一次攔截

PartnerServerHttpResponseDecorator.java

這個類和上面的request的異曲同工,攔截響應(yīng)流,并做記錄入處理。

package com.demo.gateway2x.decorator;import lombok.extern.slf4j.Slf4j;import org.reactivestreams.Publisher;import org.springframework.core.io.buffer.DataBuffer;import org.springframework.core.io.buffer.DataBufferUtils;import org.springframework.http.MediaType;import org.springframework.http.server.reactive.ServerHttpResponse;import org.springframework.http.server.reactive.ServerHttpResponseDecorator;import reactor.core.publisher.Flux;import reactor.core.publisher.Mono;import static reactor.core.scheduler.Schedulers.single;@Slf4jpublic class PartnerServerHttpResponseDecorator extends ServerHttpResponseDecorator { PartnerServerHttpResponseDecorator(ServerHttpResponse delegate) { super(delegate); } @Override public Mono<Void> writeAndFlushWith(Publisher<? extends Publisher<? extends DataBuffer>> body) { return super.writeAndFlushWith(body); } @Override public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) { final MediaType contentType = super.getHeaders().getContentType(); if (ParamsUtils.CHAIN_MEDIA_TYPE.contains(contentType)) { if (body instanceof Mono) { final Mono<DataBuffer> monoBody = (Mono<DataBuffer>) body; return super.writeWith(monoBody.publishOn(single()).map(dataBuffer -> ResponseParamsHandle.chain(log, dataBuffer))); } else if (body instanceof Flux) { Mono<DataBuffer> mono = DataBufferUtils.join(body); final Flux<DataBuffer> monoBody = mono.publishOn(single()).map(dataBuffer -> ResponseParamsHandle.chain(log, dataBuffer)).flux(); return super.writeWith(monoBody); } } return super.writeWith(body); }}

ResponseParamsHandle.java

響應(yīng)流的日志打印

package com.demo.gateway2x.decorator;import org.slf4j.Logger;import org.springframework.core.io.buffer.DataBuffer;public class ResponseParamsHandle { public static <T extends DataBuffer> T chain(Logger log, T buffer) { ParamsUtils.BodyDecorator bodyDecorator = ParamsUtils.buildBodyDecorator(buffer); // 參數(shù)校驗 和 參數(shù)打印 log.info('Payload: {}', bodyDecorator.getBody()); return (T) bodyDecorator.getDataBuffer(); }}

下面是實際操作,發(fā)送一次http請求:

Spring Cloud Gateway 記錄請求應(yīng)答數(shù)據(jù)日志操作

Spring Cloud Gateway 記錄請求應(yīng)答數(shù)據(jù)日志操作

控制臺log結(jié)果:

Spring Cloud Gateway 記錄請求應(yīng)答數(shù)據(jù)日志操作

github源碼地址:https://github.com/qiaomengnan16/gateway-2x-log-demo

總結(jié)

gateway和zuul打印參數(shù)的方式思路是一致的,只是gateway采用的是reactor,寫法上與zuul的直接讀取流有些不同,這里需要知道的是Flux需要轉(zhuǎn)換為Mono這個地方,如果不轉(zhuǎn)換容易分多批打印。

以上這篇Spring Cloud Gateway 記錄請求應(yīng)答數(shù)據(jù)日志操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 国产精品久久片 | 日韩久久精品 | 欧美成人毛片 | 欧美一级视频 | 激情一区 | 一区二区三区在线看 | 精品国产乱码久久久久久久软件 | 99re6在线 | 亚洲高清一区二区三区 | 亚洲视频在线观看免费 | 日韩国产欧美一区 | 国产精品一区二区三区在线播放 | 午夜精品视频在线观看 | 婷婷毛片 | 欧美区视频 | 欧美黄色精品 | 亚洲午夜精品 | www日本高清视频 | 国产伦精品一区二区三区高清 | 欧美精品成人在线视频 | 一级毛片视频 | 亚洲精品美女视频 | 污污视频免费网站 | 成人久久 | 成人免费视频播放 | 欧美一级免费看 | 欧美日韩精品一区二区三区蜜桃 | 欧美久久久久久久久久 | 午夜精品一区二区三区在线视频 | 亚洲高清在线观看 | 日韩中文在线观看 | 日韩在线精品视频 | 9l蝌蚪porny中文自拍 | 成人精品一区二区 | 日韩在线免费观看网站 | 亚洲一区二区三区中文字幕 | 午夜视频网站 | 成人一区二区三区 | 亚洲一级毛片 | 国产精品美女久久久久久免费 | 亚洲高清视频网站 | 欧美福利一区二区三区 | 农村妇女毛片精品久久久 | 亚洲一区二区三区日韩 | 久久九九精品久久 | 国产精品永久免费 | 欧美精品a∨在线观看不卡 欧美日韩中文字幕在线播放 | 成人午夜啪啪好大 | 国产精品11| 91精品国产综合久久久久久丝袜 | 久久久午夜爽爽一区二区三区三州 | 亚洲好看站| 在线观看你懂的视频 | 羞羞视频免费观看网站 | 欧洲一区在线 | 久久久久久久久成人 | 久久久91精品国产一区二区三区 | 国产免费一区 | 欧美性久久 | 精品国偷自产国产一区 | 亚洲综合在线视频 | 欧美日韩国产不卡 | 欧美一区免费 | 国产精品久久国产精品 | 日韩久久久久久久久久久 | 狠久久| 中文一区| 久久精品中文字幕 | 国产精品网站在线观看 | 日韩精品一区二区三区在线播放 | 中文字幕日韩欧美 | av在线精品 | 日本精品中文字幕 | xxxx网| 涩涩视频大全 | 久草 在线 | 婷婷av在线 | 亚洲免费在线视频 | 一区二区三区国产视频 | 国产精品美女久久久久久久久久久 | 日本aⅴ毛片成人实战推荐 成人免毛片 | 亚洲日韩中文字幕一区 | 日韩性在线 | av影院在线观看 | 永久91嫩草亚洲精品人人 | 久久国产一区二区 | 日韩欧美大片在线观看 | 在线日韩欧美 | 超碰一区 | 一级免费黄色免费片 | 成年人精品视频 | 国产精品精品视频一区二区三区 | 天堂精品 | 国产一区在线看 | 成人一区二区三区 | 午夜精品久久久久久久久久久久久 | 黄色大片成人 | 欧美日韩在线成人 | 女人高潮特级毛片 | 不用播放器的av | 国产精品美女久久久久久久久久久 | 欧洲一区在线 | 精品欧美一区二区三区久久久小说 | 天天操网址 | 亚洲视频在线看 | 第一色在线| 色九九| 久久久国产精品入口麻豆 | 午夜国产影院 | 99久久婷婷国产综合精品电影 | 精品日韩一区二区三区 | 免费黄色毛片视频 | 97精品国产97久久久久久免费 | 久久国产一区二区 | 宅男伊人 | 久久久影视 | 欧美激情在线播放 | 亚洲性视频 | 国产婷婷精品 | 超碰官网 | 91精品国产91综合久久蜜臀 | 国产精品久久久久永久免费观看 | 精品国产一区二区三区av片 | 久久国 | 欧美精品在线看 | 91精品一区二区三区久久久久 | 国产精品1页 | 欧美日韩中文字幕在线 | 亚州中文字幕 | 亚洲日本欧美日韩高观看 | 午夜精品视频在线观看 | 九色在线播放 | 久久久久久网址 | 一区二区三区成人 | 国产欧美一区二区三区在线看 | 欧美一二三 | 国产精品一区二区三区99 | 黄久久久| 在线观看成人小视频 | 欧美日韩中文字幕在线 | 日日干天天操 | 亚洲日本乱码一区两区在线观看 | 亚洲一区精品在线 | 日本高清视频一区二区三区 | 亚洲免费在线 | 日韩中文字幕一区二区 | 综合亚洲精品 | 中文无码久久精品 | 久久久日韩精品一区二区三区 | 色综合久久久久 | 久久精品a一级国产免视看成人 | 精品在线一区二区 | 91亚洲高清 | 麻豆视频在线 | 亚洲免费在线观看视频 | 日韩国产精品一区二区三区 | 专干老肥女人88av | 欧美视频在线观看一区 | 午夜影院在线看 | 男人天堂视频在线观看 | 国产福利在线视频 | 欧美日韩成人在线观看 | 天天射天天| 伊人电影综合网 | 精品日韩视频 | 一级毛片久久久 | 女人高潮特级毛片 | 欧美在线播放一区 | 国产高清视频在线 | 久久久久久九九九九九九 | 亚洲欧美日韩在线 | 日韩精品一区二区三区在线观看 | 国产中文字幕在线观看 | 成人国产精品免费网站 | 福利91| 亚洲精品视频免费观看 | 国产成人午夜精品影院游乐网 | 狠狠艹 | 国产午夜久久 | 九一视频在线观看 | 成人1区| 99亚洲 | 欧美日韩中文字幕在线 | 久久久精品免费观看 | 日本不卡高字幕在线2019 | 操久久| 国产一级中文字幕 | 国产单男 | 日韩av在线电影 | 无套内谢孕妇毛片免费看红桃影视 | 日韩福利一区二区 | 国产成人免费视频 | 激情小网站 | 国产在线a | 中文字幕av一区 | 日韩精品极品视频在线 | 99精彩视频 | 黄色一级大片视频 | 99亚洲精品 | 看一级毛片视频 | 99视频免费 | 日日操视频 | www国产亚洲精品久久网站 | 91精品国产色综合久久 | 人人干在线视频 | 日韩av电影观看 | 日日日操 | 玖玖精品在线 | 欧美视频在线观看不卡 | 日韩中文字幕国产 | 亚洲免费视频在线 | 精品人伦一区二区三区蜜桃视频 | 狠狠操天天干 | 欧美久久一区二区三区 | 欧美精品久久久久久久久 | 国产亚洲欧美在线 | 久久无码精品一区二区三区 | www.一区| 一区二区三区在线播放视频 | 日日干夜夜骑 | 成人免费视频观看视频 | 欧美日韩精品在线观看 | 午夜视频网址 | 欧美视频网站 | 一级免费黄色免费片 | 成人av网站在线观看 | 成人亚洲视频 | 亚洲国产精品99久久久久久久久 | 亚洲特级 | 国产在线一区二区三区 | 日韩精品中文字幕在线播放 | av在线一区二区 | 久久国产精彩视频 | 黄色片免费在线 | 久久久久久av | 免费一二区 | 一区二区中文 | 米奇狠狠操 | 亚洲欧美福利视频 | 日韩在线 | 亚洲aⅴ天堂av在线电影软件 | 久久一区 | 久草在线在线精品观看 | 国产99在线 | 欧美 | 美女久久| 日韩欧美在线看 | 精品视频一区二区三区四区 | 欧美日本乱大交xxxxx | 精品久久中文字幕 | 98久久久 | 欧美成人精品一区二区三区在线看 | 日韩超碰在线观看 | 国产高清精品在线 | 天天躁日日躁性色aⅴ电影 免费在线观看成年人视频 国产欧美精品 | 红桃成人少妇网站 | 免费v片在线观看 | 日日摸日日碰夜夜爽亚洲精品蜜乳 | 爱干在线 | 91色在线观看| 欧美精品一区二区视频 | 色婷婷久久久swag精品 | 欧美福利在线 | 国产欧美精品 | 成人性视频免费网站 | 日本中文在线 | 亚洲精品中文字幕乱码无线 | 成人亚洲一区二区 | 精品久久久久久久久久久久久久久久久久久 | 国产高清精品在线 | 欧美日韩第一 | 二区久久| 91在线影院 | 老妇女av | 在线免费av观看 | 美女天堂网 | 亚洲成人在线视频网站 | 91在线视频播放 | 五月婷婷激情 | 日韩经典一区 | 欧美精品1区2区3区 免费亚洲婷婷 | 国产精品一区二区三区免费 | 国产精品91视频 | 91av亚洲| 在线免费一级片 | 中文字幕久久精品 | 97综合色 | 丁香婷婷久久久综合精品国产 | 91人人看 | 91人人| 三级视频在线 | 激情网站免费 | 亚洲欧美一区二区三区在线 | 激情综合色综合久久综合 | 欧美精品1区2区3区 免费亚洲婷婷 | 91午夜精品 | 国产成人在线播放 | www国产亚洲精品久久网站 | 亚洲国产视频精品 | 国产精品久久久久久亚洲调教 | 91久久精品一区 | a级毛片黄 | 高清国产午夜精品久久久久久 | 精品xxxx户外露出视频 | 欧美成人a | 欧美久久久久久久久久久久久久 | 久久涩 | 成人免费激情视频 | av天天干| 色综合视频 | 国产精品久久久久婷婷二区次 | 国产午夜精品美女视频明星a级 | 日本三级不卡 | 狠狠干av| 天堂网色 | 免费av中国 | 一区二区三区亚洲精品国 | 亚洲欧美激情精品一区二区 | 午夜精品亚洲日日做天天做 | 日韩色av | 成人a在线视频免费观看 | 一级一片免费视频 | 国产亚洲在线 | 国产成人免费视频网站高清观看视频 | 特级丰满少妇一级aaaa爱毛片 | 人人看人人干 | 免费欧美一级 | 超碰在线看 | 亚欧洲精品视频在线观看 | 91在线 | 亚洲 | 亚洲高清视频在线观看 | 久久午夜精品 | 午夜视频一区二区三区 | 国产美女av| 国产精品99久久久久久动医院 | 亚洲欧洲一区二区三区 | 美日韩一区二区 | 亚洲精品第一页 | 日韩精品久久久久久 | 密桃av| 色婷婷一区二区三区四区 | 成年人看的羞羞网站 | 天堂久久爱资源站www | 一区二区三区视频免费在线观看 | 老司机精品福利视频 | 日韩精品专区 | 国产高清在线观看 | 91在线免费观看 | 青青草免费在线视频 | 久久精品二区 | 亚洲人人 | 亚洲成人一二区 | 特级黄一级播放 | 中午字幕在线观看 | 91免费在线看 | 久久精品 | 日韩亚洲 | 一区二区三区日韩 | 伊人网站 | 久久久久国产亚洲日本 | 欧美视频一区二区 | 一区二区三区在线 | 欧 | 亚洲一区二区中文字幕 | 国产成人精品一区二区 | 国产精彩视频 | 国产精品99久久久久久动医院 | 久久国产欧美日韩精品 | 日韩欧美一区二区在线观看 | 国产网站在线 | 久久久久一区 | 欧美亚洲 | 欧美一区二区三区成人 | 日本美女一区二区三区 | 欧美久久久久久 | 日韩精品免费视频 | 91在线免费观看 | 在线观看视频一区二区 | 欧美日韩一区二区三区在线观看 | 露娜同人18av黄漫网站 | 久久中文字幕一区二区三区 | 国产亚洲www | 国精产品一区二区三区 | 综合久久综合久久 | 一区二区三区视频免费看 | 国产精品美女久久久久aⅴ国产馆 | 真人女人一级毛片免费播放 | 一级毛片免费观看 | 欧美自拍视频在线观看 | 成人国产精品一级毛片视频 | 亚洲综合在线一区 | 在线成人www免费观看视频 | 国产精品久久久久久久久免费桃花 | 中文字幕在线精品 | 一区二区三区国产好 | 北条麻妃99精品青青久久 | 看免费av| 精品无人乱码一区二区三区 | 日韩免费在线观看视频 | 黄色高清视频 | 综合一区二区三区 | 成人三级网址 | 欧美va天堂| 99精品网| 国产精品久久久久久久久久 | 国产视频久久精品 | 91麻豆产精品久久久久久 | 日韩区 | 91久久国产综合久久 | 国产欧美精品一区二区三区四区 | 毛片在线视频 | 久久成人一区 | 欧美一级二级三级视频 | 999精品视频 | 成人精品一区二区 | 亚洲成人久久久 | 一级欧美日韩 | 777777777亚洲妇女 | 99久久婷婷国产综合精品电影 | 亚洲在线观看免费视频 | 久久久网 | 久久精品亚洲精品国产欧美 | 伊人狠狠干 | 欧美一极视频 | 亚洲精品成人免费 | av亚洲在线 | 一区二区三区日韩精品 | 国产成人精品免高潮在线观看 | 一区二区三区四区精品 | 97人人超碰 | 伊人欧美在线 | 黄色毛片在线看 | 天天精品 | 欧美高清视频在线观看 | 超碰一区 | 香蕉大人久久国产成人av | 色久在线 | 99热福利| 久久久婷婷| 中国一级特黄毛片大片 | 一二三区av | 精品欧美日韩 | 99亚洲视频 | 91精品久久久久久9s密挑 | 免费成人小视频 | 亚洲精品一区二区三区在线观看 | www久久99 | 久久国内 | 亚洲一区二区三区高清 | 操操操av| 国产中文在线播放 | 国产在视频一区二区三区吞精 | 国产亚洲精品美女久久久久久久久久 | 91精品国产91久久久久久吃药 | 99在线视频观看 | 亚洲精品一二三区 | 一区二区三区四区视频 | 国产拍揄自揄精品视频麻豆 | 亚洲精品影院 | 精品免费久久久久久久苍 | 美日韩免费视频 | 国产激情偷乱视频一区二区三区 | 亚洲精片 | 久久香蕉网 | 免费一区二区三区 | 国产aaa大片 | 亚洲91| 国产精品无码久久久久 | 中文字幕亚洲精品 | 欧美激情高清 | 国产成人免费视频网站视频社区 | 久草视频在线播放 | 久久综合电影 | 91精品国产乱码久久久久久久久 | 亚洲精品中文视频 | 国产精品亚洲精品日韩已方 | 午夜激情在线观看 | 在线中文字幕视频 | 精品欧美乱码久久久久久1区2区 | 欧美一级黄色大片 | 国产日韩精品在线 | 古典武侠第一页久久777 | 久久精品成人 | 欧美日韩在线视频免费 | 伊人色播 | 国产精品久久久久久久久久ktv | 日本a网| 中国电影黄色一级片免费观看 | 成人av免费在线 | 国产精品成人观看视频国产奇米 | 一区二区三区精品视频 | 精品亚洲一区二区 | 视频一区二区三区中文字幕 | 精品视频一区二区三区四区 | 免费在线看a | 国产美女在线观看 | 国产精品久久电影观看 | 亚洲成人高清在线 | 欧美日韩国产一区二区三区 | 一区二区三区在线不卡 | 国产精品久久久久久 | 黄网在线观看 | 国产精品视频 | 国产精品久久久久久久久久99 | a级在线观看 | 欧美日韩中文国产一区发布 | 国产精品一区二区av | 日韩av在线一区二区三区 | 亚洲一区二区免费在线观看 | 欧美成人免费一级人片100 | 久久久久久久一区二区三区 | 日韩性欧美| 日韩一区二区在线观看 | 日韩国产二区 | 日韩中文字幕 | 国产免费一区二区三区四区五区 | 日韩免费在线观看视频 | 91精品国产九九九久久久亚洲 | 国产激情偷乱视频一区二区三区 | 99国产精品久久久 | 精品在线播放 | 99精品国产高清一区二区麻豆 | 精品一二区| 日韩欧美国产成人一区二区 | 天天操天天色天天 | 亚洲精品乱码久久久久久金桔影视 | 狠狠操麻豆 | 久久一区二区三区四区五区 | 一级篇 | 国产视频久久久久久 | 一区二区三区四区日韩 | 中文字幕视频在线 | 国外成人在线视频网站 | 日韩在线看片 | 亚洲精彩视频在线 | 日韩视频中文字幕 | 日韩视频精品 | 日韩欧美中文在线 | 国产精品国产精品 | 亚洲国产一区二区三区在线观看 | 国产高清一区二区 | 日本三级视频 | 精品一区二区三区免费看 | 欧美 日韩 中文字幕 | 中国大陆高清aⅴ毛片 | 国产依人在线 | a视频在线观看 | 成人精品福利视频 | 成人午夜免费网站 | 中文字幕一区二区三区乱码在线 | 中文字幕av免费 | 成人羞羞在线观看网站 | 国产精品xxxx | 精品国产精品三级精品av网址 | 天天夜夜操| 91在线免费看 | 欧美黄色一区 | 精品一区二区三区三区 | 自拍偷拍一区二区三区 | 四虎成人永久 | 国产欧美一区二区三区在线看 | 日韩在线一区二区三区 | 天天操天天操 | 久久99精品久久久久久久青青日本 | 美日韩精品视频 | 人人看人人干 | 国产精品入口麻豆www | 一区二区三区免费 | 国产精品亚洲一区二区三区在线 | 中文字幕视频在线观看 | 9 1在线观看 | 日韩精品视频免费在线观看 | 国产精品久久久久久久久软件 | 成人三级av | 亚洲一区中文字幕 | 亚洲精品一区二区三区 | 成人免费视频7777777 | 国产女爽爽视频精品免费 | 久久国产精品电影 | 国产视频久久久久 | 亚洲精品成人av | 2019中文字幕视频 | 欧美一区二区三区男人的天堂 | 一级一级毛片 | 国产成人一区二区三区 | 在线观看成人小视频 | 国产成人精品一区二区三区四区 | www.久久 | 中文字幕高清在线 | 欧美视频免费在线 | 亚洲视频中文字幕 | 日韩免费观看视频 | 亚洲欧美久久久 | 国产片侵犯亲女视频播放 | 一级片黄片毛片 | 久操草 | 国产激情午夜 | 中文字幕av免费 | 国产午夜精品一区二区三区嫩草 | 欧美一区二区三区免费在线观看 | 亚洲色图3p | 亚洲成人精品在线观看 | 久久久久久久91 | 北条麻妃99精品青青久久主播 | 亚洲精选国产 | 日韩城人免费 | 国产在线一区不卡 | 亚洲福利一区 | 国产亚洲精品精品国产亚洲综合 | 在线观看免费国产 | 成人三级视频网站 | 国产成人精品一区一区一区 | 成视频年人免费看黄网站 | 久久久一 | 国产精品久久久久久 | 久久精品小视频 | 天天久久 |