亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 服務器 > Web服務器 > 正文

shiro會話管理示例代碼

2024-09-01 13:52:58
字體:
來源:轉載
供稿:網友

Shiro提供了完整的企業級會話管理功能,不依賴于底層容器(如web容器tomcat),不管JavaSE還是JavaEE環境都可以使用,提供了會話管理、會話事件監聽、會話存儲/持久化、容器無關的集群、失效/過期支持、對Web的透明支持、SSO單點登錄的支持等特性。即直接使用Shiro的會話管理可以直接替換如Web容器的會話管理。 

會話

所謂會話,即用戶訪問應用時保持的連接關系,在多次交互中應用能夠識別出當前訪問的用戶是誰,且可以在多次交互中保存一些數據。如訪問一些網站時登錄成功后,網站可以記住用戶,且在退出之前都可以識別當前用戶是誰。 

Shiro的會話支持不僅可以在普通的JavaSE應用中使用,也可以在JavaEE應用中使用,如web應用。且使用方式是一致的。 

Java代碼  

login("classpath:shiro.ini", "zhang", "123"); Subject subject = SecurityUtils.getSubject(); Session session = subject.getSession(); 

登錄成功后使用Subject.getSession()即可獲取會話;其等價于Subject.getSession(true),即如果當前沒有創建Session對象會創建一個;另外Subject.getSession(false),如果當前沒有創建Session則返回null(不過默認情況下如果啟用會話存儲功能的話在創建Subject時會主動創建一個Session)。

Java代碼  

session.getId(); 

獲取當前會話的唯一標識。 

Java代碼  

session.getHost();

 獲取當前Subject的主機地址,該地址是通過HostAuthenticationToken.getHost()提供的。  

Java代碼  

session.getTimeout(); session.setTimeout(毫秒); 

獲取/設置當前Session的過期時間;如果不設置默認是會話管理器的全局過期時間。  

Java代碼  

session.getStartTimestamp(); session.getLastAccessTime(); 

獲取會話的啟動時間及最后訪問時間;如果是JavaSE應用需要自己定期調用session.touch()去更新最后訪問時間;如果是Web應用,每次進入ShiroFilter都會自動調用session.touch()來更新最后訪問時間。     

Java代碼  

session.touch(); session.stop(); 

更新會話最后訪問時間及銷毀會話;當Subject.logout()時會自動調用stop方法來銷毀會話。如果在web中,調用javax.servlet.http.HttpSession. invalidate()也會自動調用Shiro Session.stop方法進行銷毀Shiro的會話。  

Java代碼  

session.setAttribute("key", "123"); Assert.assertEquals("123", session.getAttribute("key")); session.removeAttribute("key"); 

設置/獲取/刪除會話屬性;在整個會話范圍內都可以對這些屬性進行操作。  

Shiro提供的會話可以用于JavaSE/JavaEE環境,不依賴于任何底層容器,可以獨立使用,是完整的會話模塊。 

會話管理器

會話管理器管理著應用中所有Subject的會話的創建、維護、刪除、失效、驗證等工作。是Shiro的核心組件,頂層組件SecurityManager直接繼承了SessionManager,且提供了SessionsSecurityManager實現直接把會話管理委托給相應的SessionManager,DefaultSecurityManager及
DefaultWebSecurityManager默認SecurityManager都繼承了SessionsSecurityManager。 

SecurityManager提供了如下接口: 

Java代碼  

Session start(SessionContext context); //啟動會話 Session getSession(SessionKey key) throws SessionException; //根據會話Key獲取會話

另外用于Web環境的WebSessionManager又提供了如下接口: 

Java代碼  

boolean isServletContainerSessions();//是否使用Servlet容器的會話 

Shiro還提供了ValidatingSessionManager用于驗資并過期會話: 

Java代碼  

void validateSessions();//驗證所有會話是否過期 

shiro,會話管理

Shiro提供了三個默認實現:

DefaultSessionManager:DefaultSecurityManager使用的默認實現,用于JavaSE環境;
ServletContainerSessionManager:DefaultWebSecurityManager使用的默認實現,用于Web環境,其直接使用Servlet容器的會話;

