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

您的位置:首頁技術文章
文章詳情頁

Spring Cloud gateway 網關如何攔截Post請求日志

瀏覽:4日期:2023-07-02 13:19:28

gateway版本是 2.0.1

1.pom結構

(部分內部項目依賴已經隱藏)

<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId></dependency><!--監控相關--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- redis --><!--<dependency>--> <!--<groupId>org.springframework.boot</groupId>--> <!--<artifactId>spring-boot-starter-data-redis</artifactId>--><!--</dependency>--><!-- test-scope --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope></dependency><dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.1.11</version></dependency><dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.1.11</version></dependency><dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.6</version></dependency><!--第三方的jdbctemplatetool--><dependency> <groupId>org.crazycake</groupId> <artifactId>jdbctemplatetool</artifactId> <version>1.0.4-RELEASE</version></dependency><dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId></dependency><!-- alibaba start --><dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId></dependency>2.表結構

CREATE TABLE `zc_log_notes` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT ’日志信息記錄表主鍵id’, `notes` varchar(255) DEFAULT NULL COMMENT ’操作記錄信息’, `amenu` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT ’一級菜單’, `bmenu` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT ’二級菜單’, `ip` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT ’操作人ip地址,先用varchar存’, `params` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci COMMENT ’請求值’, `response` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci COMMENT ’返回值’, `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ’操作時間’, `create_user` int(11) DEFAULT NULL COMMENT ’操作人id’, `end_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT ’響應時間’, `status` int(1) NOT NULL DEFAULT ’1’ COMMENT ’響應結果1成功0失敗’, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=103 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT=’日志信息記錄表’;3.實體結構

@Table(catalog = 'zhiche', name = 'zc_log_notes')public class LogNotes { /** * 日志信息記錄表主鍵id */ private Integer id; /** * 操作記錄信息 */ private String notes; /** * 一級菜單 */ private String amenu; /** * 二級菜單 */ private String bmenu; /** * 操作人ip地址,先用varchar存 */ private String ip; /** * 請求參數記錄 */ private String params; /** * 返回結果記錄 */ private String response; /** * 操作時間 */ private Date createTime; /** * 操作人id */ private Integer createUser; /** * 響應時間 */ private Date endTime; /** * 響應結果1成功0失敗 */ private Integer status; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) public Integer getId() {return id; } public void setId(Integer id) {this.id = id; } public String getNotes() {return notes; } public void setNotes(String notes) {this.notes = notes; } public String getAmenu() {return amenu; } public void setAmenu(String amenu) {this.amenu = amenu; } public String getBmenu() {return bmenu; } public void setBmenu(String bmenu) {this.bmenu = bmenu; } public String getIp() {return ip; } public void setIp(String ip) {this.ip = ip; } public Date getCreateTime() {return createTime; } public void setCreateTime(Date createTime) {this.createTime = createTime; } public Integer getCreateUser() {return createUser; } public void setCreateUser(Integer createUser) {this.createUser = createUser; } public Date getEndTime() {return endTime; } public void setEndTime(Date endTime) {this.endTime = endTime; } public Integer getStatus() {return status; } public void setStatus(Integer status) {this.status = status; } public String getParams() {return params; } public void setParams(String params) {this.params = params; } public String getResponse() {return response; } public void setResponse(String response) { this.response = response; } public void setAppendResponse(String response){if (StringUtils.isNoneBlank(this.response)) { this.response = this.response + response;} else { this.response = response;} }}4.dao層和Service層省略..5.filter代碼1. RequestRecorderGlobalFilter 實現了GlobalFilter和Order

