精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

SpringSecurity系列之只允許一臺設備在線

開發 架構
在同一個系統中,我們可能只允許一個用戶在一個終端上登錄,一般來說這可能是出于安全方面的考慮,但是也有一些情況是出于業務上的考慮,松哥之前遇到的需求就是業務原因要求一個用戶只能在一個設備上登錄。

[[399043]]

 登錄成功后,自動踢掉前一個登錄用戶,松哥第一次見到這個功能,就是在扣扣里邊見到的,當時覺得挺好玩的。

自己做開發后,也遇到過一模一樣的需求,正好最近的 Spring Security 系列正在連載,就結合 Spring Security 來和大家聊一聊這個功能如何實現。

1.需求分析

在同一個系統中,我們可能只允許一個用戶在一個終端上登錄,一般來說這可能是出于安全方面的考慮,但是也有一些情況是出于業務上的考慮,松哥之前遇到的需求就是業務原因要求一個用戶只能在一個設備上登錄。

要實現一個用戶不可以同時在兩臺設備上登錄,我們有兩種思路:

后來的登錄自動踢掉前面的登錄,就像大家在扣扣中看到的效果。

如果用戶已經登錄,則不允許后來者登錄。

這種思路都能實現這個功能,具體使用哪一個,還要看我們具體的需求。

在 Spring Security 中,這兩種都很好實現,一個配置就可以搞定。

2.具體實現

2.1 踢掉已經登錄用戶