DefaultWebSessionManager:用于Web環境的實現,可以替代ServletContainerSessionManager,自己維護著會話,直接廢棄了Servlet容器的會話管理。

替換SecurityManager默認的SessionManager可以在ini中配置(shiro.ini):

Java代碼  

[main] sessionManager=org.apache.shiro.session.mgt.DefaultSessionManager securityManager.sessionManager=$sessionManager 

Web環境下的ini配置(shiro-web.ini):

<!--EndFragment-->

Java代碼  

[main] sessionManager=org.apache.shiro.web.session.mgt.ServletContainerSessionManager securityManager.sessionManager=$sessionManager 

另外可以設置會話的全局過期時間(毫秒為單位),默認30分鐘:

Java代碼  

sessionManager. globalSessionTimeout=1800000 

默認情況下globalSessionTimeout將應用給所有Session??梢詥为氃O置每個Session的timeout屬性來為每個Session設置其超時時間。

另外如果使用ServletContainerSessionManager進行會話管理,Session的超時依賴于底層Servlet容器的超時時間,可以在web.xml中配置其會話的超時時間(分鐘為單位): 

Java代碼  

<session-config>  <session-timeout>30</session-timeout> </session-config> 

在Servlet容器中,默認使用JSESSIONID Cookie維護會話,且會話默認是跟容器綁定的;在某些情況下可能需要使用自己的會話機制,此時我們可以使用DefaultWebSessionManager來維護會話:

Java代碼  

sessionIdCookie=org.apache.shiro.web.servlet.SimpleCookie sessionManager=org.apache.shiro.web.session.mgt.DefaultWebSessionManager sessionIdCookie.name=sid #sessionIdCookie.domain=sishuok.com #sessionIdCookie.path= sessionIdCookie.maxAge=1800 sessionIdCookie.httpOnly=true sessionManager.sessionIdCookie=$sessionIdCookie sessionManager.sessionIdCookieEnabled=true .securityManager.sessionManager=$sessionManager 

sessionIdCookie是sessionManager創建會話Cookie的模板:

sessionIdCookie.name:設置Cookie名字,默認為JSESSIONID;

sessionIdCookie.domain:設置Cookie的域名,默認空,即當前訪問的域名;

sessionIdCookie.path:設置Cookie的路徑,默認空,即存儲在域名根下;

sessionIdCookie.maxAge:設置Cookie的過期時間,秒為單位,默認-1表示關閉瀏覽器時過期Cookie;

sessionIdCookie.httpOnly:如果設置為true,則客戶端不會暴露給客戶端腳本代碼,使用HttpOnly cookie有助于減少某些類型的跨站點腳本攻擊;此特性需要實現了Servlet 2.5 MR6及以上版本的規范的Servlet容器支持;

sessionManager.sessionIdCookieEnabled:是否啟用/禁用Session Id Cookie,默認是啟用的;如果禁用后將不會設置Session Id Cookie,即默認使用了Servlet容器的JSESSIONID,且通過URL重寫(URL中的“;JSESSIONID=id”部分)保存Session Id。

 另外我們可以如“sessionManager. sessionIdCookie.name=sid”這種方式操作Cookie模板。 

會話監聽器

會話監聽器用于監聽會話創建、過期及停止事件: 

Java代碼  

