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

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

Tomcat源碼解析之Web請求與處理

瀏覽:246日期:2023-03-19 16:50:58
目錄
  • 前言
  • 一、EndPoint
  • 二、ConnectionHandler
  • 三、Coyote
  • 四、容器責任鏈模式

前言

Tomcat最全UML類圖

Tomcat請求處理過程:

Connector對象創建的時候,會創建Http11NioProtocol的ProtocolHandler,在Connector的startInteral方法中,會啟動AbstractProtocol,AbstractProtocol啟動NioEndPoint進行監聽客戶端的請求,EndPoint接受到客戶端的請求之后,會交給Container去處理請求。請求從Engine開始經過的所有容器都含有責任鏈模式,每經過一個容器都會調用該容器的責任鏈對請求進行處理。

一、EndPoint

默認的EndPoint實現是NioEndPoint,NioEndPoint有四個內部類,分別是Poller、Acceptor、PollerEvent、SocketProcessor、NioSocketWrapper。

(1)Acceptor負責監聽用戶的請求,監聽到用戶請求之后,調用getPoller0().register(channel);先將當前請求封裝成PollerEvent,new PollerEvent(socket, ka, OP_REGISTER); 將當前請求,封裝成注冊事件,并添加到PollerEvent隊列中,然后將PollerEvent注冊到Poller的Selector對象上面。

(2)Poller線程會一直遍歷可以處理的事件(netty的selestor),當找到需要處理的事件之后,調用processKey(sk, socketWrapper);對,執行要處理的PollerEvent的run方法,對請求進行處理。