想要用新的登錄踢掉舊的登錄,我們只需要將最大會話數設置為 1 即可,配置如下:

  1. @Override 
  2. protected void configure(HttpSecurity http) throws Exception { 
  3.     http.authorizeRequests() 
  4.             .anyRequest().authenticated() 
  5.             .and() 
  6.             .formLogin() 
  7.             .loginPage("/login.html"
  8.             .permitAll() 
  9.             .and() 
  10.             .csrf().disable() 
  11.             .sessionManagement() 
  12.             .maximumSessions(1); 

maximumSessions 表示配置最大會話數為 1,這樣后面的登錄就會自動踢掉前面的登錄。這里其他的配置都是我們前面文章講過的,我就不再重復介紹,文末可以下載案例完整代碼。

配置完成后,分別用 Chrome 和 Firefox 兩個瀏覽器進行測試(或者使用 Chrome 中的多用戶功能)。

  1. Chrome 上登錄成功后,訪問 /hello 接口。
  2. Firefox 上登錄成功后,訪問 /hello 接口。
  3. 在 Chrome 上再次訪問 /hello 接口,此時會看到如下提示:
  1. This session has been expired (possibly due to multiple concurrent logins being attempted as the same user). 

可以看到,這里說這個 session 已經過期,原因則是由于使用同一個用戶進行并發登錄。

2.2 禁止新的登錄

如果相同的用戶已經登錄了,你不想踢掉他,而是想禁止新的登錄操作,那也好辦,配置方式如下:

  1. @Override 
  2. protected void configure(HttpSecurity http) throws Exception { 
  3.     http.authorizeRequests() 
  4.             .anyRequest().authenticated() 
  5.             .and() 
  6.             .formLogin() 
  7.             .loginPage("/login.html"
  8.             .permitAll() 
  9.             .and() 
  10.             .csrf().disable() 
  11.             .sessionManagement() 
  12.             .maximumSessions(1) 
  13.             .maxSessionsPreventsLogin(true); 

添加 maxSessionsPreventsLogin 配置即可。此時一個瀏覽器登錄成功后,另外一個瀏覽器就登錄不了了。

是不是很簡單?

不過還沒完,我們還需要再提供一個 Bean:

  1. @Bean 
  2. HttpSessionEventPublisher httpSessionEventPublisher() { 
  3.     return new HttpSessionEventPublisher(); 

為什么要加這個 Bean 呢?因為在 Spring Security 中,它是通過監聽 session 的銷毀事件,來及時的清理 session 的記錄。用戶從不同的瀏覽器登錄后,都會有對應的 session,當用戶注銷登錄之后,session 就會失效,但是默認的失效是通過調用 StandardSession#invalidate 方法來實現的,這一個失效事件無法被 Spring 容器感知到,進而導致當用戶注銷登錄之后,Spring Security 沒有及時清理會話信息表,以為用戶還在線,進而導致用戶無法重新登錄進來(小伙伴們可以自行嘗試不添加上面的 Bean,然后讓用戶注銷登錄之后再重新登錄)。

為了解決這一問題,我們提供一個 HttpSessionEventPublisher ,這個類實現了 HttpSessionListener 接口,在該 Bean 中,可以將 session 創建以及銷毀的事件及時感知到,并且調用 Spring 中的事件機制將相關的創建和銷毀事件發布出去,進而被 Spring Security 感知到,該類部分源碼如下:

  1. public void sessionCreated(HttpSessionEvent event) { 
  2.  HttpSessionCreatedEvent e = new HttpSessionCreatedEvent(event.getSession()); 
  3.  getContext(event.getSession().getServletContext()).publishEvent(e); 
  4. public void sessionDestroyed(HttpSessionEvent event) { 
  5.  HttpSessionDestroyedEvent e = new HttpSessionDestroyedEvent(event.getSession()); 
  6.  getContext(event.getSession().getServletContext()).publishEvent(e); 

OK,雖然多了一個配置,但是依然很簡單!

3.實現原理

上面這個功能,在 Spring Security 中是怎么實現的呢?我們來稍微分析一下源碼。

首先我們知道,在用戶登錄的過程中,會經過 UsernamePasswordAuthenticationFilter,而 UsernamePasswordAuthenticationFilter 中過濾方法的調用是在 AbstractAuthenticationProcessingFilter 中觸發的,我們來看下 AbstractAuthenticationProcessingFilter#doFilter 方法的調用:

  1. public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) 
  2.   throws IOException, ServletException { 
  3.  HttpServletRequest request = (HttpServletRequest) req; 
  4.  HttpServletResponse response = (HttpServletResponse) res; 
  5.  if (!requiresAuthentication(request, response)) { 
  6.   chain.doFilter(request, response); 
  7.   return
  8.  } 
  9.  Authentication authResult; 
  10.  try { 
  11.   authResult = attemptAuthentication(request, response); 
  12.   if (authResult == null) { 
  13.    return
  14.   } 
  15.   sessionStrategy.onAuthentication(authResult, request, response); 
  16.  } 
  17.  catch (InternalAuthenticationServiceException failed) { 
  18.   unsuccessfulAuthentication(request, response, failed); 
  19.   return
  20.  } 
  21.  catch (AuthenticationException failed) { 
  22.   unsuccessfulAuthentication(request, response, failed); 
  23.   return
  24.  } 
  25.  // Authentication success 
  26.  if (continueChainBeforeSuccessfulAuthentication) { 
  27.   chain.doFilter(request, response); 
  28.  } 
  29.  successfulAuthentication(request, response, chain, authResult); 

在這段代碼中,我們可以看到,調用 attemptAuthentication 方法走完認證流程之后,回來之后,接下來就是調用 sessionStrategy.onAuthentication 方法,這個方法就是用來處理 session 的并發問題的。具體在:

  1. public class ConcurrentSessionControlAuthenticationStrategy implements 
  2.   MessageSourceAware, SessionAuthenticationStrategy { 
  3.  public void onAuthentication(Authentication authentication, 
  4.    HttpServletRequest request, HttpServletResponse response) { 
  5.  
  6.   final List<SessionInformation> sessions = sessionRegistry.getAllSessions( 
  7.     authentication.getPrincipal(), false); 
  8.  
  9.   int sessionCount = sessions.size(); 
  10.   int allowedSessions = getMaximumSessionsForThisUser(authentication); 
  11.  
  12.   if (sessionCount < allowedSessions) { 
  13.    // They haven't got too many login sessions running at present 
  14.    return
  15.   } 
  16.  
  17.   if (allowedSessions == -1) { 
  18.    // We permit unlimited logins 
  19.    return
  20.   } 
  21.  
  22.   if (sessionCount == allowedSessions) { 
  23.    HttpSession session = request.getSession(false); 
  24.  
  25.    if (session != null) { 
  26.     // Only permit it though if this request is associated with one of the 
  27.     // already registered sessions 
  28.     for (SessionInformation si : sessions) { 
  29.      if (si.getSessionId().equals(session.getId())) { 
  30.       return
  31.      } 
  32.     } 
  33.    } 
  34.    // If the session is null, a new one will be created by the parent class, 
  35.    // exceeding the allowed number 
  36.   } 
  37.  
  38.   allowableSessionsExceeded(sessions, allowedSessions, sessionRegistry); 
  39.  } 
  40.  protected void allowableSessionsExceeded(List<SessionInformation> sessions, 
  41.    int allowableSessions, SessionRegistry registry) 
  42.    throws SessionAuthenticationException { 
  43.   if (exceptionIfMaximumExceeded || (sessions == null)) { 
  44.    throw new SessionAuthenticationException(messages.getMessage( 
  45.      "ConcurrentSessionControlAuthenticationStrategy.exceededAllowed"
  46.      new Object[] {allowableSessions}, 
  47.      "Maximum sessions of {0} for this principal exceeded")); 
  48.   } 
  49.  
  50.   // Determine least recently used sessions, and mark them for invalidation 
  51.   sessions.sort(Comparator.comparing(SessionInformation::getLastRequest)); 
  52.   int maximumSessionsExceededBy = sessions.size() - allowableSessions + 1; 
  53.   List<SessionInformation> sessionsToBeExpired = sessions.subList(0, maximumSessionsExceededBy); 
  54.   for (SessionInformation session: sessionsToBeExpired) { 
  55.    session.expireNow(); 
  56.   } 
  57.  } 

這段核心代碼我來給大家稍微解釋下:

  1. 首先調用 sessionRegistry.getAllSessions 方法獲取當前用戶的所有 session,該方法在調用時,傳遞兩個參數,一個是當前用戶的 authentication,另一個參數 false 表示不包含已經過期的 session(在用戶登錄成功后,會將用戶的 sessionid 存起來,其中 key 是用戶的主體(principal),value 則是該主題對應的 sessionid 組成的一個集合)。
  2. 接下來計算出當前用戶已經有幾個有效 session 了,同時獲取允許的 session 并發數。
  3. 如果當前 session 數(sessionCount)小于 session 并發數(allowedSessions),則不做任何處理;如果 allowedSessions 的值為 -1,表示對 session 數量不做任何限制。
  4. 如果當前 session 數(sessionCount)等于 session 并發數(allowedSessions),那就先看看當前 session 是否不為 null,并且已經存在于 sessions 中了,如果已經存在了,那都是自家人,不做任何處理;如果當前 session 為 null,那么意味著將有一個新的 session 被創建出來,屆時當前 session 數(sessionCount)就會超過 session 并發數(allowedSessions)。
  5. 如果前面的代碼中都沒能 return 掉,那么將進入策略判斷方法 allowableSessionsExceeded 中。
  6. allowableSessionsExceeded 方法中,首先會有 exceptionIfMaximumExceeded 屬性,這就是我們在 SecurityConfig 中配置的 maxSessionsPreventsLogin 的值,默認為 false,如果為 true,就直接拋出異常,那么這次登錄就失敗了(對應 2.2 小節的效果),如果為 false,則對 sessions 按照請求時間進行排序,然后再使多余的 session 過期即可(對應 2.1 小節的效果)。

4.小結

如此,兩行簡單的配置就實現了 Spring Security 中 session 的并發管理。是不是很簡單?不過這里還有一個小小的坑,松哥將在下篇文章中繼續和大家分析。

本文案例大家可以從 GitHub 上下載:https://github.com/lenve/spring-security-samples

本文轉載自微信公眾號「江南一點雨」,可以通過以下二維碼關注。轉載本文請聯系江南一點雨公眾號。

 

責任編輯:武曉燕 來源: 江南一點雨
相關推薦

2021-01-14 10:57:29

Zabbix監控網絡設備

2021-05-08 10:44:35

SpringSecur登錄詳情

2019-07-03 11:34:30

物聯網數據技術

2021-07-12 06:52:48

Zabbix監控Linux

2021-07-02 10:45:53

SpringBootCAS登錄

2021-04-21 10:38:44

Spring Boot RememberMe安全

2009-09-16 17:04:58

第一臺PC王之

2014-03-21 10:16:17

2017-05-31 10:27:25

戴爾教育云

2012-03-16 17:00:09

2013-03-07 09:12:41

巨型電腦云計算

2016-07-12 10:40:35

服務器

2011-03-22 15:05:45

IBMWatson智慧

2021-07-06 11:42:05

數據庫SpringSecurCAS

2021-08-18 06:47:55

物聯網管理服務IOT

2019-12-23 09:32:43

科達

2017-12-27 16:54:46

華為

2014-09-18 10:15:54

2013-12-20 09:48:12

2010-03-16 10:50:21

光纖交換機
點贊
收藏

51CTO技術棧公眾號

a毛片在线播放| 中文字幕av网站| 99热这里只有精品首页| 黄网站色欧美视频| 亚洲人成网站在线观看播放| 国产wwwwwww| 新67194成人永久网站| 中文字幕在线成人| 极品白嫩的小少妇| 99久久久国产精品免费调教网站| 亚洲男女毛片无遮挡| 久久av免费一区| 一炮成瘾1v1高h| 136国产福利精品导航网址| 一区二区成人av| 肉丝美足丝袜一区二区三区四| 亚洲女同av| 亚洲精品欧美专区| 日本一区二区三区www| 精品国自产拍在线观看| 青青青伊人色综合久久| 久久久免费观看| 三级黄色录像视频| 校花撩起jk露出白色内裤国产精品| 欧美精品国产精品| 国产精品亚洲αv天堂无码| 在线观看午夜av| 国产欧美综合在线观看第十页| 粉嫩精品一区二区三区在线观看 | 色av一区二区| 18黄暴禁片在线观看| 欧美私人网站| 国产日产欧产精品推荐色 | 久久人人爽人人爽人人片亚洲| 国产乱了高清露脸对白| 亚洲大奶少妇| 337p亚洲精品色噜噜噜| 国产三级三级三级看三级| 国产资源在线观看入口av| 亚洲黄色免费网站| 熟女熟妇伦久久影院毛片一区二区| 欧美日韩伦理片| 99视频一区二区三区| 99久久自偷自偷国产精品不卡| 国产一区二区三区视频免费观看| 日本在线播放一区二区三区| 欧美在线激情网| 日韩精品在线不卡| 亚洲午夜一级| 国语自产在线不卡| 国产午夜精品无码一区二区| 欧美先锋影音| 欧美精品电影免费在线观看| 久久久久久久久久久久久久免费看| 亚洲成人精品| 久久国产精品电影| 欧美日韩在线观看免费| 午夜电影亚洲| 久久97久久97精品免视看| 亚洲永久精品ww.7491进入| 国产调教精品| 亚洲人成电影在线| 男人舔女人下部高潮全视频| 欧美精选视频在线观看| 色偷偷av一区二区三区乱| 日本一级特级毛片视频| 中文字幕亚洲精品乱码 | 朝桐光av在线| 欧美一区国产在线| 欧美黄色片在线观看| 久久久久亚洲av无码专区| 欧美精品aa| 97香蕉超级碰碰久久免费软件| 日韩欧美三级在线观看| 久久九九国产| 国产日韩精品视频| 亚洲av无码乱码国产精品| 成人av资源在线| 免费在线成人av| av在线播放av| 亚洲久草在线视频| 黄色免费福利视频| 精品国产欧美日韩一区二区三区| 欧美丰满高潮xxxx喷水动漫| 亚洲精品久久一区二区三区777 | 国产精品16p| 久久黄色影院| 亚洲free嫩bbb| 四虎精品成人影院观看地址| 中文字幕不卡三区| 中文字幕色呦呦| 亚洲欧洲日本韩国| 欧美精品视频www在线观看| 国产大学生av| 久久综合之合合综合久久| ㊣最新国产の精品bt伙计久久| 日本福利视频网站| 激情开心成人网| 日韩一级高清毛片| 国产高清自拍视频| 99热国内精品| 欧美亚洲一区在线| 国产男女猛烈无遮挡| 99精品欧美一区二区蜜桃免费 | 午夜精品aaa| 噼里啪啦国语在线观看免费版高清版| 欧美不卡在线观看| 亚洲欧美国产另类| 国产一级片视频| 蜜桃视频在线观看一区| 国产视色精品亚洲一区二区| 日本精品在线| 色婷婷久久久久swag精品 | 欧美黄视频在线观看| 国产亚洲精品高潮| 日本少妇毛茸茸高潮| 美女网站视频久久| 久久久精品动漫| 天堂va在线| 精品视频在线免费看| 三叶草欧洲码在线| 欧美国产日本| 成人h视频在线观看播放| 亚洲三级中文字幕| 亚洲在线视频免费观看| 奇米视频888| 自拍偷拍一区| 91精品国产91久久久久久不卡| a级片免费观看| 亚洲国产精品成人综合色在线婷婷| 日韩少妇内射免费播放18禁裸乳| 日本一区二区三区视频在线看 | 日韩在线a电影| 精品国产综合区久久久久久| 怡红院av在线| 欧美一区二区福利视频| 99久久久无码国产精品不卡| 日韩不卡手机在线v区| 欧美激情视频一区二区三区| 91白丝在线| 亚洲福利视频网站| 欧美日韩国产精品综合| 国内外成人在线| 伊人久久大香线蕉av一区| 国产综合色在线观看| 亚洲欧洲一区二区三区在线观看| 永久免费看片在线播放| 高清shemale亚洲人妖| 国产精品啪啪啪视频| 国产欧美88| 欧美男插女视频| 精品国产av一区二区三区| 亚洲精品免费在线| 国产伦理在线观看| 亚洲福利电影| 蜜桃91精品入口| 免费观看一级欧美片| 亚洲欧美综合图区| 波多野结衣视频观看| 国产精品毛片大码女人| 日韩不卡一二三| 97精品国产福利一区二区三区| 国产一区二区在线免费视频| 黄色成年人视频在线观看| 欧美一区二区精品在线| 欧美人与禽zozzo禽性配| 成人高清免费观看| 成 年 人 黄 色 大 片大 全| 日韩精品社区| 国产精品v日韩精品| 91福利在线视频| 91精品国产综合久久精品性色| 欧美日韩在线观看成人| av成人老司机| 免费激情视频在线观看| 天天影视综合| 99久久国产综合精品女不卡| 国产视频在线观看一区二区| 一级成人黄色片| 中文字幕av一区二区三区免费看| 污视频网址在线观看| 欧美96在线丨欧| 国产尤物99| 日韩欧美2区| 久久中文字幕视频| 四虎电影院在线观看| 在线免费不卡视频| 欧美三级小视频| 91免费看片在线观看| 999在线观看| 亚洲成色精品| 亚洲v国产v在线观看| 国产精品麻豆| 奇米影视亚洲狠狠色| 色老头视频在线观看| 精品福利二区三区| 糖心vlog精品一区二区| 亚洲午夜在线电影| 亚洲一级片在线播放| 成人夜色视频网站在线观看| 欧美成人黑人猛交| 欧美va天堂在线| 视频一区二区三区免费观看| 2020最新国产精品| 国产精品青草久久久久福利99| 激情影院在线| 在线精品国产成人综合| 亚洲精品久久久狠狠狠爱 | 国产69精品久久久久999小说| 成人婷婷网色偷偷亚洲男人的天堂| 国产精品一码二码三码在线| 中文幕av一区二区三区佐山爱| 91精品国产亚洲| a免费在线观看| 日日摸夜夜添一区| 免费国产在线视频| 亚洲成人三级在线| 国产精品特级毛片一区二区三区| 色老头久久综合| 日韩高清精品免费观看| ㊣最新国产の精品bt伙计久久| 国产肥白大熟妇bbbb视频| av电影在线观看一区| 中文字幕人妻无码系列第三区| 青青草一区二区三区| 日韩少妇内射免费播放18禁裸乳| 精品91在线| 热久久最新网址| 亚洲成av人电影| 亚洲在线视频一区二区| 欧美在线观看视频一区| 欧美日韩另类综合| 天堂成人娱乐在线视频免费播放网站 | 免费在线观看黄网站| 亚洲特黄一级片| 免费成人深夜天涯网站| 久久久另类综合| 黄色国产在线观看| aaa亚洲精品| 日本少妇毛茸茸| av成人动漫在线观看| 免费看毛片的网站| 波多野结衣中文字幕一区| 无码人妻精品一区二区三| 国产成人精品三级| 中国男女全黄大片| 国产高清在线精品| 精品人妻二区中文字幕| 国产99精品国产| 蜜桃色一区二区三区| 成人精品国产福利| 欧产日产国产精品98| 91在线播放网址| 色噜噜日韩精品欧美一区二区| 久久久国际精品| 免费一级特黄3大片视频| 国产精品麻豆视频| 精品国产国产综合精品| 亚洲人精品午夜| 免费在线观看国产精品| 亚洲一区二区在线视频| 亚洲一区欧美在线| 色婷婷国产精品| 这里只有精品国产| 4438x成人网最大色成网站| 亚洲av无码一区二区乱子伦| 亚洲福利在线看| 欧美3p视频在线观看| 在线色欧美三级视频| 麻豆影视国产在线观看| 九九久久综合网站| 成人黄色动漫| 国产精品久久久久久久久| 精品国产亚洲一区二区在线观看 | 色婷婷综合在线观看| 国产成人精品aa毛片| 一区二区视频观看| 日本一区二区三区dvd视频在线| 国产老头老太做爰视频| 一区二区三区四区国产精品| 国产精品人人人人| 欧美日韩一区二区三区四区| 性做久久久久久久久久| 亚洲欧美日韩一区在线| 国产一二三区在线观看| 8x拔播拔播x8国产精品| 亚洲一区av| 久久久久久久久久久久久久一区| 日韩精品一区二区三区免费观影 | 亚洲天堂av中文字幕| 一区二区日韩电影| 日本免费在线观看视频| 91精品国产欧美一区二区成人 | 超碰在线观看91| 欧美精品v日韩精品v韩国精品v| 黄色aaa大片| 自拍偷拍亚洲区| 九色porny视频在线观看| 国产欧美一区二区白浆黑人| 国产成人精品亚洲线观看| 视频一区视频二区视频三区高| 国内精品福利| 性刺激的欧美三级视频| 白白色亚洲国产精品| 丁香六月激情综合| 精品日韩美女的视频高清| 国产免费一区二区三区最新不卡| 亚洲精品乱码久久久久久按摩观| 黄色av免费在线| 国产精欧美一区二区三区| 国产女人18毛片水真多18精品| 亚洲视频小说| 男女精品网站| av在线播放网址| 一区二区三区在线视频播放| 中文字幕久久熟女蜜桃| 日韩精品黄色网| 麻豆蜜桃在线| 91在线高清视频| 日韩在线观看一区| 国产成人无码一二三区视频| 成人精品视频网站| 国产黄色的视频| 67194成人在线观看| 国产三级视频在线| 全球成人中文在线| 欧美调教在线| av在线播放天堂| 夫妻av一区二区| 中文字幕在线有码| 欧美日韩精品电影| a天堂中文在线88| 欧美综合在线第二页| 欧美变态挠脚心| aa视频在线播放| 成人av一区二区三区| 好吊色视频在线观看| 51精品视频一区二区三区| 1024国产在线| 成人免费在线视频网址| 91欧美在线| 夜夜夜夜夜夜操| 国产精品久久久久久久岛一牛影视| 国语对白做受69按摩| 一区二区三区在线播放欧美| 日韩电影大全网站| 日本不卡二区| 日本成人在线不卡视频| 人妻熟人中文字幕一区二区| 欧美色图天堂网| 免费a级人成a大片在线观看| 成人免费看黄网站| 亚洲一级淫片| 日本wwww色| 五月天一区二区三区| 日韩精品系列| 国产精品高潮呻吟久久av黑人| 欧美色就是色| 日本77777| 一区二区三区欧美亚洲| 日本韩国免费观看| 7777kkkk成人观看| 久久91麻豆精品一区| 九九视频精品在线观看| 中文字幕中文字幕一区二区| av免费在线观看不卡| 国内成人精品一区| 综合国产视频| 777一区二区| 一区二区成人在线| 四虎影院在线播放| 国产精品丝袜一区二区三区| 亚洲影视一区二区三区| 久久久久亚洲无码| 在线免费精品视频| 中文国产字幕在线观看| 久久国产精品一区二区三区| 日韩成人一级片| 欧美精品一区二区成人| 亚洲精选在线观看| 欧美videos粗暴| 成人精品视频在线播放| 久久婷婷色综合| 国产精品探花视频| 538国产精品一区二区免费视频| 日韩精品免费| 99精品一区二区三区无码吞精 | 欧美激情精品久久久久久| 午夜精品福利影院| xxww在线观看| 亚洲国产cao| 婷婷视频在线| 国产一区二区免费在线观看| 免费成人在线影院| 国产精品1000| 久久久久99精品久久久久| 少妇精品久久久| 久久久久无码精品| 欧美在线看片a免费观看| a级片免费在线观看|