public class MySessionListener1 implements SessionListener {  @Override  public void onStart(Session session) {//會話創建時觸發   System.out.println("會話創建:" + session.getId());  }  @Override  public void onExpiration(Session session) {//會話過期時觸發   System.out.println("會話過期:" + session.getId());  }  @Override  public void onStop(Session session) {//退出/會話過期時觸發   System.out.println("會話停止:" + session.getId());  } } 

如果只想監聽某一個事件,可以繼承SessionListenerAdapter實現:

Java代碼  

public class MySessionListener2 extends SessionListenerAdapter {  @Override  public void onStart(Session session) {   System.out.println("會話創建:" + session.getId());  } } 

在shiro-web.ini配置文件中可以進行如下配置設置會話監聽器:

Java代碼 

sessionListener1=com.github.zhangkaitao.shiro.chapter10.web.listener.MySessionListener1 sessionListener2=com.github.zhangkaitao.shiro.chapter10.web.listener.MySessionListener2 sessionManager.sessionListeners=$sessionListener1,$sessionListener2 

會話存儲/持久化 

Shiro提供SessionDAO用于會話的CRUD,即DAO(Data Access Object)模式實現:

Java代碼 

//如DefaultSessionManager在創建完session后會調用該方法;如保存到關系數據庫/文件系統/NoSQL數據庫;即可以實現會話的持久化;返回會話ID;主要此處返回的ID.equals(session.getId()); Serializable create(Session session); //根據會話ID獲取會話 Session readSession(Serializable sessionId) throws UnknownSessionException; //更新會話;如更新會話最后訪問時間/停止會話/設置超時時間/設置移除屬性等會調用 void update(Session session) throws UnknownSessionException; //刪除會話;當會話過期/會話停止(如用戶退出時)會調用 void delete(Session session); //獲取當前所有活躍用戶,如果用戶量多此方法影響性能 Collection<Session> getActiveSessions(); 

Shiro內嵌了如下SessionDAO實現:

shiro,會話管理

AbstractSessionDAO提供了SessionDAO的基礎實現,如生成會話ID等;CachingSessionDAO提供了對開發者透明的會話緩存的功能,只需要設置相應的CacheManager即可;MemorySessionDAO直接在內存中進行會話維護;而EnterpriseCacheSessionDAO提供了緩存功能的會話維護,默認情況下使用MapCache實現,內部使用ConcurrentHashMap保存緩存的會話。

可以通過如下配置設置SessionDAO:

Java代碼  

sessionDAO=org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO sessionManager.sessionDAO=$sessionDAO 

Shiro提供了使用Ehcache進行會話存儲,Ehcache可以配合TerraCotta實現容器無關的分布式集群。

首先在pom.xml里添加如下依賴:

Java代碼  

<dependency>  <groupId>org.apache.shiro</groupId>  <artifactId>shiro-ehcache</artifactId>  <version>1.2.2</version> </dependency> 

接著配置shiro-web.ini文件:   

Java代碼  

sessionDAO=org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO sessionDAO. activeSessionsCacheName=shiro-activeSessionCache sessionManager.sessionDAO=$sessionDAO cacheManager = org.apache.shiro.cache.ehcache.EhCacheManager cacheManager.cacheManagerConfigFile=classpath:ehcache.xml securityManager.cacheManager = $cacheManager 

sessionDAO. activeSessionsCacheName:設置Session緩存名字,默認就是shiro-activeSessionCache;

cacheManager:緩存管理器,用于管理緩存的,此處使用Ehcache實現;

cacheManager.cacheManagerConfigFile:設置ehcache緩存的配置文件;

securityManager.cacheManager:設置SecurityManager的cacheManager,會自動設置實現了CacheManagerAware接口的相應對象,如SessionDAO的cacheManager;

然后配置ehcache.xml:

Java代碼  

<cache name="shiro-activeSessionCache"   maxEntriesLocalHeap="10000"   overflowToDisk="false"   eternal="false"   diskPersistent="false"   timeToLiveSeconds="0"   timeToIdleSeconds="0"   statistics="true"/> 

Cache的名字為shiro-activeSessionCache,即設置的sessionDAO的activeSessionsCacheName屬性值。 

另外可以通過如下ini配置設置會話ID生成器:

Java代碼  

sessionIdGenerator=org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator sessionDAO.sessionIdGenerator=$sessionIdGenerator 

用于生成會話ID,默認就是JavaUuidSessionIdGenerator,使用java.util.UUID生成。 

如果自定義實現SessionDAO,繼承CachingSessionDAO即可:

Java代碼  

public class MySessionDAO extends CachingSessionDAO {  private JdbcTemplate jdbcTemplate = JdbcTemplateUtils.jdbcTemplate();   protected Serializable doCreate(Session session) {   Serializable sessionId = generateSessionId(session);   assignSessionId(session, sessionId);   String sql = "insert into sessions(id, session) values(?,?)";   jdbcTemplate.update(sql, sessionId, SerializableUtils.serialize(session));   return session.getId();  } protected void doUpdate(Session session) {  if(session instanceof ValidatingSession && !((ValidatingSession)session).isValid()) {   return; //如果會話過期/停止 沒必要再更新了  }   String sql = "update sessions set session=? where id=?";   jdbcTemplate.update(sql, SerializableUtils.serialize(session), session.getId());  }  protected void doDelete(Session session) {   String sql = "delete from sessions where id=?";   jdbcTemplate.update(sql, session.getId());  }  protected Session doReadSession(Serializable sessionId) {   String sql = "select session from sessions where id=?";   List<String> sessionStrList = jdbcTemplate.queryForList(sql, String.class, sessionId);   if(sessionStrList.size() == 0) return null;   return SerializableUtils.deserialize(sessionStrList.get(0));  } } 

doCreate/doUpdate/doDelete/doReadSession分別代表創建/修改/刪除/讀取會話;此處通過把會話序列化后存儲到數據庫實現;接著在shiro-web.ini中配置:

Java代碼  

sessionDAO=com.github.zhangkaitao.shiro.chapter10.session.dao.MySessionDAO 

其他設置和之前一樣,因為繼承了CachingSessionDAO;所有在讀取時會先查緩存中是否存在,如果找不到才到數據庫中查找。 

會話驗證

Shiro提供了會話驗證調度器,用于定期的驗證會話是否已過期,如果過期將停止會話;出于性能考慮,一般情況下都是獲取會話時來驗證會話是否過期并停止會話的;但是如在web環境中,如果用戶不主動退出是不知道會話是否過期的,因此需要定期的檢測會話是否過期,Shiro提供了會話驗證調度器SessionValidationScheduler來做這件事情。

可以通過如下ini配置開啟會話驗證:   

Java代碼  

sessionValidationScheduler=org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler sessionValidationScheduler.interval = 3600000 sessionValidationScheduler.sessionManager=$sessionManager sessionManager.globalSessionTimeout=1800000 sessionManager.sessionValidationSchedulerEnabled=truesessionManager.sessionValidationScheduler=$sessionValidationScheduler 

sessionValidationScheduler:會話驗證調度器,sessionManager默認就是使用ExecutorServiceSessionValidationScheduler,其使用JDK的ScheduledExecutorService進行定期調度并驗證會話是否過期;

sessionValidationScheduler.interval:設置調度時間間隔,單位毫秒,默認就是1小時;

sessionValidationScheduler.sessionManager:設置會話驗證調度器進行會話驗證時的會話管理器;

sessionManager.globalSessionTimeout:設置全局會話超時時間,默認30分鐘,即如果30分鐘內沒有訪問會話將過期;

sessionManager.sessionValidationSchedulerEnabled:是否開啟會話驗證器,默認是開啟的;

sessionManager.sessionValidationScheduler:設置會話驗證調度器,默認就是使用ExecutorServiceSessionValidationScheduler。 

Shiro也提供了使用Quartz會話驗證調度器:

Java代碼  

sessionValidationScheduler=org.apache.shiro.session.mgt.quartz.QuartzSessionValidationScheduler sessionValidationScheduler.sessionValidationInterval = 3600000 sessionValidationScheduler.sessionManager=$sessionManager 

使用時需要導入shiro-quartz依賴:

Java代碼  

<dependency>   <groupId>org.apache.shiro</groupId>   <artifactId>shiro-quartz</artifactId>   <version>1.2.2</version> </dependency> 

如上會話驗證調度器實現都是直接調用AbstractValidatingSessionManager 的validateSessions方法進行驗證,其直接調用SessionDAO的getActiveSessions方法獲取所有會話進行驗證,如果會話比較多,會影響性能;可以考慮如分頁獲取會話并進行驗證,如com.github.zhangkaitao.shiro.chapter10.session.scheduler.MySessionValidationScheduler:

Java代碼  

//分頁獲取會話并驗證 String sql = "select session from sessions limit ?,?"; int start = 0; //起始記錄 int size = 20; //每頁大小 List<String> sessionList = jdbcTemplate.queryForList(sql, String.class, start, size); while(sessionList.size() > 0) {  for(String sessionStr : sessionList) {  try {   Session session = SerializableUtils.deserialize(sessionStr);   Method validateMethod =   ReflectionUtils.findMethod(AbstractValidatingSessionManager.class,    "validate", Session.class, SessionKey.class);   validateMethod.setAccessible(true);   ReflectionUtils.invokeMethod(validateMethod,   sessionManager, session, new DefaultSessionKey(session.getId()));  } catch (Exception e) {   //ignore  }  }  start = start + size;  sessionList = jdbcTemplate.queryForList(sql, String.class, start, size); } 

其直接改造自ExecutorServiceSessionValidationScheduler,如上代碼是驗證的核心代碼,可以根據自己的需求改造此驗證調度器器;ini的配置和之前的類似。

如果在會話過期時不想刪除過期的會話,可以通過如下ini配置進行設置:

Java代碼  

sessionManager.deleteInvalidSessions=false 

默認是開啟的,在會話過期后會調用SessionDAO的delete方法刪除會話:如會話時持久化存儲的,可以調用此方法進行刪除。 

如果是在獲取會話時驗證了會話已過期,將拋出InvalidSessionException;因此需要捕獲這個異常并跳轉到相應的頁面告訴用戶會話已過期,讓其重新登錄,如可以在web.xml配置相應的錯誤頁面:

Java代碼  

<error-page>  <exception-type>org.apache.shiro.session.InvalidSessionException</exception-type>  <location>/invalidSession.jsp</location> </error-page> 

sessionFactory

sessionFactory是創建會話的工廠,根據相應的Subject上下文信息來創建會話;默認提供了SimpleSessionFactory用來創建SimpleSession會話。

首先自定義一個Session:

Java代碼  

public class OnlineSession extends SimpleSession {  public static enum OnlineStatus {   on_line("在線"), hidden("隱身"), force_logout("強制退出");   private final String info;   private OnlineStatus(String info) {    this.info = info;   }   public String getInfo() {    return info;   }  }  private String userAgent; //用戶瀏覽器類型  private OnlineStatus status = OnlineStatus.on_line; //在線狀態  private String systemHost; //用戶登錄時系統IP  //省略其他 } 

OnlineSession用于保存當前登錄用戶的在線狀態,支持如離線等狀態的控制。

接著自定義SessionFactory:

Java代碼  

public class OnlineSessionFactory implements SessionFactory {   @Override  public Session createSession(SessionContext initData) {   OnlineSession session = new OnlineSession();   if (initData != null && initData instanceof WebSessionContext) {    WebSessionContext sessionContext = (WebSessionContext) initData;    HttpServletRequest request = (HttpServletRequest) sessionContext.getServletRequest();    if (request != null) {     session.setHost(IpUtils.getIpAddr(request));     session.setUserAgent(request.getHeader("User-Agent"));     session.setSystemHost(request.getLocalAddr() + ":" + request.getLocalPort());    }   }   return session;  } } 

根據會話上下文創建相應的OnlineSession。 

最后在shiro-web.ini配置文件中配置:

Java代碼  

sessionFactory=org.apache.shiro.session.mgt.OnlineSessionFactory sessionManager.sessionFactory=$sessionFactory 