(3)PollerEvent繼承自Runnable接口,在其run方法里面,如果是PollerEvent的事件是注冊OP_REGISTER,那么就將當前的socket注冊到Poller的selector上。

 public void run() {    if (interestOps == OP_REGISTER) {try {	// 核心代碼,終于找到了!!!!!    // 當事件是注冊的時候,將當前的NioSocketChannel注冊到Poller的Selector上。    socket.getIOChannel().register(    socket.getPoller().getSelector(), SelectionKey.OP_READ, socketWrapper);} catch (Exception x) {    log.error(sm.getString("endpoint.nio.registerFail"), x);}    } else {final SelectionKey key = socket.getIOChannel().keyFor(socket.getPoller().getSelector());try {    if (key == null) {// The key was cancelled (e.g. due to socket closure)// and removed from the selector while it was being// processed. Count down the connections at this point// since it won"t have been counted down when the socket// closed.// SelectionKey被取消的時候需要將SelectionKey對應的EndPoint的Connection計數器,減一socket.socketWrapper.getEndpoint().countDownConnection();((NioSocketWrapper) socket.socketWrapper).closed = true;    } else {final NioSocketWrapper socketWrapper = (NioSocketWrapper) key.attachment();if (socketWrapper != null) {    //we are registering the key to start with, reset the fairness counter.    int ops = key.interestOps() | interestOps;    socketWrapper.interestOps(ops);    key.interestOps(ops);} else {    socket.getPoller().cancelledKey(key);}    }} catch (CancelledKeyException ckx) {    try {socket.getPoller().cancelledKey(key);    } catch (Exception ignore) {    }}    }}

(4)Poller線程內會執行keyCount = selector.select(selectorTimeout);獲取當前需要處理的SelectionKey的數量,然后當keyCount大于0時,會獲取selector的迭代器,遍歷所有需要的selectionkey,并對其進行處理。在這里將socket的事件封裝成NioSocketWrapper。

// 得到selectedKeys的迭代器Iterator<SelectionKey> iterator = keyCount > 0 ? selector.selectedKeys().iterator() : null; // 遍歷所有的SelectionKey,并對其進行處理 while (iterator != null && iterator.hasNext()) {     SelectionKey sk = iterator.next();     iterator.remove();     NioSocketWrapper socketWrapper = (NioSocketWrapper) sk.attachment();     // Attachment may be null if another thread has called     // cancelledKey()     // 如果有attachment,就處理     if (socketWrapper != null) { // 處理事件 processKey(sk, socketWrapper);     } }

processKey在處理SelectionKey,如果當前Poller已經關閉,就取消key。SelectionKey對應的Channel如果發生讀事件,就調用AbatractEndPoint.processSocket執行讀操作processSocket(attachment, SocketEvent.OPEN_READ, true),如果SelectionKey對應的Channel發生寫事件,就執行processSocket(attachment, SocketEvent.OPEN_WRITE, true);讀大于寫。socket的事件處理調用的是AbatractEndPoint的processSocket方法。

protected void processKey(SelectionKey sk, NioSocketWrapper attachment) {	     try {	 if (close) {	     // 如果Poller已經關閉了,就取消key	     cancelledKey(sk);	 } else if (sk.isValid() && attachment != null) {	     if (sk.isReadable() || sk.isWritable()) {	 if (attachment.getSendfileData() != null) {	     processSendfile(sk, attachment, false);	 } else {	     unreg(sk, attachment, sk.readyOps());	     boolean closeSocket = false;	     // Read goes before write	     // 讀優于寫	     // 如果SelectionKey對應的Channel已經準備好了讀	     // 就對NioSocketWrapper進行讀操作	     if (sk.isReadable()) {	 if (!processSocket(attachment, SocketEvent.OPEN_READ, true)) {	     closeSocket = true;	 }	     }	     // 如果SelectionKey對應的Channel已經準備好了寫	     // 就對NioSocketWrapper進行寫操作	     if (!closeSocket && sk.isWritable()) {	 if (!processSocket(attachment, SocketEvent.OPEN_WRITE, true)) {	     closeSocket = true;	 }	     }	     if (closeSocket) {	 // 如果已經關閉了,就取消key	 cancelledKey(sk);	     }	 }	     }	     }

AbatractEndPoint.processSocket方法首先從緩存中獲取SocketProcessor類,如果緩存中沒有就創建一個,SocketProcessorBase接口對應的就是NioEndPoint.SocketProcessor,也就是Worker。將對應的SocketProcessor類放入到線程池中執行。

 public boolean processSocket(SocketWrapperBase<S> socketWrapper, SocketEvent event, boolean dispatch) {	// 得到socket的處理器	// Connector在構造函數里面已經指定了協議:org.apache.coyote.http11.Http11NioProtocol。	SocketProcessorBase<S> sc = processorCache.pop();	if (sc == null) {	// 如果沒有,就創建一個Socket的處理器。創建的時候指定socketWrapper以及socket的事件。	    sc = createSocketProcessor(socketWrapper, event);	} else {	    sc.reset(socketWrapper, event);	}	//socket的處理交給了線程池去處理。	Executor executor = getExecutor();	if (dispatch && executor != null) {	    executor.execute(sc);	} else {	    sc.run();	}

(5)NioEndPoint.NioSocketWrapper,是Socket的封裝類,增強類,將Socket與其他對象建立關聯。

 public static class NioSocketWrapper extends SocketWrapperBase<NioChannel> { 		private final NioSelectorPool pool;private Poller poller = null; // 輪詢的Poller private int interestOps = 0;private CountDownLatch readLatch = null;private CountDownLatch writeLatch = null;private volatile SendfileData sendfileData = null;private volatile long lastRead = System.currentTimeMillis();private volatile long lastWrite = lastRead;private volatile boolean closed = false;

(6)NioEndPoint.SocketProcessor(Worker)繼承了Runnable接口,負責對socket的g各種事件進行處理。讀事件、寫事件、停止時間、超時事件、斷連事件、錯誤時間、連接失敗事件。

SocketProcessor的doRun方法,會根據SocketState進行處理,SocketState 為STOP、DISCONNECT或者ERROR的時候就進行關閉,SocketWrapperBase對應的selector事件,得到指定的Handler處理器進行處理。

@Override protected void doRun() {     NioChannel socket = socketWrapper.getSocket();     SelectionKey key = socket.getIOChannel().keyFor(socket.getPoller().getSelector());     try { int handshake = -1; try {     if (key != null) { if (socket.isHandshakeComplete()) {     // 是否已經握手成功,不需要TLS(加密)握手,就讓處理器對socket和event的組合進行處理。     handshake = 0; } else if (event == SocketEvent.STOP || event == SocketEvent.DISCONNECT || event == SocketEvent.ERROR) {     // 不能夠完成TLS握手,就把他認為是TLS握手失敗。     handshake = -1; } else {     handshake = socket.handshake(key.isReadable(), key.isWritable());     // The handshake process reads/writes from/to the     // socket. status may therefore be OPEN_WRITE once     // the handshake completes. However, the handshake     // happens when the socket is opened so the status     // must always be OPEN_READ after it completes. It     // is OK to always set this as it is only used if     // the handshake completes.     // 握手從/向socket讀/寫時,握手一旦完成狀態應該為OPEN_WRITE,     // 握手是在套接字打開時發生的,因此在完成后狀態必須始終為OPEN_READ     // 始終設置此選項是可以的,因為它僅在握手完成時使用。     event = SocketEvent.OPEN_READ; }     } } catch (IOException x) {     handshake = -1;     if (log.isDebugEnabled()) log.debug("Error during SSL handshake", x); } catch (CancelledKeyException ckx) {     handshake = -1; } if (handshake == 0) {     SocketState state = SocketState.OPEN;     // Process the request from this socket     if (event == null) { // 調用處理器進行處理。 // NioEndPoint的默認Handler是Http11的 // 這里的Handler是AbstractProtocol.ConnectionHandler // 這個Handler的設置方法是: // 首先在Connector類的構造函數中,將默認的ProtocolHandler設置為org.apache.coyote.http11.Http11NioProtocol // AbstractHttp11Protocol的構造函數里面創建了Handler類ConnectionHandler state = getHandler().process(socketWrapper, SocketEvent.OPEN_READ);     } else { state = getHandler().process(socketWrapper, event);     }     // 如果返回的狀態是SocketState,那么就關掉連接     if (state == SocketState.CLOSED) { close(socket, key);     } } else if (handshake == -1) {     getHandler().process(socketWrapper, SocketEvent.CONNECT_FAIL);     close(socket, key); } else if (handshake == SelectionKey.OP_READ) {     // 如果是SelectionKey.OP_READ,也就是讀事件的話,就將OP_READ時間設置到socketWrapper     socketWrapper.registerReadInterest(); } else if (handshake == SelectionKey.OP_WRITE) {     // 如果是SelectionKey.OP_WRITE,也就是讀事件的話,就將OP_WRITE事件設置到socketWrapper     socketWrapper.registerWriteInterest(); }

二、ConnectionHandler

(1)ConnectionHandler用于根據Socket連接找到相應的Engine處理器。

上面是SocketProcessor的doRun方法,執行了getHandler().process(socketWrapper, SocketEvent.OPEN_READ);;process方法是首先在Map緩存中查找當前socket是否存在對應的processor,如果不存在,再去可循環的處理器棧中查找是否存在,如果不存在就創建相應的Processor,然后將新創建的Processor與Socket建立映射,存在connection的Map中。在任何一個階段得到Processor對象之后,會執行processor的process方法state = processor.process(wrapper, status);

protected static class ConnectionHandler<S> implements AbstractEndpoint.Handler<S> {private final AbstractProtocol<S> proto;private final RequestGroupInfo global = new RequestGroupInfo();private final AtomicLong registerCount = new AtomicLong(0);// 終于找到了這個集合,給Socket和處理器建立連接// 對每個有效鏈接都會緩存進這里,用于連接選擇一個合適的Processor實現以進行請求處理。private final Map<S, Processor> connections = new ConcurrentHashMap<>();// 可循環的處理器棧private final RecycledProcessors recycledProcessors = new RecycledProcessors(this);		  		@Overridepublic SocketState process(SocketWrapperBase<S> wrapper, SocketEvent status) {    if (getLog().isDebugEnabled()) {getLog().debug(sm.getString("abstractConnectionHandler.process",wrapper.getSocket(), status));    }    if (wrapper == null) {// wrapper == null 表示Socket已經被關閉了,所以不需要做任何操作。return SocketState.CLOSED;    }    // 得到wrapper內的Socket對象    S socket = wrapper.getSocket();    // 從Map緩沖區中得到socket對應的處理器。    Processor processor = connections.get(socket);    if (getLog().isDebugEnabled()) {getLog().debug(sm.getString("abstractConnectionHandler.connectionsGet",processor, socket));    }    // Timeouts are calculated on a dedicated thread and then    // dispatched. Because of delays in the dispatch process, the    // timeout may no longer be required. Check here and avoid    // unnecessary processing.    // 超時是在專用線程上計算的,然后被調度。    // 因為調度過程中的延遲,可能不再需要超時。檢查這里,避免不必要的處理。    if (SocketEvent.TIMEOUT == status &&    (processor == null ||    !processor.isAsync() && !processor.isUpgrade() ||    processor.isAsync() && !processor.checkAsyncTimeoutGeneration())) {// This is effectively a NO-OPreturn SocketState.OPEN;    }    // 如果Map緩存存在該socket相關的處理器    if (processor != null) {// Make sure an async timeout doesn"t fire// 確保沒有觸發異步超時getProtocol().removeWaitingProcessor(processor);    } else if (status == SocketEvent.DISCONNECT || status == SocketEvent.ERROR) {// Nothing to do. Endpoint requested a close and there is no// longer a processor associated with this socket.// SocketEvent事件是關閉,或者SocketEvent時間出錯,此時不需要做任何操作。// Endpoint需要一個CLOSED的信號,并且這里不再有與這個socket有關聯了return SocketState.CLOSED;    }    ContainerThreadMarker.set();    try {// Map緩存不存在該socket相關的處理器if (processor == null) {    String negotiatedProtocol = wrapper.getNegotiatedProtocol();    // OpenSSL typically returns null whereas JSSE typically    // returns "" when no protocol is negotiated    // OpenSSL通常返回null,而JSSE通常在沒有協議協商時返回""    if (negotiatedProtocol != null && negotiatedProtocol.length() > 0) {// 獲取協商協議UpgradeProtocol upgradeProtocol = getProtocol().getNegotiatedProtocol(negotiatedProtocol);if (upgradeProtocol != null) {    // 升級協議為空    processor = upgradeProtocol.getProcessor(wrapper, getProtocol().getAdapter());    if (getLog().isDebugEnabled()) {getLog().debug(sm.getString("abstractConnectionHandler.processorCreate", processor));    }} else if (negotiatedProtocol.equals("http/1.1")) {    // Explicitly negotiated the default protocol.    // Obtain a processor below.} else {    // TODO:    // OpenSSL 1.0.2"s ALPN callback doesn"t support    // failing the handshake with an error if no    // protocol can be negotiated. Therefore, we need to    // fail the connection here. Once this is fixed,    // replace the code below with the commented out    // block.    if (getLog().isDebugEnabled()) {getLog().debug(sm.getString("abstractConnectionHandler.negotiatedProcessor.fail",negotiatedProtocol));    }    return SocketState.CLOSED;    /*     * To replace the code above once OpenSSL 1.1.0 is     * used.    // Failed to create processor. This is a bug.    throw new IllegalStateException(sm.getString(    "abstractConnectionHandler.negotiatedProcessor.fail",    negotiatedProtocol));    */}    }}// 經過上面的操作,processor還是null的話。if (processor == null) {    // 從recycledProcessors可循環processors中獲取processor    processor = recycledProcessors.pop();    if (getLog().isDebugEnabled()) {getLog().debug(sm.getString("abstractConnectionHandler.processorPop", processor));    }}if (processor == null) {    // 創建處理器    processor = getProtocol().createProcessor();    register(processor);    if (getLog().isDebugEnabled()) {getLog().debug(sm.getString("abstractConnectionHandler.processorCreate", processor));    }}processor.setSslSupport(wrapper.getSslSupport(getProtocol().getClientCertProvider()));// 將socket和processor建立關聯。connections.put(socket, processor);SocketState state = SocketState.CLOSED;do {    // 調用processor的process方法。    state = processor.process(wrapper, status);    // processor的process方法返回升級狀態    if (state == SocketState.UPGRADING) {// Get the HTTP upgrade handler// 得到HTTP的升級句柄UpgradeToken upgradeToken = processor.getUpgradeToken();// Retrieve leftover input// 檢索剩余輸入ByteBuffer leftOverInput = processor.getLeftoverInput();if (upgradeToken == null) {    // Assume direct HTTP/2 connection    UpgradeProtocol upgradeProtocol = getProtocol().getUpgradeProtocol("h2c");    if (upgradeProtocol != null) {// Release the Http11 processor to be re-usedrelease(processor);// Create the upgrade processorprocessor = upgradeProtocol.getProcessor(wrapper, getProtocol().getAdapter());wrapper.unRead(leftOverInput);// Associate with the processor with the connectionconnections.put(socket, processor);    } else {if (getLog().isDebugEnabled()) {    getLog().debug(sm.getString(    "abstractConnectionHandler.negotiatedProcessor.fail",    "h2c"));}// Exit loop and trigger appropriate clean-upstate = SocketState.CLOSED;    }} else {    HttpUpgradeHandler httpUpgradeHandler = upgradeToken.getHttpUpgradeHandler();    // Release the Http11 processor to be re-used    release(processor);    // Create the upgrade processor    processor = getProtocol().createUpgradeProcessor(wrapper, upgradeToken);    if (getLog().isDebugEnabled()) {getLog().debug(sm.getString("abstractConnectionHandler.upgradeCreate",processor, wrapper));    }    wrapper.unRead(leftOverInput);    // Associate with the processor with the connection    connections.put(socket, processor);    // Initialise the upgrade handler (which may trigger    // some IO using the new protocol which is why the lines    // above are necessary)    // This cast should be safe. If it fails the error    // handling for the surrounding try/catch will deal with    // it.    if (upgradeToken.getInstanceManager() == null) {httpUpgradeHandler.init((WebConnection) processor);    } else {ClassLoader oldCL = upgradeToken.getContextBind().bind(false, null);try {    httpUpgradeHandler.init((WebConnection) processor);} finally {    upgradeToken.getContextBind().unbind(false, oldCL);}    }}    }} while (state == SocketState.UPGRADING);	

(2)以Http11協議為例,執行的是Http11Processor,Http11Processor的祖父類AbstractProcessorLight實現了process方法,process調用了service模板方法,service模板方法是由Http11Processor進行實現的。service方法最重要的操作是執行getAdapter().service(request, response);

@Override    public SocketState service(SocketWrapperBase<?> socketWrapper)    throws IOException {		// 上面省略n行		// 調用Coyote的service方法		 getAdapter().service(request, response);		 // 下面省略n行

三、Coyote

回顧一下CoyoteAdapter的創建是在Connector的initInternal方法。

@Override    public SocketState service(SocketWrapperBase<?> socketWrapper)    throws IOException {		// 上面省略n行		// 調用Coyote的service方法		 getAdapter().service(request, response);		 // 下面省略n行

Coyote的作用就是coyote.Request和coyote.Rsponse轉成HttpServletRequest和HttpServletRsponse。然后,因為Connector在init的時候,將自己注入到了CoyoteAdapter中,所以,直接通過connector.getService()方法就可以拿到Service,然后從Service開始調用責任鏈模式,進行處理。

@Override    public SocketState service(SocketWrapperBase<?> socketWrapper)    throws IOException {		// 上面省略n行		// 調用Coyote的service方法		 getAdapter().service(request, response);		 // 下面省略n行

四、容器責任鏈模式

接下來就是從StandradEngine開始的責任鏈模式。首先執行StandradEngine的責任鏈模式,找到合適的Engine,合適的Engine在通過責任鏈模式找到合適的Context,直到找到StandardWrapperValve。最后執行到StandardWrapperValve的invoke方法。首先查看Context和Wrapper是不是不可用了,如果可用,并且Servelt還沒有被初始化,就執行初始化操作。如果是單線程模式就直接返回之前創建好的Servelt,如果是多線程模式,就先創建一個Servelt對象進行返回。

@Override    public final void invoke(Request request, Response response)    throws IOException, ServletException {// 初始化我們需要的本地變量boolean unavailable = false;Throwable throwable = null;// This should be a Request attribute...long t1 = System.currentTimeMillis();// 原子類AtomicInteger,CAS操作,表示請求的數量。requestCount.incrementAndGet();StandardWrapper wrapper = (StandardWrapper) getContainer();Servlet servlet = null;Context context = (Context) wrapper.getParent();// 檢查當前的Context應用是否已經被標注為不可以使用if (!context.getState().isAvailable()) {    // 如果當前應用不可以使用的話,就報503錯誤。    response.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE,    sm.getString("standardContext.isUnavailable"));    unavailable = true;}// 檢查Servelt是否被標記為不可使用if (!unavailable && wrapper.isUnavailable()) {    container.getLogger().info(sm.getString("standardWrapper.isUnavailable",    wrapper.getName()));    long available = wrapper.getAvailable();    if ((available > 0L) && (available < Long.MAX_VALUE)) {response.setDateHeader("Retry-After", available);response.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE,sm.getString("standardWrapper.isUnavailable",wrapper.getName()));    } else if (available == Long.MAX_VALUE) {response.sendError(HttpServletResponse.SC_NOT_FOUND,sm.getString("standardWrapper.notFound",wrapper.getName()));    }    unavailable = true;}// Servelt是第一次調用的時候初始化try {    if (!unavailable) {// 如果此時Servelt還沒有被初始化,就分配一個Servelt實例來處理request請求。servlet = wrapper.allocate();    }/// 省略代碼..........................................// // 給該request創建Filter過濾鏈。Filter過濾鏈執行完之后,會執行ServeltApplicationFilterChain filterChain =ApplicationFilterFactory.createFilterChain(request, wrapper, servlet);// Call the filter chain for this request// NOTE: This also calls the servlet"s service() methodtry {    if ((servlet != null) && (filterChain != null)) {// Swallow output if neededif (context.getSwallowOutput()) {    try {SystemLogHandler.startCapture();if (request.isAsyncDispatching()) {    request.getAsyncContextInternal().doInternalDispatch();} else {    // 調用過濾鏈    filterChain.doFilter(request.getRequest(),    response.getResponse());}/// 省略代碼..........................................

到此這篇關于Tomcat源碼解析之Web請求與處理的文章就介紹到這了,更多相關Tomcat的Web請求與處理內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

標簽: Tomcat
主站蜘蛛池模板: 中文字幕爱爱视频 | 91一区二区| 亚洲视频一区二区三区 | 国产精品高潮呻吟 | 日韩视频中文字幕 | 久久三级视频 | 亚洲视频在线看 | 日韩毛片免费视频一级特黄 | 日韩aaa久久蜜桃av | 91久久久久久久久 | a中文在线| 精品视频在线播放 | 国产精品久久久久久久久久久新郎 | 国产又粗又长又硬又猛电影 | 99久久99热这里只有精品 | 国产乱码精品一区二区三区忘忧草 | 欧美大片一区二区 | 精品毛片 | 国产精品国产三级国产aⅴ中文 | 精品久久久久久国产 | 久久国产亚洲精品 | 成年人在线看 | 欧美电影一区 | 九九99久久 | 成年人精品视频 | 黄频免费在线观看 | 国产999精品久久久影片官网 | 精品视频在线观看一区二区三区 | 欧美一区不卡 | 亚洲成人1区 | 国产一区www| 欧美精品国产精品 | 免费视频一区二区三区在线观看 | 国产欧美日韩综合精品一 | 国产精品一二三区 | 操人在线观看 | 在线一区二区三区 | 日韩激情综合网 | 久久久久一区 | 午夜视频在线观看网站 | 91爱爱| 精品影院 | 在线看欧美 | 日韩中文字幕欧美 | 精品久久久久一区二区三区 | 欧美另类一二三四 | 嫩草影院地址 | 特级丰满少妇一级aaaa爱毛片 | 国产精品一区二 | 亚洲精品国产乱码在线看蜜月 | 日本精品免费在线观看 | 欧美午夜视频 | 亚洲欧洲精品一区二区 | h片在线看 | 亚洲免费一区 | 夜夜夜操操操 | 亚洲国产精品99久久久久久久久 | 中文字幕在线免费看 | 成人高清网站 | 国产高清在线精品一区二区三区 | 国产精品久久久久一区二区三区 | 国产一区二区三区久久久 | 国产一级视频在线观看 | 五月婷婷激情 | www.国产| 四虎影院免费网址 | 欧美视频一区二区三区在线观看 | 久久久久久久一区二区三区 | 日韩成人精品 | 人人人人澡 | 久久久久av | 亚洲成人三区 | 亚洲国产精品成人无久久精品 | 欧美日韩高清在线一区 | 久久精品影片 | 日本天天操 | 欧美国产视频一区 | 免费一区在线 | 国产精品一区二区在线 | 国产成人在线一区 | 欧美性大战久久久久久久蜜臀 | 久久草视频 | 青青久草在线 | 国产小视频在线观看 | 日韩欧美一级精品久久 | 97伦理电影网 | 91免费视频观看 | 亚洲国产精品成人 | 婷婷五综合 | 日本不卡一区 | 日韩精品无码一区二区三区 | 国内久久 | 国产韩国精品一区二区三区 | 91精品国产综合久久久久久丝袜 | 青草青草久热精品视频在线观看 | 国产欧美精品 | 久久91精品 | 免费一区二区三区 | 久久久久久网址 | 中文字幕在线观看www | 欧美日韩国产在线看 | 一区二区日本 | 国产激情 | 中国大陆高清aⅴ毛片 | 大陆一级毛片免费视频观看 | 一区二区三区免费在线 | 天堂成人国产精品一区 | 国产一区二区三区在线免费观看 | 农村末发育av片四区五区 | 日韩一二三区 | 久久久精品一区二区三区 | 日韩三级在线 | 在线观看日韩 | 日精品| 天堂资源库 | 亚洲高清视频一区二区 | 在线观看亚洲视频 | 羞羞视频免费网站 | 亚洲性在线 | 国产精品一区在线观看 | 亚洲人成网亚洲欧洲无码 | 一级视频网站 | 成人国产精品免费观看 | 亚洲午夜av | 亚洲国产高清高潮精品美女 | 日本精品在线播放 | 一区二区三区自拍 | 在线播放国产精品 | a级毛片免费高清视频 | 久久久精品 | 亚洲天堂成人 | 中文字幕日韩一区二区不卡 | 四虎影视免费在线观看 | 伊人网av| 日日做夜夜爱 | 99精品国产高清在线观看 | 成人久久久 | 亚洲色图p| 婷婷精品视频 | 伊人青青久久 | 成人免费福利 | 五月激情婷婷六月 | 国产一级特黄 | 国产成人精品久久二区二区 | 日韩性欧美 | 欧美 日韩 在线播放 | 国产中文区二幕区2012 | 国产精品二区三区在线观看 | 亚洲视频1区 | 天天噜天天干 | 五月天婷婷国产精品 | 日日摸天天爽天天爽视频 | 麻豆91在线观看 | 久久久久久久国产 | 亚洲一区二区在线视频 | 亚洲日韩中文字幕一区 | 国产三级精品三级 | 福利视频一区二区 | 日韩成人视屏 | а√天堂中文在线资源8 | 午夜精品久久久久久久 | 欧美激情一区二区三区四区 | 国产精品原创av片国产免费 | 奇米影| 亚洲电影在线观看 | jizz在亚洲 | 日韩精品一区二区在线观看视频 | 成人欧美一区二区三区白人 | 亚洲欧美第一页 | 日本理伦片午夜理伦片 | 色免费视频| 中文字幕在线精品 | 日本视频在线 | 91精品国产乱码久久久久久久久 | 欧美一级在线观看 | 午夜影院黄色 | 日日人人 | 四虎视频| 日韩成人av网站 | 不卡在线 | 成人av播放 | 国产日韩欧美一区 | 久久亚洲综合 | 亚洲这里只有精品 | 国产精品观看 | 国产不卡视频 | 午夜视频在线观看网站 | 国产精品毛片一区二区在线看 | 国产麻豆乱码精品一区二区三区 | 中文字幕日韩一区二区不卡 | the蜜臀av入口 | а天堂中文最新一区二区三区 | 精品中文字幕在线观看 | 九九精品在线 | 91亚洲高清 | 日韩av在线中文字幕 | www.一区 | av网站在线免费观看 | 亚洲精品一区在线观看 | av在线国产精品 | 中文字幕国产视频 | 国产干干干 | 一区二区三区四区国产 | 日韩中文字幕免费观看 | 97热在线 | 国产成人精品一区二区三区四区 | 91在线精品秘密一区二区 | 久久国产精品无码网站 | 亚洲成人一区 | 亚洲一区在线日韩在线深爱 | 三级在线观看 | 精品国产不卡一区二区三区 | 日韩中文字幕av | 成人一区在线观看 | 黄色一级视 | 一级免费视频 | 91在线精品一区二区 | 网址av| 综合久久综合久久 | 中文字幕7777| 国产一区 | 日韩欧美在线免费观看 | 精品免费国产一区二区三区四区 | 韩国av一区二区 | 蜜桃精品久久久久久久免费影院 | 亚洲精品一区二区在线 | 午夜精品久久久久久久男人的天堂 | 百性阁综合另类 | 日韩在线观看第一页 | 狠狠躁夜夜躁人人爽视频 | 97久久久| 欧美xxxx片 | 亚洲日本乱码一区两区在线观看 | 色综合久久久久久久久久久 | 欧美一区二区另类 | 青草视频在线免费观看 | 中文字幕免费看 | 国产综合精品视频 | 精品久久久久久久久久久久 | 日本欧美国产 | 日韩欧美在线看 | 亚洲美女视频一区二区三区 | 天天干人人 | 国产精品久久九九 | 亚洲精品免费在线观看 | www.亚洲一区二区 | 久久久久久久一区 | 日韩久久成人 | 日韩中文字幕 | 久久久综合视频 | 欧美一区永久视频免费观看 | 久久99精品久久久久久青青日本 | 久久人人爽人人爽人人片av不 | 91免费看片 | 国产精品免费视频观看 | 久久精品久久久久久久久久久久久 | 日韩中文字幕在线 | 福利91| 影音先锋中文字幕一区 | 国产高清精品一区 | 在线观看日韩 | 欧美精品一二三区 | 中文字幕精品一区二区三区精品 | 国产精品免费一区二区 | 成人福利视频 | www视频在线观看 | 奇米影视首页 | 在线观看国产视频 | 久久一区视频 | 亚洲视频一区二区 | 精品久久久一区 | 真实国产露脸乱 | 中文字幕 国产精品 | 影音先锋中文字幕在线 | 91视频电影 | 狠狠综合| 国产成人午夜精品影院游乐网 | 色欧美综合 | 国产精品久久久久久久久免费丝袜 | 久久久国产日韩 | 欧美福利在线 | 第一色网站 | 精品成人 | 中国大陆高清aⅴ毛片 | a欧美| 99re视频精品 | 在线国产一区 | 日日干天天操 | 亚洲永久免费 | 精品乱子伦一区二区三区 | av片在线观看 | 国产日韩精品视频 | 国产婷婷 | 国产亚洲一区二区三区 | 精品国产99 | 亚洲在线成人 | 91偷拍精品一区二区三区 | 成人一区二区在线 | 91精品国产综合久久福利软件 | 欧美一区2区三区4区公司二百 | 国产精品视屏 | 91精品久久 | 精品国产乱码一区二区三 | 在线播放中文字幕 | 久久e久久| www中文字幕在线观看 | 亚洲欧美综合精品久久成人 | 久久av网| 亚洲综合二区 | 精品久久久久久久久久 | 成人福利影院 | 国产精品久久久久久久久久久不卡 | 日本一区二区电影 | 成人18视频在线观看 | 亚洲高清精品视频 | 一级黄色影视 | 日本在线视 | 欧美一级在线观看 | 国产片av| 综合一区 | 狠狠综合久久av一区二区小说 | 国产高清av在线一区二区三区 | 日韩午夜场 | 国产亚洲欧美一区二区三区 | 一区二区av | 国产成人久久精品麻豆二区 | 精品国产一区二区三区av片 | 欧美在线视频三区 | 日韩亚洲一区二区 | 一区二区三区国产视频 | t66y最新地址一地址二69 | 亚洲国产精品综合久久久 | 亚洲人成在线播放 | 色偷偷噜噜噜亚洲男人 | 欧洲精品乱码久久久久蜜桃 | 免费观看的黄色 | 亚洲看片网站 | 精品国产一区二区在线 | 免费毛片一区二区三区久久久 | 天堂久久爱资源站www | 一级毛片网 | www.成人 | 国内精品视频一区二区三区八戒 | 香蕉二区| 亚洲wu码| 国产精品第一区 | 亚洲视频久久久 | 国产美女一区二区 | 一级黄色影片在线观看 | 国产精品久久免费视频在线 | 午夜高清视频 | 国产精品久久片 | 欧美一级h | 亚洲视频在线观看 | 三级成人在线 | 成人免费视频网 | 国产ts余喵喵和直男多体位 | 国产高清视频在线 | 青青伊人久久 | 免费看91| 精品欧美乱码久久久久久 | av香港经典三级级 在线 | 91精品免费在线观看 | 日韩三级在线 | 蜜桃精品久久久久久久免费影院 | 欧美一区二区三区黄色 | 亚洲一区二区三区高清 | 午夜剧院官方 | 在线免费中文字幕 | 黄色免费网站在线看 | 久久久久国产精品www | 亚洲视频在线免费观看 | 日本不卡免费新一二三区 | 国产成人片 | xx视频在线观看 | 国产精品久久久久久久久 | 黄色91| 国产一区二区三区在线免费 | 在线免费视频成人 | 免费毛片大全 | 日韩福利| 午夜国产精品视频 | 国产综合99 | 欧美一区二区三区四区五区 | 亚洲福利小视频 | 黑人一级片视频 | 日日日日日 | 99精品久久 | 久久久久久久一区 | 9l蝌蚪porny中文自拍 | 精品国产精品三级精品av网址 | 亚洲成人动漫在线观看 | 中文字幕avav| 欧美理伦片在线播放 | 老司机深夜福利在线观看 | 美女视频一区 | 成人福利视频 | 日韩中文一区 | 男人天堂中文字幕 | 欧美成人精品一区二区三区 | 色婷婷国产精品久久包臀 | 免费av毛片| 亚洲aⅴ网站 | 欧美高清dvd | 久久久影院 | 91免费在线视频 | av免费在线观看网站 | 欧美日韩国产一区二区三区不卡 | 亚洲人成人一区二区在线观看 | 九九福利 | 毛片免费观看 | 精品国产综合 | 一区二区视频 | 精品中文字幕一区二区 | а天堂中文最新一区二区三区 | 一区二区三区四区免费看 | 青青操天天干 | 在线视频 中文字幕 | 亚洲三区在线观看 | a黄视频| 7777av | 中文字幕在线观看一区二区三区 | 日韩欧美一区二区三区免费观看 | 91一级| 久久aⅴ国产欧美74aaa | 亚洲成人精品在线 | 国产视频精品在线 | 亚洲成人福利在线观看 | 精品视频一区二区 | 国产一区免费 | 欧美日本韩国一区二区 | 亚洲一区二区三区视频 | 亚洲网站在线免费观看 | 成人精品鲁一区一区二区 | 亚洲精品久久一区二区三区 | 精品www | 日本不卡一区 | 91精品国产高清一区二区三区 | 午夜一区二区三区在线观看 | 欧美一级视频 | 夜夜操天天干 | 日韩av在线不卡 | 欧美高清成人 | 太平公主一级艳史播放高清 | 蜜桃comaaa | 中文字幕在线资源 | 日韩精品一区二区三区中文在线 | 精品一区二区三区免费 | 亚洲人人| 色综合欧美 | 人人干人人看 | 亚洲精品国产成人 | 国产成人精品一区二区在线 | 欧美性一区二区三区 | 91麻豆产精品久久久久久 | 国产成人精品av | 国产欧美在线观看 | 操久久| 国产精品久久精品 | 综合精品 | 日韩视频在线观看一区 | 午夜视频在线播放 | 成人av电影网址 | 日韩精品1区2区3区 国产精品国产成人国产三级 | jizz18国产| 日本免费xxxx | 91在线视频播放 | 日本精品一区 | 成人片网址 | 国产成人免费在线观看 | 日日日日日 | 精品免费视频 | 91高清视频在线观看 | 成人在线黄色 | 色乱码一区二区三区网站 | 久久精品国产精品青草 | 亚洲天堂一区二区 | 国产亚洲视频在线观看 | 欧美日韩中文字幕在线播放 | 国内精品视频一区国产 | 日本三级黄色录像 | 成人欧美一区二区三区白人 | 精品久久久久久久久久久久包黑料 | 久久免费精品 | 亚洲高清视频在线观看 | 久久久久亚洲 | 免费看国产片在线观看 | 国产一区二区三区免费播放 | 亚洲视频在线观看免费 | 久久久久久国产精品 | 一级一片免费视频 | 美国一级黄色片 | 国产精品久久免费视频 | 久久久久久久国产精品 | 成人精品鲁一区一区二区 | 伊人网在线视频 | 亚洲综合无码一区二区 | 日韩一区二区三区在线观看 | 日韩中文字幕 | 久久亚洲综合 | 中文在线一区二区 | 欧美精品一区二区在线观看 | 午夜免费片| 女人色网| 欧美日韩视频一区二区 | 第四色影音先锋 | 99久久婷婷 | 日韩国产在线 | 国产精品成人一区二区 | 亚洲一区二区在线播放 | 精品亚洲国产成av人片传媒 | 日本不卡一区二区 | 国产区视频在线 | 国产毛片在线 | 欲色av | 在线观看免费毛片视频 | 国产三区在线成人av | 久久亚洲一区二区三区四区五区高 | 四虎影音 | 色成人免费网站 | 亚洲aaa| 国产亚洲精品久久久久久久 | 老妇女av | 国产成人精品av | 九九视频网 | 美女天堂网 | 精品免费国产一区二区三区 | 国产高潮失禁喷水爽网站 | 美女福利网站 | 亚洲精品一区二区三区在线 | 亚洲一区国产精品 | 欧美在线 | 91视频在线播放视频 | 国产福利片在线观看 | 伊人av在线免费观看 | 超碰人人爱| 精品久久国产 | 国产一级免费网站 | 国产精品久久久久久久久久久免费看 | 午夜精品久久久久久久星辰影院 | 天天想天天干 | 精品在线一区二区三区 | 中文字幕免费观看 | 国产v日产∨综合v精品视频 | 在线视频91 | 午夜成人免费视频 | 久久久久久久91 | 午夜久久久久 | 不卡免费在线视频 | 99精品全国免费观看视频软件 | 成人午夜视频在线观看 | 美女视频一区 | h视频免费观看 | 欧美精品www| 国产视频一区在线 | 欧美精品久久久 | 久久免费精品 | 99久久婷婷国产综合精品 | 国产在线综合视频 | 国产精品一区一区 | 九九色九九 | 国产精品久久久久久久7电影 | 日韩一区在线视频 | 黄色片在线 | 国产精品久久久久久久久 | 就操成人网 | 午夜免费一区二区播放 | 日韩三级黄| 欧美精品一区二区三区视频 | 国产精品三级久久久久久电影 | 国产a一三三四区电影 | 日韩av免费看| 视频在线一区二区 | 国产成人一区二区三区影院在线 | 国产精品18久久久久久首页狼 | 日韩av电影在线免费观看 | 国产一区二区三区久久久久久 | 欧美福利一区二区 | 国产精品永久免费自在线观看 | 亚洲免费成人 | 国产在线观看一区二区三区 | 操久在线 | 国产精品成人3p一区二区三区 | 国产午夜精品久久久久免费视高清 | 精品伦精品一区二区三区视频 | 久久亚洲一区 | 国产免费观看一区二区三区 | 亚洲一区 | 成人精品一区二区三区 | 色婷婷综合久久久中文字幕 | 亚洲一区二区中文字幕 | 欧美一级免费看 | 一级网站在线观看 | 午夜电影网 | 亚洲一区中文字幕在线观看 | 欧美日韩在线播放 | 男女精品| 亚洲va中文字幕 | 美国黄色毛片女人性生活片 | 精品亚洲成a人片在线观看 国产高清在线 | 国产成人高清在线 | 欧美成人免费视频 | 国产日韩视频在线观看 | 天天综合视频 | 天天操天天干视频 | 一色屋精品久久久久久久久久 | 视频一区二区国产 | 日韩欧美一区在线 | 精品一区二区三区免费 | 亚洲毛片网站 | 亚洲国产精品久久久久久久 | 免费观看www免费观看 | 久久人人网 | 亚洲日韩中文字幕 | 日韩久久综合 |