package com.zc.gateway.filter;import com.zc.entity.LogNotes;import com.zc.gateway.service.FilterService;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;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.DataBufferUtils;import org.springframework.http.HttpHeaders;import org.springframework.http.HttpMethod;import org.springframework.http.HttpStatus;import org.springframework.http.MediaType;import org.springframework.http.server.reactive.ServerHttpRequest;import org.springframework.http.server.reactive.ServerHttpResponse;import org.springframework.lang.Nullable;import org.springframework.stereotype.Component;import org.springframework.web.server.ServerWebExchange;import reactor.core.publisher.Flux;import reactor.core.publisher.Mono;import java.net.URI;import java.nio.CharBuffer;import java.nio.charset.Charset;import java.nio.charset.StandardCharsets;/** * @author qiwenshuai * @note 目前只記錄了request方式為POST請求的方式 * @since 19-5-16 17:29 by jdk 1.8 */@Componentpublic class RequestRecorderGlobalFilter implements GlobalFilter, Ordered { @Autowired FilterService filterService; private Logger logger = LoggerFactory.getLogger(RequestRecorderGlobalFilter.class); @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpRequest originalRequest = exchange.getRequest();URI originalRequestUrl = originalRequest.getURI();//只記錄http的請求String scheme = originalRequestUrl.getScheme();if ((!'http'.equals(scheme) && !'https'.equals(scheme))) { return chain.filter(exchange);}//這是我要打印的log-StringBuilderStringBuilder logbuilder = new StringBuilder();//我自己的log實體LogNotes logNotes = new LogNotes();// 返回解碼RecorderServerHttpResponseDecorator response = new RecorderServerHttpResponseDecorator(exchange.getResponse(), logNotes, filterService);//請求解碼RecorderServerHttpRequestDecorator recorderServerHttpRequestDecorator = new RecorderServerHttpRequestDecorator(exchange.getRequest());//增加過濾攔截吧ServerWebExchange ex = exchange.mutate().request(recorderServerHttpRequestDecorator).response(response).build();// 觀察者模式 打印一下請求log// 這里可以在 配置文件中我進行配置//if (logger.isDebugEnabled()) {response.beforeCommit(() -> Mono.defer(() -> printLog(logbuilder, response)));//}return recorderOriginalRequest(logbuilder, ex, logNotes).then(chain.filter(ex)).then(); } private Mono<Void> recorderOriginalRequest(StringBuilder logBuffer, ServerWebExchange exchange, LogNotes logNotes) {logBuffer.append(System.currentTimeMillis()).append('------------');ServerHttpRequest request = exchange.getRequest();Mono<Void> result = recorderRequest(request, logBuffer.append('n原始請求:n'), logNotes);try { filterService.addLog(logNotes);} catch (Exception e) { logger.error('保存請求參數出現錯誤, e->{}', e.getMessage());}return result; } /** * 記錄原始請求邏輯 */ private Mono<Void> recorderRequest(ServerHttpRequest request, StringBuilder logBuffer, LogNotes logNotes) {URI uri = request.getURI();HttpMethod method = request.getMethod();HttpHeaders headers = request.getHeaders();logNotes.setIp(headers.getHost().getHostString());logNotes.setAmenu('一級菜單');logNotes.setBmenu('二級菜單');logNotes.setNotes('操作記錄');logBuffer.append(method.toString()).append(’ ’).append(uri.toString()).append(’n’);logBuffer.append('------------請求頭------------n');headers.forEach((name, values) -> { values.forEach(value -> {logBuffer.append(name).append(':').append(value).append(’n’); });});Charset bodyCharset = null;if (hasBody(method)) { long length = headers.getContentLength(); if (length <= 0) {logBuffer.append('------------無body------------n'); } else {logBuffer.append('------------body 長度:').append(length).append(' contentType:');MediaType contentType = headers.getContentType();if (contentType == null) { logBuffer.append('null,不記錄body------------n');} else if (!shouldRecordBody(contentType)) { logBuffer.append(contentType.toString()).append(',不記錄body------------n');} else { bodyCharset = getMediaTypeCharset(contentType); logBuffer.append(contentType.toString()).append('------------n');} }}if (bodyCharset != null) { return doRecordReqBody(logBuffer, request.getBody(), bodyCharset, logNotes) .then(Mono.defer(() -> {logBuffer.append('n------------ end ------------nn');return Mono.empty(); }));} else { logBuffer.append('------------ end ------------nn'); return Mono.empty();} } //日志輸出返回值 private Mono<Void> printLog(StringBuilder logBuilder, ServerHttpResponse response) {HttpStatus statusCode = response.getStatusCode();assert statusCode != null;logBuilder.append('響應:').append(statusCode.value()).append(' ').append(statusCode.getReasonPhrase()).append(’n’);HttpHeaders headers = response.getHeaders();logBuilder.append('------------響應頭------------n');headers.forEach((name, values) -> { values.forEach(value -> {logBuilder.append(name).append(':').append(value).append(’n’); });});logBuilder.append('n------------ end at ').append(System.currentTimeMillis()).append('------------nn');logger.info(logBuilder.toString());return Mono.empty(); } // @Override public int getOrder() {//在GatewayFilter之前執行return -1; } private boolean hasBody(HttpMethod method) {//只記錄這3種謂詞的body//if (method == HttpMethod.POST || method == HttpMethod.PUT || method == HttpMethod.PATCH)return true;//return false; } //記錄簡單的常見的文本類型的request的body和response的body private boolean shouldRecordBody(MediaType contentType) {String type = contentType.getType();String subType = contentType.getSubtype();if ('application'.equals(type)) { return 'json'.equals(subType) || 'x-www-form-urlencoded'.equals(subType) || 'xml'.equals(subType) || 'atom+xml'.equals(subType) || 'rss+xml'.equals(subType);} else if ('text'.equals(type)) { return true;}//暫時不記錄formreturn false; } // 獲取請求的參數 private Mono<Void> doRecordReqBody(StringBuilder logBuffer, Flux<DataBuffer> body, Charset charset, LogNotes logNotes) {return DataBufferUtils.join(body).doOnNext(buffer -> { CharBuffer charBuffer = charset.decode(buffer.asByteBuffer()); //記錄我實體的請求體 logNotes.setParams(charBuffer.toString()); logBuffer.append(charBuffer.toString()); DataBufferUtils.release(buffer);}).then(); } private Charset getMediaTypeCharset(@Nullable MediaType mediaType) {if (mediaType != null && mediaType.getCharset() != null) { return mediaType.getCharset();} else { return StandardCharsets.UTF_8;} }}2.RecorderServerHttpRequestDecorator 繼承了ServerHttpRequestDecorator

package com.zc.gateway.filter;import com.zc.entity.LogNotes;import org.springframework.core.io.buffer.DataBuffer;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 java.util.LinkedList;import java.util.List;/** * @author qiwenshuai * @note * @since 19-5-16 17:30 by jdk 1.8 */// requestpublic class RecorderServerHttpRequestDecorator extends ServerHttpRequestDecorator { private final List<DataBuffer> dataBuffers = new LinkedList<>(); private boolean bufferCached = false; private Mono<Void> progress = null; public RecorderServerHttpRequestDecorator(ServerHttpRequest delegate) {super(delegate); }//重寫request請求體 @Override public Flux<DataBuffer> getBody() {synchronized (dataBuffers) { if (bufferCached)return copy(); if (progress == null) {progress = cache(); } return progress.thenMany(Flux.defer(this::copy));} } private Flux<DataBuffer> copy() {return Flux.fromIterable(dataBuffers).map(buf -> buf.factory().wrap(buf.asByteBuffer())); } private Mono<Void> cache() {return super.getBody().map(dataBuffers::add).then(Mono.defer(()-> { bufferCached = true; progress = null; return Mono.empty();})); }}3.RecorderServerHttpResponseDecorator 繼承了 ServerHttpResponseDecorator

package com.zc.gateway.filter;import com.zc.entity.LogNotes;import com.zc.gateway.service.FilterService;import org.reactivestreams.Publisher;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.core.io.buffer.DataBufferFactory;import org.springframework.core.io.buffer.DataBufferUtils;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 org.springframework.core.io.buffer.DataBuffer;import java.nio.charset.Charset;import java.util.LinkedList;import java.util.List;/** * @author qiwenshuai * @note * @since 19-5-16 17:32 by jdk 1.8 */public class RecorderServerHttpResponseDecorator extends ServerHttpResponseDecorator { private Logger logger = LoggerFactory.getLogger(RecorderServerHttpResponseDecorator.class); private LogNotes logNotes; private FilterService filterService; RecorderServerHttpResponseDecorator(ServerHttpResponse delegate, LogNotes logNotes, FilterService filterService) {super(delegate);this.logNotes = logNotes;this.filterService = filterService; } /** * 基于netty,我這里需要顯示的釋放一次dataBuffer,但是slice出來的byte是不需要釋放的, * 與下層共享一個字符串緩沖池,gateway過濾器使用的是nettyWrite類,會發生response數據多次才能返回完全。 * 在 ServerHttpResponseDecorator 之后會釋放掉另外一個refCount. */ @Override public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {DataBufferFactory bufferFactory = this.bufferFactory();if (body instanceof Flux) { Flux<? extends DataBuffer> fluxBody = (Flux<? extends DataBuffer>) body; Publisher<? extends DataBuffer> re = fluxBody.map(dataBuffer -> {// probably should reuse buffersbyte[] content = new byte[dataBuffer.readableByteCount()];// 數據讀入數組dataBuffer.read(content);// 釋放掉內存DataBufferUtils.release(dataBuffer);// 記錄返回值String s = new String(content, Charset.forName('UTF-8'));logNotes.setAppendResponse(s);try { filterService.updateLog(logNotes);} catch (Exception e) { logger.error('Response值修改日志記錄出現錯誤->{}', e);}byte[] uppedContent = new String(content, Charset.forName('UTF-8')).getBytes();return bufferFactory.wrap(uppedContent); }); return super.writeWith(re);}return super.writeWith(body); } @Override public Mono<Void> writeAndFlushWith(Publisher<? extends Publisher<? extends DataBuffer>> body) {return writeWith(Flux.from(body).flatMapSequential(p -> p)); }} 注意:

網關過濾返回值 底層用到了Netty服務,在response返回的時候,有時候會寫的數據是不全的,于是我在實體類中新增了一個setAppendResponse方法進行拼接, 再者,gateway的過濾器是鏈式結構,需要定義order排序為最先(-1),然后和預置的gateway過濾器做一個combine.

代碼中用到的 dataBuffer 結構,底層其實也是類似netty的byteBuffer,用到了字節數組池,同時也用到了 引用計數器 (refInt).

為了讓jvm在gc的時候垃圾得到回收,避免內存泄露,我們需要在轉換字節使用的地方,顯示的釋放一次

DataBufferUtils.release(dataBuffer);

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
主站蜘蛛池模板: 成人在线欧美 | 日本不卡高字幕在线2019 | 久久这里精品 | 黄色一级毛片免费 | 亚洲理论电影在线观看 | 久久三级视频 | 精品久久久久久久久久久 | 特级黄一级播放 | www.久久.com | 中文字幕在线视频免费播放 | 日韩中文字幕一区 | 婷婷激情五月 | 欧美一区二区三 | 欧美成人h版在线观看 | 国产午夜精品一区二区三区 | 日韩高清在线一区 | 国产精品看片 | 亚洲一区中文字幕永久在线 | 91精品国产日韩91久久久久久 | 国产精品毛片 | www国产成人免费观看视频,深夜成人网 | 一区二区三区精品视频 | 国产精品二区三区在线观看 | 国产精品一区二区三区在线播放 | 亚洲人成网站999久久久综合 | 亚洲国产精品一区二区久久 | 黄色永久网站 | 色一色视频 | 成人免费毛片高清视频 | 免费一二区 | 久久免费精品视频 | 亚洲欧美电影 | 人人干美女 | 色欧美综合 | 免费黄色在线 | 国产精品18hdxxxⅹ在线 | 欧美一区二 | 永久91嫩草亚洲精品人人 | 久久视频精品 | 亚洲视频精品在线 | 免费一区二区三区 | 国产激情视频 | 日韩另类 | 99国产精品久久久久久久成人热 | 国产精品精品久久久 | 最新av在线网址 | 7878www免费看片| 精品成人久久 | 福利社午夜影院 | 九九免费在线观看 | 9999国产精品 | 日韩在线观看中文字幕 | 最新中文字幕视频 | 日韩一区二区在线观看 | 国产精品美女久久久久久久久久久 | 欧美一区二区三区视频 | 一区自拍| 中文字幕一区二区三区免费视频 | 成人久久18| www.国产| www.操.com| 久久久久99 | 午夜成人在线视频 | 性色av一区二区三区 | 国产精品二区三区 | 亚洲 成人 av | 欧美日本韩国一区二区三区 | 亚洲男人的天堂在线观看 | 成人一级毛片 | www久久久| 人人草人人 | 国产激情久久久久久 | 亚洲欧洲视频在线 | 国产综合久久 | 欧美 日韩 | 亚洲一区中文字幕 | 男女小网站 | 欧美日韩国产精品一区 | 亚洲中国精品精华液 | 欧美高清视频一区二区三区 | 日韩中文字幕在线播放 | 国产在线一区二区 | www.色综合| 久久波多野结衣 | 在线观看免费成人av | 亚洲精品资源在线观看 | 美女毛片免费看 | 夜夜天天操 | 成av在线 | 免费黄色在线 | h小视频 | 黄色网址av | 国产拍拍拍拍拍拍拍拍拍拍拍拍拍 | 天堂av中文在线 | 巴西性猛交xxxx免费看久久久 | 成人黄色短视频在线观看 | 亚洲成人中文字幕 | 日摸夜操 | 亚洲这里只有精品 | 奇米亚洲午夜久久精品 | 日本综合色| 日韩在线视频精品 | 国产成人一区 | 国产精品久久久久久久久久久免费看 | 亚洲一区二区中文 | 不卡的一区二区 | 91在线看片 | 国产成人免费 | 欧美精品一区二区三区在线 | 欧美精品免费在线观看 | 中文在线亚洲 | 国产精品视屏 | 欧美激情在线播放 | 亚洲精品国产偷自在线观看 | 99久久精品免费看国产一区二区三区 | 国产欧美一区二区 | 成人亚洲精品久久久久软件 | 精品1区2区| 国产美女一区二区 | 日本久久久影视 | 亚洲国产午夜 | 一区二区视频 | 亚洲精品九九 | 黄色一级片视频播放 | 国产在线观看二区 | 久久综合狠狠综合久久综合88 | 久久精品1 | 中文字幕精品一区久久久久 | 久久久人成影片一区二区三区 | 久久久亚洲综合 | 黄色精品| 每日更新亚洲 | 91av免费在线观看 | 日韩成人在线视频 | 欧美国产精品一区二区 | 美女一级a毛片免费观看97 | 成人免费看 | 欧美最猛性xxxxx亚洲精品 | 人人干在线| 在线观看成人国产 | 免费成人在线网站 | 精品视频在线免费观看 | 99精品99| 免费av在线网 | 国产日产精品一区二区三区四区 | 色999国产 | 亚洲一区二区三区四区五区午夜 | 亚洲精品日韩精品 | 欧美成人高清 | www.国产欧美| 国产小视频在线观看 | 亚洲精品一二区 | 午夜精品在线观看 | 狠狠艹| 国产一区高清 | 亚洲男人的天堂网站 | 国产一区二区资源 | 高清视频一区 | 美女毛片免费看 | 欧美精品一区二区三区一线天视频 | www.久久久久久久 | 中文字幕毛片 | 伦理午夜电影免费观看 | 2018国产精品 | 亚洲精品乱码久久久久久久久 | 欧美激情亚洲 | 中文字幕第二十六页页 | 一区二区在线 | 免费一级欧美在线观看视频 | 欧美一级视频在线观看 | 国产三级视频 | 欧美日韩在线免费 | 福利社午夜影院 | 亚洲精品视频免费观看 | 黄色的视频免费 | 亚洲成人av在线播放 | www中文字幕 | 99九九久久| 久久一日本道色综合久久 | 国产免费久久 | 久久久国产视频 | av电影手机版| 欧美日韩成人在线视频 | 亚洲精品国产精品国自产 | 91久久久久久久久久久 | 99精品视频在线观看 | 2019天天干夜夜操 | 国产精品视频yy9299一区 | 成人免费观看49www在线观看 | 人人爱超碰 | 韩日一区 | 黄网站免费在线 | 成人不卡| 美女黄在线观看 | 九九热精品视频 | 精品无人乱码区1区2区3区 | 一区二区三区视频免费看 | 精品黄网 | 国产精品亚洲视频 | 国产真实乱全部视频 | 成人欧美一区二区三区在线观看 | 精品视频一区二区三区四区 | 欧美日韩在线观看中文字幕 | 精品久 | 高清国产一区二区三区四区五区 | 亚洲福利一区 | 日韩精品极品视频在线 | 热99这里只有精品 | 亚洲综合第一页 | av午夜电影| 另类视频在线 | 精品久久一区二区 | 福利网址 | 99日韩| 国产a区 | 国产日韩精品一区二区 | 日日夜夜精品 | 日韩av免费在线观看 | 久久久久国产 | 国产综合视频 | 精品久久中文字幕 | 美女久久久久 | 日本黄色三级网站 | 精品亚洲一区二区 | 亚洲 欧美 另类 综合 偷拍 | 欧美一区二区三区aa大片漫 | 久久久影视 | 久久精品成人 | www.成人 | 欧美视频免费在线 | 中文字幕第90页 | 91短视频版在线观看免费大全 | 碰在线视频 | 中文字幕亚洲一区二区三区 | 亚洲精品福利在线观看 | 伊人逼逼 | 国产成人在线免费观看视频 | 97久久精品人人做人人爽50路 | 成年无码av片在线 | 国产羞羞视频在线观看 | 日韩精品一二三区 | 日韩国产欧美一区 | 国产精品美女久久久久久久久久久 | 亚洲国产欧美91 | 午夜在线电影 | 一区二区三区av | 看全黄大色黄大片老人做 | 97超碰在线播放 | 亚洲成人伦理 | 一本一道久久精品综合 | 国产亚洲精品久久久456 | 国产午夜小视频 | 热久久免费视频 | 国产精品久久久久久久久免费丝袜 | 国产亚洲精品一区二区 | 亚洲艹| 在线永久免费观看日韩a | 日韩在线视频观看 | 国产精品久久久久久亚洲调教 | 日韩av免费在线播放 | 91久久精品久久国产性色也91 | 草草视频免费 | 91黄在线观看 | 国产欧美日韩综合精品一区二区 | 欧美专区在线观看 | 在线欧美亚洲 | 玖玖综合网 | 中文字字幕在线观看 | 国产精品自拍视频网站 | 狠狠操综合网 | 国产免费久久 | 九九re热| 成人午夜毛片 | 真人一级毛片 | 欧美精品乱码久久久久久按摩 | 在线看片日韩 | 亚洲欧美一区二区精品中文字幕 | 亚洲男人天堂网 | 婷婷激情五月 | 久操视频在线 | www天天干 | 亚洲国产精品久久 | 国产一级视频 | 在线日韩中文字幕 | 国产成人精品一区二区在线 | 很黄很色很爽的视频 | 午夜妇女aaaa区片 | 91在线视频免费观看 | 激情欧美一区二区三区中文字幕 | 三级av网站 | 国产一区二区三区四区 | 午夜激情视频 | 高清一区二区三区视频 | 一区二区三区自拍 | 国产精品久久久久一区二区三区共 | 国产精品国产成人国产三级 | 男女羞羞视频在线免费观看 | 夜夜爽99久久国产综合精品女不卡 | 国产目拍亚洲精品99久久精品 | 亚洲国产99| 日韩一区二区三区在线播放 | 国产麻豆乱码精品一区二区三区 | 色黄网站| 午夜性电影 | 4h影视| 成人日韩在线观看 | 999久久久国产精品 免费视频一区 | 品久久久久久久久久96高清 | 中文字幕日韩一区二区不卡 | 亚洲一区在线视频 | 成人在线视频免费观看 | 国产激情网站 | 99国产精品久久久 | 精品久久久久久久久久久久久久 | 久久国内精品 | 亚洲高清一区二区三区 | 精品美女在线观看视频在线观看 | 欧美视频在线免费 | 日韩成人影院 | 日韩欧美精品在线 | 91资源在线 | 高清av网站 | 福利网在线| 久久青青操| 欧美日韩在线精品 | 欧美激情一区二区三区在线视频 | 日韩视频一区二区三区在线观看 | 国产一区二区免费 | 免费在线成人网 | 亚洲视频在线观看网站 | 国产成人在线一区 | 中国大陆高清aⅴ毛片 | 一级做a爰片毛片 | 精品国产一区av | aaa在线| 99精品欧美一区二区三区综合在线 | 欧美精品中文字幕久久二区 | 毛片免费在线 | 日本一区二区三区中文字幕 | av成人在线观看 | 日本久久二区 | 欧美一级特黄aaaaaaa色戒 | 国产精品久久久久久久9999 | 天天久久| 国产精品久久久久9999赢消 | 成人av教育 | 99免费精品 | 精品国产一区二区三区久久久蜜月 | 欧美视频免费 | 国产精品99一区二区三区 | 极品女神高潮呻吟av久久 | 午夜国产羞羞视频免费网站 | 欧美 日韩 国产 一区 | 日本一区二区三区四区不卡视频 | 制服 丝袜 激情 欧洲 亚洲 | 亚洲精品一区二区三区四区高清 | 精品免费一区二区 | 免费国产在线视频 | 亚洲一区视频 | 欧美专区在线 | 亚洲国产精品视频 | 欧美一区2区三区4区公司二百 | 伊人久操 | 成年人黄色一级毛片 | 天天操天天碰 | 中文字幕日韩一区 | 久久亚洲一区 | 日穴视频在线观看 | 日韩欧美视频一区 | 国产精品视频一区二区免费不卡 | 国产极品探花 | 精品免费国产 | 亚洲一区二区在线免费观看 | 一级特黄 | 6080夜射猫| 亚洲精品一区二区三区樱花 | 国产精品久久久久免费a∨ 欧洲精品一区 | 亚洲精品一区在线观看 | 精品一区二区免费视频 | 一区二区三区视频免费看 | 精品96久久久久久中文字幕无 | 久久国产成人 | 在线干| 日韩爱爱免费视频 | 在线中文字幕第一页 | 日韩在线欧美 | 在线成人av| 中文字幕视频在线观看 | 毛片在线视频 | 亚洲综合在线播放 | 国产精品久久久久久久久 | 亚洲午夜性视频 | 欧美日韩精品久久久 | 国产野精品久久久久久久不卡 | 亚洲国产成人久久一区二区三区 | 在线观看日韩 | 国产一级黄色大片 | 国产在线观看免费 | 国产黄色免费视频 | 国产精品白浆 | 精品国产乱码久久久久久1区2区 | 国产精品久久久久久吹潮 | 亚洲欧美视频在线 | 日本成人小视频 | 91久色| 亚洲 中文 欧美 日韩 在线观看 | 久久国内精品 | 日韩午夜在线 | 日本天天操 | 午夜影院免费观看视频 | 亚洲欧美中文日韩v在线观看 | 日韩成人在线视频 | 日韩视频国产 | 亚洲精品一二三四五区 | 亚洲激情一区二区 | 国产一区日韩欧美 | 中文字幕在线观看av | 国产欧美日韩 | 色狠狠一区| 欧美香蕉| 亚洲国产精品区 | 羞羞在线观看视频免费观看hd | 二区视频 | 国产精品极品美女在线观看免费 | 麻豆av一区| 一区二区日韩 | 国产黄色在线观看 | 国产成人精品一区二区三区四区 | 中国大陆高清aⅴ毛片 | 成人一区视频 | 综合久久网 | 亚洲综合精品在线 | 色8久久 | 一级片国产 | 亚洲精品视频免费 | 日韩免费电影 | 欧美日韩在线播放 | 国产成人亚洲综合 | 天天操天天干天天 | 希岛爱理在线 | 91一区二区在线 | 天堂在线中文字幕 | 国产成人在线看 | 日韩一区二区精品 | 精品国产不卡一区二区三区 | 天天操天天曰 | 久久婷婷欧美 | 亚洲成人国产精品 | 在线观看中文字幕 | 中国特级毛片 | 久草精品视频在线播放 | 成人av网站在线观看 | 精品一区二区三区四区五区 | 久久伊人中文字幕 | 成人免费一区二区三区 | 一区视频在线 | 午夜久久| 一区二区三区在线观看视频 | 欧美日韩久久精品 | 国产精品999 | 国产xvideos免费视频播放 | 久久精品色欧美aⅴ一区二区 | 国产91久久精品一区二区 | 91九色porny首页最多播放 | 国产精品久久久99 | 免费观看电视在线高清视频 | 国产一区二区三区视频 | 大吊一区二区 | 国产黄色在线观看 | 久久99久久99精品免视看婷婷 | 国产一区二区三区精品久久久 | 欧美.com| 日韩欧美国产精品综合嫩v 国产高清av在线一区二区三区 | 久久少妇免费看 | 国产久 | www.国产.com| 国产福利视频 | 精品视频在线观看 | 久久一级| 久久精品国产99 | 欧美在线视频一区二区 | 香蕉成人啪国产精品视频综合网 | 欧美日本免费一区二区三区 | 久久久亚洲一区 | 欧美xxxx网站 | 成人av在线网 | 日韩欧美高清dvd碟片 | 亚洲综合成人网 | 天天看天天做 | 在线观看亚洲视频 | 在线成人av| 国产一区二区精品在线 | 国产一区二区视频在线播放 | 国产精自产拍久久久久久 | 国产精品九九久久99视频 | 午夜在线电影 | 亚洲网站在线观看 | 91精品中文字幕一区二区三区 | 欧美在线观看一区二区 | 女人夜夜春高潮爽av片 | 91久久久久久久久 | 在线观看国产视频 | 艹逼网 | 欧美一区二区久久 | 一区二区三区免费 | 国产欧美精品一区二区三区四区 | 亚洲精品视频在线免费播放 | 欧美日韩精 | 成人亚洲视频在线观看 | 久久精品一区二区三区四区 | 狠狠狠 | 精品在线一区二区 | 亚洲大尺度网站 | 影视一区二区 | 91视频网址 | 91极品国产 | 比利时xxxx性hd极品 | 天天干天天av | 国产一区二区三区免费在线观看 | 91久久精品日日躁夜夜躁国产 | 精品中文字幕一区二区三区 | 国产精品69久久久久水密桃 | 欧美一区二区三 | 一级h片 | 久在线视频 | 91九色porny首页最多播放 | 日韩精品99久久久久中文字幕 | 日韩午夜影院 | 色黄视频在线观看 | 久久久精品国产 | 综合一区 | 精品国产精品三级精品av网址 | 私人毛片免费高清视频 | 国产高清久久 | 亚洲精品三级 | 精品网站999www| 狠狠的日 | 在线观看理论电影 | 91成人短视频在线观看 | 区一区二区三在线观看 | 成人av免费在线观看 | 久久久婷 | 成人精品视频99在线观看免费 | 7799精品视频 | 亚洲视频一区在线播放 | 日韩精品在线观看免费 | 玖玖精品在线 | www.国产欧美 | 国产一区二区精品 | 日韩精品一区在线视频 | 亚洲一区二区三区免费 | 成人福利视频 | 欧美大片一区二区 | 久久国产视频精品 | 一区二区三区四区免费观看 | 色吊丝在线永久观看最新版本 | 成人免费在线观看 | 男女视频在线看 | 成人免费视屏 | 日本一区二区三区在线视频 | 韩国三级中文字幕hd久久精品 | 欧美日韩在线免费观看 | 国产真实精品久久二三区 | 这里有精品在线视频 | 亚洲天堂中文字幕 | 精品久久久久久久久久久久 | 成人黄色在线观看 | 免费福利网站 | 在线成人免费视频 | 精品日韩| 精品免费国产视频 | av网站在线免费观看 | 午夜一区二区三区 | 久久一 | h视频免费观看 | 伊人狠狠干 | 免费观看电视在线高清视频 | www,久久久| 久久精品国产精品亚洲 | 天天看天天做 | se69色成人网wwwsex | 色网站在线观看 | 国产一区二区视频在线播放 | 热99这里只有精品 | 亚洲综合在线视频 | 久久久久久久久一区二区三区 | 久久一级| 欧美一区第一页 | 吴梦梦到粉丝家实战华中在线观看 | 中文字幕精品一区久久久久 | 噜噜噜天天躁狠狠躁夜夜精品 | 成人在线视频免费 | 天天玩天天操天天射 | 久久久久久这里只有精品 | 精品国产一区二区三区久久久蜜月 | 91九色porny首页最多播放 | 亚洲电影一区二区 | 欧美久久久久久久久久久 | 日av一区 | 久久av一区二区三区亚洲 | 91免费版在线看 | avmans最新导航地址 | 亚洲福利影院 | 国产伦精品久久久一区二区三区 | 中文字幕一区在线观看视频 | 国产91网址 | 国产美女自拍视频 | 操久久| 国产综合亚洲精品一区二 | 在线观看国产 | av在线入口| 伊人春色在线播放 | 亚洲精品久久 | 精品一二三四区 | 久久久国产精品视频 |