 總結

以上所述是小編給大家介紹的shiro會話管理,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VEVB武林網網站的支持!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美性猛交xxx| 亚洲一区制服诱惑| 国产精品美女免费视频| 成人a级免费视频| 欧美性在线视频| 91免费看国产| 欧美一区在线直播| 欧美一级片在线播放| 亚洲欧美日韩天堂一区二区| 狠狠做深爱婷婷久久综合一区| 国产精品电影在线观看| 亚洲一区999| 国产精品美女久久| 成人福利视频在线观看| 亚洲第一黄色网| 国产精品成人播放| 国产97在线播放| 亚洲区免费影片| 国内精久久久久久久久久人| 国产美女精品视频免费观看| 中文.日本.精品| 色久欧美在线视频观看| 日韩一区二区福利| 亚洲欧美色婷婷| 久久天天躁狠狠躁夜夜av| 久久影视电视剧免费网站清宫辞电视| 国产有码在线一区二区视频| 国产一区二区激情| 影音先锋日韩有码| 在线色欧美三级视频| 国产精品久久久久久久久久久不卡| 国产一区二区三区在线看| 日韩一区二区三区在线播放| 日韩大胆人体377p| 国产精品久久久久久久久久尿| 91香蕉亚洲精品| 国产午夜精品一区二区三区| 久久久免费观看| 久久精品视频播放| 亚洲天堂av综合网| 欧美日韩国产在线看| 国产精品日韩精品| 久久精品一偷一偷国产| 欧美日韩亚洲精品内裤| 色妞一区二区三区| www.亚洲成人| 欧美国产欧美亚洲国产日韩mv天天看完整| 欧美日韩人人澡狠狠躁视频| 亚洲片在线观看| 97在线视频一区| 日韩欧美亚洲一二三区| 久久中国妇女中文字幕| 青青草成人在线| 日韩免费视频在线观看| 色777狠狠综合秋免鲁丝| 91av在线看| 成人网在线观看| www.精品av.com| 97在线视频免费| 久久久久久国产精品久久| 久色乳综合思思在线视频| 精品爽片免费看久久| 国产精品一久久香蕉国产线看观看| 亚洲人成在线观看| 欧美精品福利在线| 一本一本久久a久久精品综合小说| 欧美激情网站在线观看| 91av网站在线播放| 欧美午夜视频在线观看| 日本午夜在线亚洲.国产| 国产欧美韩国高清| 亚洲国产精品va在看黑人| 亚洲国产97在线精品一区| 欧洲成人在线观看| 国产精品电影网站| 亚洲欧洲激情在线| 亚洲mm色国产网站| 国产精品第1页| 丝袜亚洲欧美日韩综合| 日韩精品视频免费| 国产精品久久久久久久久影视| 欧美在线一级视频| 精品免费在线视频| 日韩中文娱乐网| 国产免费观看久久黄| 亚洲第一福利视频| 久热国产精品视频| 欧美国产日韩一区二区| xxxx性欧美| 日韩av资源在线播放| 日韩视频永久免费观看| 91精品在线播放| 国产偷国产偷亚洲清高网站| 97国产suv精品一区二区62| 亚洲天堂成人在线| 97视频在线观看免费高清完整版在线观看| 最近2019中文字幕在线高清| 国产欧美精品va在线观看| 国产aⅴ夜夜欢一区二区三区| 国产精品国产三级国产aⅴ浪潮| 国产免费成人av| 国产成人精品在线观看| 欧美午夜精品久久久久久浪潮| 欧美激情一级二级| 亚洲国产精品久久久久秋霞蜜臀| 日韩精品视频在线免费观看| 亚洲成人在线视频播放| 国产成人av网| 欧美专区第一页| 国产欧美日韩精品专区| 黄色成人av在线| 亚洲一区免费网站| 国产精品视频资源| 欧美日韩在线观看视频小说| 亚洲综合小说区| 欧美激情精品久久久久久免费印度| 欧美成aaa人片在线观看蜜臀| 精品视频一区在线视频| 亚洲一区二区三区sesese| 在线精品91av| 日韩在线免费高清视频| 综合av色偷偷网| 亚洲国产精品人久久电影| 欧美成人国产va精品日本一级| 91久久精品久久国产性色也91| 精品美女久久久久久免费| 日本精品免费一区二区三区| 国产精品一久久香蕉国产线看观看| 在线观看亚洲视频| 欧美午夜精品久久久久久浪潮| 成人午夜在线观看| 亚洲精品之草原avav久久| 色与欲影视天天看综合网| 自拍偷拍亚洲精品| 亚洲成人精品在线| 日韩在线欧美在线国产在线| 亚洲丝袜av一区| 欧美一级淫片丝袜脚交| 国产精品黄色影片导航在线观看| 日韩在线观看免费av| 国产视频久久久久久久| 亚洲最大av网站| 国产精品一二三在线| 国产精品福利久久久| 亚洲欧美视频在线| 欧美成人激情在线| 久热国产精品视频| 国产精品久久久久久久午夜| 亚洲精品第一国产综合精品| 国产91精品网站| 亚洲字幕在线观看| 欧美极品少妇xxxxx| 国产在线98福利播放视频| 亚洲伊人久久大香线蕉av| 日韩大片在线观看视频| 国产精品福利在线观看| 欧美亚洲国产成人精品| 色综合久久88色综合天天看泰| 国产精品看片资源| 亚洲91精品在线观看| 欧美激情图片区| 日韩精品极品毛片系列视频| 青青草原一区二区| 日韩在线观看免费av|