亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

Shiro Session管理實戰(zhàn):從核心原理到集群部署與強制下線實現(xiàn)

Shiro Session管理實戰(zhàn):從核心原理到集群部署與強制下線實現(xiàn) 1. 從一次登錄失效的排查說起為什么需要手動操作Session最近在排查一個線上問題時遇到了一個挺典型的場景用戶反饋登錄后偶爾會莫名其妙地掉線需要重新登錄。排查日志發(fā)現(xiàn)用戶的Session在某個時間點被主動清除了但業(yè)務(wù)代碼里并沒有顯式調(diào)用logout或invalidate。這讓我重新審視了項目中Shiro的Session管理機制。我們通常依賴Shiro的自動管理比如登錄成功后自動創(chuàng)建Session設(shè)置超時時間過期后自動清理。但在一些復(fù)雜的業(yè)務(wù)流中比如強制用戶下線、踢人、會話數(shù)據(jù)遷移或者像我們遇到的這種“幽靈”失效問題僅僅依靠框架的默認(rèn)行為是不夠的。這時我們就需要主動、精確地去“操作”Session。Shiro的Session API提供了一套比Servlet原生HttpSession更強大、更統(tǒng)一的操作接口。它抽象了底層細(xì)節(jié)讓你無論是在Web環(huán)境還是非Web環(huán)境比如單元測試、后臺任務(wù)都能用同一套方式管理用戶會話狀態(tài)。理解并熟練使用這些API意味著你能更好地控制應(yīng)用的安全狀態(tài)實現(xiàn)更精細(xì)化的用戶會話治理而不是被動地處理各種因Session引發(fā)的詭異問題。接下來我就結(jié)合實戰(zhàn)拆解Shiro Session管理的核心操作。2. 理解Shiro Session的核心模型與關(guān)鍵接口在動手寫代碼之前我們必須先搞清楚Shiro Session的“世界觀”。它并不是對HttpSession的簡單包裝而是一套自頂向下設(shè)計的、獨立的安全會話模型。2.1 Session會話數(shù)據(jù)的統(tǒng)一抽象接口org.apache.shiro.session.Session接口是Shiro會話管理的基石。你可以把它理解為一個鍵值對存儲專門用來存放與當(dāng)前交互用戶相關(guān)的數(shù)據(jù)。它與HttpSession最大的不同在于環(huán)境無關(guān)性。// 獲取當(dāng)前Subject的Session Session session SecurityUtils.getSubject().getSession(); // 存儲數(shù)據(jù) session.setAttribute(currentProjectId, 12345); // 獲取數(shù)據(jù) Integer projectId (Integer) session.getAttribute(currentProjectId); // 移除數(shù)據(jù) session.removeAttribute(currentProjectId);這里有一個關(guān)鍵細(xì)節(jié)getSession()方法有一個重載版本getSession(boolean create)。當(dāng)create為false時如果當(dāng)前沒有Session它會返回null。這在某些只讀檢查的場景下非常有用可以避免無意中創(chuàng)建一個不必要的Session。例如在統(tǒng)計在線用戶數(shù)時你只需要檢查是否存在有效的Session而不應(yīng)該為每個訪問者都創(chuàng)建一個。2.2 SessionManager會話生命周期的總指揮SessionManager負(fù)責(zé)Session的創(chuàng)建、維護(hù)和銷毀。在Web應(yīng)用中最常用的是DefaultWebSessionManager。它的配置決定了Session行為的方方面面。在Spring Boot的application.yml中典型的配置如下shiro: sessionManager: # Session全局超時時間毫秒默認(rèn)30分鐘 globalSessionTimeout: 1800000 # 是否開啟會話驗證調(diào)度定期清理過期Session sessionValidationSchedulerEnabled: true # 會話驗證調(diào)度器執(zhí)行間隔毫秒默認(rèn)1小時 sessionValidationInterval: 3600000 # 是否在會話過期后刪除無效的Session ID Cookie deleteInvalidSessions: true # Session ID Cookie配置 sessionIdCookie: name: SHRIOSESSIONID httpOnly: true maxAge: -1 # 瀏覽器關(guān)閉即失效DefaultWebSessionManager的一個強大之處在于其會話驗證機制。它內(nèi)部有一個SessionValidationScheduler默認(rèn)使用一個單線程的ExecutorService定期比如每小時一次掃描所有活躍的Session將那些lastAccessTime加上timeout已經(jīng)早于當(dāng)前時間的Session標(biāo)記為過期并清理。這就是為什么即使你不做任何操作閑置用戶也會自動掉線的原因。注意在生產(chǎn)環(huán)境中如果應(yīng)用重啟內(nèi)存中的Session會全部丟失。DefaultWebSessionManager默認(rèn)將Session存儲在內(nèi)存中。對于需要持久化或集群部署的場景你需要配置SessionDAO例如使用EnterpriseCacheSessionDAO將會話數(shù)據(jù)存儲到Redis中。這時SessionManager和SessionDAO的協(xié)作就至關(guān)重要了。2.3 Subject與Session的綁定關(guān)系這是容易混淆的一點。我們通過SecurityUtils.getSubject().getSession()獲取的Session是與當(dāng)前Subject即當(dāng)前交互主體通常是用戶綁定的。在Web環(huán)境下Shiro會通過Cookie默認(rèn)名JSESSIONIDShiro可配置或URL參數(shù)找到Session ID然后從SessionManager中獲取對應(yīng)的Session對象再將其與當(dāng)前線程的Subject綁定。這意味著一個有效的Session可以沒有經(jīng)過認(rèn)證即用戶未登錄。例如用戶訪問網(wǎng)站首頁可能就已經(jīng)創(chuàng)建了一個匿名Session用于存放購物車信息或驗證碼。只有當(dāng)調(diào)用subject.login(token)成功后這個Session才會與一個經(jīng)過認(rèn)證的身份Principal關(guān)聯(lián)起來。理解這一點對于后續(xù)實現(xiàn)“強制下線”等功能很重要——你操作的是SessionSession失效會導(dǎo)致綁定它的Subject也變?yōu)槲凑J(rèn)證狀態(tài)。3. 實戰(zhàn)Session的增刪改查與生命周期控制掌握了基本概念我們進(jìn)入實戰(zhàn)環(huán)節(jié)。下面這些操作是管理Session的日常。3.1 創(chuàng)建與獲取不僅僅是getSession()大多數(shù)情況下Session的創(chuàng)建是隱式的。當(dāng)?shù)谝淮握{(diào)用subject.getSession()或subject.getSession(true)時如果當(dāng)前沒有SessionSessionManager就會創(chuàng)建一個。但有些場景需要顯式控制。Subject currentUser SecurityUtils.getSubject(); // 方式1獲取現(xiàn)有Session不存在則創(chuàng)建最常用 Session session currentUser.getSession(); // 方式2僅獲取不存在則返回null用于檢查 Session existingSession currentUser.getSession(false); if (existingSession null) { log.info(當(dāng)前用戶沒有活躍會話可能是個新訪客。); // 可以在此處初始化一個匿名會話用于跟蹤 session currentUser.getSession(); session.setAttribute(visitTime, new Date()); }創(chuàng)建Session時一個重要的屬性是timeout超時時間毫秒。你可以在創(chuàng)建后單獨設(shè)置session.setTimeout(30 * 60 * 1000); // 設(shè)置為30分鐘但更常見的做法是在SessionManager級別配置globalSessionTimeout進(jìn)行統(tǒng)一管理。個人經(jīng)驗是除非有非常特殊的、針對單個會話的超時需求比如付費用戶會話時間更長否則盡量使用全局配置保持一致性減少維護(hù)復(fù)雜度。3.2 數(shù)據(jù)存取Attribute操作的最佳實踐向Session中存取數(shù)據(jù)看似簡單但有些細(xì)節(jié)能幫你避免坑。// 存數(shù)據(jù) session.setAttribute(key, value); // 取數(shù)據(jù) Object value session.getAttribute(key); // 刪數(shù)據(jù) session.removeAttribute(key); // 獲取所有Attribute的鍵 CollectionObject keys session.getAttributeKeys();實操心得一序列化問題如果你的應(yīng)用是集群部署并且使用了Redis等外部存儲作為SessionDAO的后端那么存入Session的所有對象必須實現(xiàn)java.io.Serializable接口。否則在序列化存儲時會拋出異常。這是一個非常常見的部署陷阱。建議在項目早期就建立規(guī)范規(guī)定所有可能放入Session的DTO或值對象都必須實現(xiàn)Serializable。實操心得二鍵的命名規(guī)范Session是全局的、基于字符串鍵的存儲容易發(fā)生鍵名沖突。特別是當(dāng)你引入第三方庫或框架它們也可能向Session中存放數(shù)據(jù)。一個良好的實踐是使用反向域名格式作為鍵的前綴例如com.yourcompany.project.module.key。這樣能最大程度避免沖突。實操心得三控制數(shù)據(jù)量Session數(shù)據(jù)通常存儲在服務(wù)器內(nèi)存或外部緩存中不宜存放過大或過多的數(shù)據(jù)。避免將整個用戶對象、大數(shù)據(jù)列表或文件流直接存入Session。只存放最小必要的標(biāo)識符和狀態(tài)信息比如用戶ID、角色列表、當(dāng)前租戶ID等。大對象可以考慮存入數(shù)據(jù)庫或分布式緩存在Session中只保留其引用ID。3.3 失效與登出理解invalidate()和logout()的區(qū)別這是兩個緊密相關(guān)但作用范圍不同的操作。session.invalidate()使當(dāng)前Session立即失效。調(diào)用后該Session對象將被標(biāo)記為無效并從SessionManager的存儲中移除。后續(xù)任何嘗試通過該Session ID訪問的操作都會失敗。但是它不會執(zhí)行Shiro的登出邏輯比如清理與Subject關(guān)聯(lián)的認(rèn)證信息Principal和授權(quán)信息Roles/Permissions。在單純的Web上下文中由于Session失效下次請求會因為沒有Session ID而創(chuàng)建一個新的匿名Session用戶自然就“掉線”了。但這是一種比較“粗暴”的方式。subject.logout()這是Shiro提供的標(biāo)準(zhǔn)登出操作。它會做一系列清理工作調(diào)用session.invalidate()使會話失效。清除Subject中綁定的身份Principal和憑證Credential。清除線程上下文中與當(dāng)前Subject關(guān)聯(lián)的所有狀態(tài)。觸發(fā)登出事件監(jiān)聽器LogoutListener。// 場景用戶主動點擊退出按鈕 RequestMapping(/logout) public String logout() { SecurityUtils.getSubject().logout(); // 重定向到登錄頁或首頁 return redirect:/login; } // 場景管理員在后臺強制讓某個用戶下線已知其Session ID public void forceLogout(String sessionId) { try { // 1. 通過SessionManager獲取到具體的Session對象 Session session sessionManager.retrieveSession(sessionId); if (session ! null) { // 2. 停止該會話 session.stop(); // 3. 顯式失效stop方法通常也會觸發(fā)失效但顯式調(diào)用更明確 session.invalidate(); log.info(已強制下線會話: {}, sessionId); } } catch (Exception e) { log.error(強制下線會話失敗: {}, sessionId, e); } }重要提示session.stop()方法來源于Session接口繼承的Stoppable接口。它主要用于釋放Session可能占用的資源然后通常會調(diào)用invalidate()。在強制下線時先stop()再invalidate()是一個更完整的流程。直接調(diào)用invalidate()在大多數(shù)情況下也夠用但遵循接口設(shè)計能更好地處理邊緣情況。那么在什么情況下用哪個用戶主動退出永遠(yuǎn)使用subject.logout()。這是最規(guī)范、最安全的方式確保了所有安全狀態(tài)被正確清理。會話過期交給SessionManager的驗證調(diào)度器自動處理它會調(diào)用Session的expire()或invalidate()方法。管理員強制踢人如果你能拿到對應(yīng)用戶的Subject優(yōu)先用subject.logout()。如果只能拿到SessionId則通過SessionManager獲取Session后調(diào)用invalidate()。在這種情況下由于無法直接訪問目標(biāo)Subject的線程上下文logout()的某些清理動作可能無法執(zhí)行但使Session失效足以達(dá)到踢人目的。3.4 監(jiān)聽會話事件讓管理更智能Shiro提供了SessionListener接口允許你在Session生命周期的關(guān)鍵節(jié)點插入自定義邏輯。這對于實現(xiàn)監(jiān)控、審計或特定業(yè)務(wù)聯(lián)動非常有用。你需要實現(xiàn)這個接口并注冊到SessionManager中。Component public class CustomSessionListener implements SessionListener { Override public void onStart(Session session) { // 會話創(chuàng)建時觸發(fā)例如用戶首次訪問 String sessionId (String) session.getId(); log.info(會話啟動: ID{}, 開始時間{}, sessionId, session.getStartTimestamp()); // 可以在這里初始化一些會話級別的跟蹤信息 } Override public void onStop(Session session) { // 會話被顯式stop()時觸發(fā) log.info(會話停止: ID{}, session.getId()); } Override public void onExpiration(Session session) { // 會話過期時觸發(fā)超時 String username (String) session.getAttribute(username); log.warn(會話過期: ID{}, 用戶{}, session.getId(), username); // 可以在這里觸發(fā)清理關(guān)聯(lián)資源的任務(wù)比如釋放用戶占用的臨時鎖 } }然后在Shiro的配置類中將其注入Bean public DefaultWebSessionManager sessionManager(CustomSessionListener customSessionListener) { DefaultWebSessionManager sessionManager new DefaultWebSessionManager(); // 設(shè)置其他配置... // 設(shè)置監(jiān)聽器集合 CollectionSessionListener listeners new ArrayList(); listeners.add(customSessionListener); sessionManager.setSessionListeners(listeners); return sessionManager; }一個實用的場景精準(zhǔn)的在線用戶統(tǒng)計。單純統(tǒng)計Session數(shù)量是不準(zhǔn)確的因為包含未登錄的匿名會話。我們可以在用戶登錄成功的邏輯里向他的Session中存入一個標(biāo)識如session.setAttribute(loggedIn, true)。然后在onExpiration和onStop監(jiān)聽器中檢查這個標(biāo)識如果是已登錄用戶的會話失效就更新在線用戶計數(shù)。這樣得到的數(shù)據(jù)遠(yuǎn)比簡單的Session計數(shù)有價值。4. 進(jìn)階場景基于SessionManager的精細(xì)化管控當(dāng)我們不滿足于對當(dāng)前用戶Session的操作而是需要從系統(tǒng)層面查看和管理所有活躍會話時就需要直接與SessionManager打交道了。4.1 檢索與遍歷所有活躍會話SessionManager具體是其底層的SessionDAO提供了獲取活躍會話的方法。這在實現(xiàn)“在線用戶列表”或“會話管理”后臺功能時是核心API。Autowired private SessionManager sessionManager; /** * 獲取所有活躍會話注意性能敏感操作謹(jǐn)慎使用 */ public CollectionSession getActiveSessions() { // 需要將SessionManager轉(zhuǎn)型為具體的實現(xiàn)類以調(diào)用getActiveSessions方法 // 注意DefaultWebSessionManager本身沒有這個方法方法在其父類AbstractNativeSessionManager中 // 更通用的方式是注入SessionDAO if (sessionManager instanceof AbstractNativeSessionManager) { // 這種方式依賴于Shiro內(nèi)部API可能在不同版本間有變化 return ((AbstractNativeSessionManager) sessionManager).getActiveSessions(); } // 更推薦的方式直接注入并使用SessionDAO return Collections.emptyList(); } // 更佳實踐直接操作SessionDAO Autowired(required false) // requiredfalse防止沒有配置SessionDAO時啟動失敗 private SessionDAO sessionDAO; public ListMapString, Object getActiveSessionList() { ListMapString, Object sessionList new ArrayList(); if (sessionDAO ! null) { // 獲取所有活躍會話的鍵通常是Session ID CollectionSession sessions sessionDAO.getActiveSessions(); for (Session session : sessions) { MapString, Object sessionInfo new HashMap(); sessionInfo.put(sessionId, session.getId()); sessionInfo.put(startTime, session.getStartTimestamp()); sessionInfo.put(lastAccessTime, session.getLastAccessTime()); sessionInfo.put(timeout, session.getTimeout()); sessionInfo.put(host, session.getHost()); // 用戶IP // 獲取登錄用戶信息如果已登錄 String username (String) session.getAttribute(username); sessionInfo.put(username, username ! null ? username : 匿名訪客); sessionList.add(sessionInfo); } } return sessionList; }警告getActiveSessions()操作在會話數(shù)量很大時比如上萬可能會對性能尤其是內(nèi)存和CPU造成顯著影響因為它可能需要從存儲中加載大量數(shù)據(jù)。絕對不要在頻繁調(diào)用的接口如每次頁面請求中使用此方法。它只適用于管理員偶爾查看的后臺功能。對于大規(guī)模應(yīng)用應(yīng)考慮分頁查詢或使用專門的監(jiān)控系統(tǒng)。4.2 實現(xiàn)強制下線踢人功能這是后臺管理系統(tǒng)的常見需求。原理就是通過目標(biāo)用戶的Session ID找到對應(yīng)的Session并使其失效。Service public class SessionManagementService { Autowired private SessionDAO sessionDAO; /** * 根據(jù)用戶名強制下線假設(shè)用戶名已存入Session的username屬性 * param username 要下線的用戶名 * return 被下線的會話數(shù)量 */ public int forceLogoutByUsername(String username) { int count 0; CollectionSession sessions sessionDAO.getActiveSessions(); for (Session session : sessions) { // 遍歷所有會話找到對應(yīng)用戶的會話 String sessionUser (String) session.getAttribute(username); if (username.equals(sessionUser)) { try { // 使會話失效 session.stop(); sessionDAO.delete(session); count; log.info(已強制下線用戶[{}]的會話: {}, username, session.getId()); } catch (Exception e) { log.error(下線用戶[{}]會話失敗: {}, username, session.getId(), e); } } } return count; } /** * 根據(jù)Session ID強制下線 * param sessionId 會話ID * return 是否成功 */ public boolean forceLogoutBySessionId(String sessionId) { try { Session session sessionDAO.readSession(sessionId); if (session ! null) { session.stop(); sessionDAO.delete(session); log.info(已強制下線會話: {}, sessionId); return true; } } catch (Exception e) { log.error(下線會話失敗: {}, sessionId, e); } return false; } }關(guān)鍵點與避坑指南并發(fā)問題在遍歷getActiveSessions()并執(zhí)行刪除操作時如果會話集合非常大操作期間可能有新的會話創(chuàng)建或舊的會話過期。ConcurrentModificationException是潛在風(fēng)險。一種更穩(wěn)健的做法是先收集需要刪除的Session ID列表然后再遍歷這個列表逐個刪除。通知客戶端調(diào)用session.invalidate()或delete()只會使服務(wù)器端的Session失效。用戶客戶端的瀏覽器仍然持有舊的Session ID Cookie在下次請求前他可能感知不到自己已被踢出。對于追求實時體驗的應(yīng)用可以在踢人后通過WebSocket或Server-Sent Events (SSE) 主動通知客戶端“賬號已在別處登錄”引導(dǎo)其刷新頁面或跳轉(zhuǎn)到登錄頁。資源清理確保SessionListener.onExpiration或onStop中的邏輯能正確處理這種強制失效的情況及時清理與該會話關(guān)聯(lián)的臨時文件、數(shù)據(jù)庫鎖等資源。4.3 自定義Session ID生成與Cookie管理默認(rèn)情況下Shiro使用JavaUuidSessionIdGenerator生成隨機的UUID作為Session ID。Cookie則通過SimpleCookie來管理。有時我們需要定制它們。場景一定制Session ID生成器。比如出于安全審計要求需要在Session ID中嵌入部分可讀信息注意不能包含敏感信息。public class CustomSessionIdGenerator implements SessionIdGenerator { Override public Serializable generateId(Session session) { // 生成一個前綴UUID的組合ID例如 WEB_3f19c83f-... String prefix WEB_; return prefix java.util.UUID.randomUUID().toString(); } } // 在配置中設(shè)置 sessionManager.setSessionIdGenerator(new CustomSessionIdGenerator());場景二精細(xì)化Cookie配置。應(yīng)對安全掃描設(shè)置更嚴(yán)格的Cookie屬性。Bean public DefaultWebSessionManager sessionManager() { DefaultWebSessionManager sessionManager new DefaultWebSessionManager(); // 禁用URL重寫傳遞Session ID更安全 sessionManager.setSessionIdUrlRewritingEnabled(false); SimpleCookie sessionIdCookie new SimpleCookie(SHRIOSESSIONID); sessionIdCookie.setHttpOnly(true); // 防止XSS讀取Cookie sessionIdCookie.setSecure(true); // 僅HTTPS傳輸生產(chǎn)環(huán)境務(wù)必開啟 sessionIdCookie.setMaxAge(-1); // 瀏覽器會話結(jié)束時過期 sessionIdCookie.setPath(/); // Cookie路徑 // 設(shè)置SameSite屬性以防范CSRF (需要Shiro 1.6或通過Servlet容器配置) // sessionIdCookie.setSameSite(Lax); sessionManager.setSessionIdCookie(sessionIdCookie); sessionManager.setSessionIdCookieEnabled(true); return sessionManager; }安全提醒Secure和HttpOnly是保護(hù)Session Cookie的關(guān)鍵標(biāo)志。Secure確保Cookie只通過加密的HTTPS連接傳輸防止中間人竊聽。HttpOnly阻止JavaScript通過document.cookie訪問此Cookie能有效緩解XSS攻擊竊取會話的風(fēng)險。在生產(chǎn)環(huán)境中這兩項應(yīng)該始終啟用。5. 集群環(huán)境下的Session管理從內(nèi)存到Redis單機應(yīng)用的內(nèi)存Session管理很簡單但一旦涉及多實例部署集群就必須解決Session共享問題。否則用戶請求被負(fù)載均衡到不同服務(wù)器會因找不到之前的Session而導(dǎo)致登錄狀態(tài)丟失。Shiro通過SessionDAO抽象了Session的持久化層。默認(rèn)的MemorySessionDAO只存內(nèi)存。我們需要將其替換為支持分布式存儲的DAO最常用的是基于Redis的實現(xiàn)。5.1 集成Redis作為Session存儲首先引入Shiro Redis集成的依賴以Spring Boot為例dependency groupIdorg.crazycake/groupId artifactIdshiro-redis/artifactId version3.3.1/version !-- 注意版本與Shiro、Spring Boot兼容性 -- /dependency然后進(jìn)行配置Configuration public class ShiroConfig { Bean public RedisManager redisManager() { RedisManager redisManager new RedisManager(); redisManager.setHost(localhost:6379); // 可設(shè)置密碼、超時、數(shù)據(jù)庫索引等 // redisManager.setPassword(yourpassword); // redisManager.setTimeout(2000); // redisManager.setDatabase(0); return redisManager; } Bean public RedisSessionDAO redisSessionDAO(RedisManager redisManager) { RedisSessionDAO sessionDAO new RedisSessionDAO(); sessionDAO.setRedisManager(redisManager); // 設(shè)置Session在Redis中的key前綴 sessionDAO.setKeyPrefix(shiro:session:); // 設(shè)置Session過期時間毫秒這里設(shè)置為與全局超時一致 sessionDAO.setExpire(1800000); return sessionDAO; } Bean public DefaultWebSessionManager sessionManager(RedisSessionDAO redisSessionDAO) { DefaultWebSessionManager sessionManager new DefaultWebSessionManager(); // 禁用Servlet容器的Session管理 sessionManager.setSessionIdUrlRewritingEnabled(false); sessionManager.setSessionValidationSchedulerEnabled(true); sessionManager.setGlobalSessionTimeout(1800000); // 使用RedisSessionDAO sessionManager.setSessionDAO(redisSessionDAO); return sessionManager; } }5.2 集群環(huán)境下的注意事項序列化再次強調(diào)所有存入Session的Attribute對象必須實現(xiàn)Serializable。shiro-redis默認(rèn)使用JdkSerializationRedisSerializer要求很嚴(yán)格。你也可以配置為Jackson2JsonRedisSerializer等但要注意類路徑一致性問題。Session過期同步Redis本身支持鍵過期。shiro-redis會在創(chuàng)建Session時設(shè)置一個Redis TTL生存時間。Shiro的SessionValidationScheduler會話驗證調(diào)度器在集群環(huán)境下仍然會運行但它主要是為了調(diào)用SessionDAO的delete方法清理已過期的Session實體并觸發(fā)SessionListener.onExpiration事件。Redis的自動過期是另一道保障。建議將Shiro的sessionValidationInterval設(shè)置得比Session超時時間短一些例如Session超時30分鐘驗證間隔20分鐘以確保監(jiān)聽器邏輯能被及時觸發(fā)。強制下線功能的調(diào)整在集群中forceLogoutByUsername的實現(xiàn)需要遍歷所有Redis中的Session。shiro-redis的getActiveSessions()方法默認(rèn)會返回Redis中所有前綴匹配的Session。在大規(guī)模集群中這個操作可能非常慢且消耗資源。生產(chǎn)環(huán)境應(yīng)考慮其他方案方案A推薦在用戶登錄時將其Session ID與用戶ID的映射關(guān)系額外存儲到一個Redis Hash或Set中。踢人時先從這個映射中快速找到對應(yīng)用戶的所有Session ID再進(jìn)行精準(zhǔn)刪除。這需要維護(hù)額外的數(shù)據(jù)結(jié)構(gòu)。方案B使用Redis的Keyspace通知Key Events。配置Redis在鍵Session過期或被刪除時發(fā)布通知應(yīng)用監(jiān)聽這些通知來執(zhí)行資源清理等后續(xù)操作而不是主動去遍歷查詢。網(wǎng)絡(luò)與性能Session的每次讀寫都變成了網(wǎng)絡(luò)IO對Redis的延遲和可用性要求很高。確保Redis是高可用的主從、集群模式并且應(yīng)用服務(wù)器與Redis之間的網(wǎng)絡(luò)延遲要低。可以考慮使用連接池shiro-redis已支持和合理的超時設(shè)置。6. 排查與調(diào)試Session不聽話時的工具箱即使理解了所有原理實戰(zhàn)中Session依然可能表現(xiàn)出各種“詭異”行為。下面分享幾個排查思路和工具。6.1 常見問題與排查路徑問題一登錄后Session丟失頻繁要求重新登錄。排查點1Cookie路徑與域名。檢查瀏覽器開發(fā)者工具中的Application - Cookies。確認(rèn)Session Cookie的Domain和Path是否正確。例如如果你的應(yīng)用部署在https://app.example.com但Cookie的Domain是.example.com這是正確的子域名共享。如果Path是/admin那么只有/admin下的請求會攜帶Cookie其他路徑的請求就會丟失Session。排查點2Secure標(biāo)志。如果你的網(wǎng)站使用了HTTPS但Cookie沒有設(shè)置Securetrue有些瀏覽器如Chrome新版本可能會拒絕發(fā)送這個Cookie。排查點3跨域問題。如果前端https://ui.example.com和后端APIhttps://api.example.com域名不同屬于跨域。默認(rèn)情況下Cookie不會自動攜帶。需要在服務(wù)端設(shè)置Cookie時指定SameSiteNone; Secure并且前端請求需要設(shè)置withCredentials: true。同時服務(wù)端響應(yīng)頭需要包含Access-Control-Allow-Credentials: true和正確的Access-Control-Allow-Origin不能是*。排查點4Session超時時間過短。檢查globalSessionTimeout配置確認(rèn)是否設(shè)置得太小比如幾分鐘。排查點5集群環(huán)境Session未同步。確認(rèn)請求是否被負(fù)載均衡到了不同實例以及Redis等共享存儲是否工作正常。檢查Redis中是否存在對應(yīng)的Session鍵。問題二getActiveSessions()返回空或數(shù)量不對。排查點1SessionDAO是否正確注入。在非Web環(huán)境或特定配置下SessionDAO可能沒有被正確設(shè)置到SessionManager中。打印sessionManager.getSessionDAO()的類名確認(rèn)。排查點2Redis連接與序列化。對于Redis存儲檢查Redis連接是否正常以及存儲的鍵前綴keyPrefix是否匹配。使用Redis客戶端工具如redis-cli直接查看keys shiro:session:*看數(shù)據(jù)是否存在以及序列化格式是否正確。排查點3權(quán)限問題。getActiveSessions()方法可能需要特定的權(quán)限才能調(diào)用檢查調(diào)用者是否有相應(yīng)授權(quán)。6.2 利用監(jiān)聽器和日志進(jìn)行調(diào)試給SessionDAO和SessionManager增加詳細(xì)的日志級別輸出是追蹤Session生命周期的有效手段。在logback-spring.xml中增加配置logger nameorg.apache.shiro.session.mgt levelDEBUG/ logger nameorg.apache.shiro.session.dao levelDEBUG/ !-- 如果用了shiro-redis -- logger nameorg.crazycake.shiro levelDEBUG/這樣你就能在日志中看到Session的創(chuàng)建doCreate、讀取doReadSession、更新doUpdate、刪除doDelete以及過期驗證等詳細(xì)過程。結(jié)合之前編寫的CustomSessionListener在onStart、onStop、onExpiration方法中加入詳細(xì)的日志輸出可以清晰地描繪出一個會話從生到死的完整軌跡對于定位“幽靈”失效問題尤其有幫助。6.3 一個真實的踩坑案例StopedSessionException有一次線上報警大量用戶出現(xiàn)StopedSessionException。這個異常表示程序試圖訪問一個已經(jīng)被標(biāo)記為停止stopped的Session。排查發(fā)現(xiàn)問題出在一個自定義的Filter中。這個Filter的邏輯是檢查某個請求參數(shù)如果參數(shù)不合法就直接重定向到錯誤頁。問題在于它在重定向前先調(diào)用了一次subject.getSession()來記錄日志。而在某些異常處理流程中Shiro可能會先使當(dāng)前Session失效stop然后才走到這個Filter。此時getSession()會嘗試獲取一個已停止的Session從而拋出異常。修復(fù)方案在Filter中將subject.getSession()改為subject.getSession(false)如果返回null則說明Session已無效不再進(jìn)行記錄操作。或者將日志記錄的邏輯移到更靠前的、Session肯定有效的Filter中。這個坑的教訓(xùn)是在異常處理或重定向的邏輯分支中要謹(jǐn)慎操作Session優(yōu)先使用getSession(false)進(jìn)行空值判斷避免對無效Session進(jìn)行操作。操作Shiro Session從基本的存取刪改到進(jìn)階的全局管理和集群部署每一步都需要對框架機制有清晰的理解。它不僅僅是調(diào)用幾個API那么簡單更關(guān)乎應(yīng)用的狀態(tài)一致性、安全性和用戶體驗。尤其是在微服務(wù)和分布式架構(gòu)成為主流的今天將會話狀態(tài)無狀態(tài)化如采用JWT是另一個趨勢但理解傳統(tǒng)的、有狀態(tài)的Session管理仍然是構(gòu)建穩(wěn)健后臺系統(tǒng)的重要基石。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
综合九九| 九九操久久国产免费视频| 欧美性视频二区三区| 阿姨一区二区免费视频-高清正片西瓜视频下载app-T450AV | 久久久久亚洲Aⅴ无码| 国产精品小视频一区二区三区| 日韩欧美麻豆大片| 亚洲天堂男| 欧美午夜一区二区三区| 国产精品一区二区后入| 亚洲欧综合另类无码一区| 天天透伊人| 人妻娇喘 激情视频| 国产树林里野战在线看| 伊人操操| 岛国激情视频在线观看| 青青草啪啪网| 国产偷拍网站| 九九久久首页| 一线黄色免费性爱片| 欧美日韩人人早| 久操视频在线观看| 东北夫妻性偷拍| 精品国产乱码久久久A| 国产成人bd在线观看| 精品国产72| 激情婷婷综合久久| 欧美九9 9 9| 亚洲欧美97√| 99这里有精品| 啊啊啊啊啊好多水| 91久久精品国产| 色网亚洲人| 91精品伊人久久久大香线蕉91 | 日欧亚洲二三区大片不卡| 加勒比综合九九99视频在线播放| 欧美偷拍| 蜜臀精品1区2区| 麻豆AV96熟妇人妻| 可以免费观看的日韩av毛片| 欧洲精品一二三在线| 亚洲国产欧美另类自拍| 97超碰这里只有精品| 嫩草美女久久| 一区二区播放| 日韩av女优在线免费一区| 97chaopengongkai| 人妻一区二区三区| 日韩性爱网址| 加勒比伊人| 一区 欧美 日韩 麻豆| 夜夜操美女| 熟妇高潮精品一区二区三区下载| 亚洲色诱惑| 欧美九九九九九| 毛片视频白嫩| 可以在线观看的黄色网址| 亚洲大色堂| 麻豆AV一区二区天美传媒| 久久免费精彩视频| 深夜福利黄片| 手机av亚洲丝袜美腿日韩第一页二页| 五月丁香啪啪| 成人小说视频在线精品欧美| 精品二区久久| av在线人气| AA特级绝黄| 午夜传煤十二区精品| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 韩国三级三级BD在线| 国产高清亚洲日韩一区| 91老司机精品| 超碰久久网| 激情五月婷婷| 日本免费中文字幕在线| 91丝袜| 东北女人的毛片| 亚洲aV性爱| 四虎国产成人精品免费一女五男| 2019AV天堂| 美国日韩黄色片| 国产精品爆乳懂色蜜乳| 夜夜嗨一区| 夜夜骑天天燥| 国产AV激情无码久久无码| 99青草| 天天做天天爱天天爽AV| 国产精品高潮久久AV| 婷婷色导航| 无卡一区=区| 99国产精品免费| 中文字幕免费观看| 午夜色婷婷| 欧美变态激情网| 国产精品高清2021在线| 老女人综合| 青青伊人加勒比海| 色综合潮| 人人手机欧洲亚洲国产人妻| 国产精品美女在线一区| 国产高清午夜成人在线观看| 91久久18禁| 中日韩久久久免费看| 自拍偷拍2025在线观看| ji熟女.com| 天天射,天天操,天天爽-国内精品一区二区三区-成人AV | www.色五月| 97AV在线观看| 9久9久9久9久视频网站| 亚洲色图8| 亚洲素人综合| 久久久草成人网站久久久草成人久久久草久久久 | 国产一区二区啪啪视频| 传媒在线观看一区二区三区| 97超碰色屌| 欧美久久九九| 狠狠中文字幕| 日本人妻伦在线中文字幕| 亚洲天天影视色综合| 亚洲。日韩。欧美| 97亚洲一区| 亚洲五月丁香花狠狠干一区二区三区 | 欧美线天码中字| 国产十八禁视频| 舔人妻中文免费视频| 人妻久久久| 亚洲男人的天堂AV| 99久久亚洲精品无码毛片潘甜甜| 亚洲情色综合网| 国产v片在线免费观看| 东京热大香蕉| 亚洲欧洲成人在线电影| 男人的天堂1024| 欧美亚洲系列| 亚洲图片欧美色图| 精品人妻一二三四区视频| 久干网| 日韩精品电影| 色婷婷综合久久久久中文一区二区| 少妇一线天久久久久久| 亚洲精品国产无码高清| yw尤物av无码点击进入麻豆| 男人天堂导航| 亚洲图片偷拍欧美| 999久久芭蕾| 国产精品69久久久久久久| 国产又长又大又粗的视频| 蜜桃臀一区二区aV| 国产精品播放| 日韩偷拍一区二区三区| 亚洲中文字幕久久人妻| 手机在线看片免费人成视频| 国产精品96久久久久久| 在线播放免费av福利片| 国产在线视视频有精品| 盗摄 精品 另类 一区| 第45页一区二区| 欧美 综合 亚洲| 亚洲图片偷拍欧美| 人人人摸人人| 性爱乱伦视频免费| 五月激情天| 丁香五月AV| 麻豆天美制片厂网站视频| 一本一首道人妻少妇免费久久| 99热18这里只有精品| 91四海无码日韩欧美| 久热一区二区| 大香蕉伊人久久| 亚洲aw毛茸茸在线| 91精品国| 久草网站免费在线观看| 亚洲情色电影网| 九九九九一级| www.色吧5.com| 日本高清免费一本视频在线观看| 亚洲黄色视频在线观看视频| 99re久久| 在线情色电影 91大 | 日本韩欧美在线播放a| 九九成人| 中文熟女五十乱码在线| 欧美激情视频在线一区| 午夜精品一区二区三区三上悠亚| 激情综合av| 精品美女人人干| 人人模人人看| 欧美.亚洲.另类.丝袜.制服.诱惑| 国产精品久久久久久久久久久久久久久久 | 久操免费电影| 成年人黄色小视频网站| 激情五月天色播| 四虎在线免费视频| 一区二区影视| 亚洲国产欧美中文永久| 亚洲日韩东京热一区| 乱欲视频| 亚洲 中文 女同| 日韩三级性| 啪啪综合网| 神马视频久久久久久| 艾草av| 久久久天堂| 国产成年免费大片黄在线观看| 蜜桃成人1区2区3区| 狠狠干2020| 国产美女销魂在线观看不卡| 欧美熟妇乱码在线一区| 韩国三级一线观看久| 欧美有码亚洲中文字幕一区二区三区四区 | 免费视频a级毛片免费视频| 日日AV加勒比| 国产传媒午夜理伦精品| 国产精品久久久亚洲一区| 欧美日韩国产精品久久色婷婷| 久久riav中文精品| 成人七区| 久久久婷婷| 蜜臀99久久精品久久久久久| 日本一级性爱| 精品国产乱码久久久A| 日本精品无码三级网站| 四虎免费视频| 欧美日韩另类激情图片| 在线播放成人高清免费视频 | 黄片在线免费在线观看| 日韩熟妇二区| 少妇三P| 亚洲精品一区中文字幕乱码| 亚洲成人妻日韩在线| 久久久久婷婷| 亚洲天堂无码| 91精品婷婷国产综合久久| 欧美日韩婷婷中文| 久热99999| 久操av在线| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 欧美日韩国产色图在线| 久久久成人免费av电影| 无套内射性感少妇视频| 午夜操逼不卡| 成人夜夜爽| 久久六六| 日日骚精品视频| 熟女乱伦二区| 1区2区3区视频| 激情自拍 校园春色| 91五十路| 殴美日韩m| 色妺妺AⅤ| 欧美激情亚洲色图| 91熟女视频网| 国产亚洲日韩在线三区黑人| 亚洲男人bt天堂| 久久99操天天日| 天天操妹子| 乱伦AVxx| 射综合网| 秋霞网—男女啪啪亚洲免费体验区| 精品国产99| 婷婷色综合| 欧美亚性天堂| 日韩成人私密一级精品av| 大香蕉黄色一级片免费看| av天堂5| 热热热热日日漂亮永久永久国产日| 亚洲情色综合| 91九色丨国产丨爆乳| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区 | 99久久com免费视频′| 欧美色图亚州激情| 青青草在线视频播放器| 久久这里精品国产99丫e6| 亚洲精品影视老司机| 蜜臀网 一区| 成人五月天色网| 亚洲日韩美女中文字幕乱| 91日韩网站| 新97国产超碰| 老师充足的奶水小说| 久久三| 亚洲影院无码在线| 男人的天堂VA| 久久日韩肥臀| 一本一道久久综合久久| 久操影视| 午夜性| 午夜免费视频1000| 9久久9综合| 亚洲最大的综合性av| 久久是精品| 91 丝袜在线| 国产99999久久精品| 黑人中出21连凳花野真衣| 亚洲制服欧美另类内射| 日韩簧片免费看| 久久久久久中文| 久久久草成人网站久久久草成人久久久草久久久 | 精品亚洲国产成人精品| 久久久久久久久久久999| 欧美在线天堂| 激情文学网伊人| 日本午夜久久电影| 福利色色| 欧美性爱视频免费一区一A| 手机在线中文字幕国产| 在线中文字幕| 八戒无码国产午夜福利| 久久久久亚洲三级电影| AV天堂国产| 欧洲特黄毛片免费看欧洲毛片| 欧亚三区动漫| 日日97| 超碰97人妻自拍| 久久亚洲欧美一区二区三区-亚洲国产精品第一区二区 | 伦在线97| 麻豆福利视频导航| 在线观看A啊啊啊| 91色鬼| 操逼逼一区视频| 黑人操一区二区| 用力操死我| 精品性爱一区二区| 综合网久久| 冬京热男人的天堂| 色色操| 亚洲黑丝在线| 爱爱动态120秒| 青青爽| 97色论| 欧美色图亚州激情| 欧美亚洲厕所精品偷拍91| 亚洲性少妇| 久久精品日韩专区免费观看| 日韩人妻精品| 久九色| TS人妖另类精品视频系列 | 天天干天天做| 欧美精品另类人妖xxxx| 97欧美精品综合| 人人澡人人弄| 揉揉揉夜夜| 亚洲天堂精品日韩电影| caoni国产亚洲av| av一区二区三区 中文| 色色热| 最近的最新的中文字幕视频| 920日本午夜免费| 亚洲综合小视频小说在线观看| 97超碰超欧美。| 日韩天天综合| 色翁荡息又大又硬又粗又爽| 色综合久久888| 亚洲综合另类欧美久久久| 96久久久精品| 九九九九九九九九九国产精品| 2017av无码免费无线播| 国岛片视频| 91n美女视频| 亚洲成人综合在线| 开心五月婷婷激情| 婷婷视频在线免费观看| 婷婷综合在线| 人人摸人人干| 蜜臀久久久99久久久久| 伊人网一本| 青青草依人大香蕉| blacked精品一区国产| 国产www色在线观看| 91爽啪| 亚州综合图片| 久久久久久999| 麻豆国产视频精品观看| 国产免费一区二区在线A片视频| 亚洲综合码| 99操逼| 超碰成人公开| 久久精品天美| 天美传媒精品久久视频| 丰满人妻无码一区二区三区| 日本99视频| 女生自91网站| 操淫穴亚洲五月丁香| 天天爽夜夜爽夜夜爽精| 中文字幕一区二区三区人妻少妇在线| 中文字幕后石码三区四区| 亚洲一区中文字幕久久,果冻传媒一区二区天美传媒 | 亚洲情色五月天 | 蜜臀久久99精品久久久久免费观| 亚洲AV无码黄色强奸| 无码人妻一区二区一牛影视| 97超色| 97综合国产| 天天综合色图| 久久久久女教师免费一区 | 国产精品亚洲无码| 天美麻豆精品视频99| 日韩在线观看AV| 无码丰满熟妇一区二区浪潮AV| 久久精品店| 97日视频| 日本性爱欧美性爱| 超碰夫妻97| 日韩视频精品在线观看| 人妻在线臀日韩| 91综合在线| 中文字幕第页| 国产女大学生AV| 97中文天堂| 女人综合网| 九九在线视频| 欧美综合91| 96精品在线| 亚洲超碰97| 日韩99神马视频播放片在线播放| 欧美超碰在线| 亚洲男人天堂网久久| 啊啊啊想要| 内射日韩大臀美女| 78操B| 久操精品网| 极品人妻少妇综合| 久久久影院| 国产精品不卡高清在线观看| 人妻社区男人天堂| 精品性爱一二三区| 久久久青青草| 97网址www| 四虎午夜影院| 日本一久是| 色婷婷综合网| 清纯唯美激情| 操一区| 国产精品嫩草久久久久| 伊人影院日本| 欧美日韩性感| 亚洲精品国产无码高清| 精品人妻一二三四区视频| 777奇米影视777四色| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 校园春色亚洲| 蜜臀久久99精品久久久久久酒店| 黄色不卡视频| 嗯嗯啊啊操死我| 国产2.3.4区| 欧美日韩系列| 欧美精品成人亚洲| 被窝影院午夜看片无码| 96精品久久久久中文字幕| 日本一区二区亚洲综合| 国产精品第二页| 丝袜综合网| 国产亚洲日本| 伦激情人妻另类人妻| 亚洲日韩av专区无码| 欧美91久久久久| 日韩欧洲操屄视频| 亚洲凸凹超碰成人| 91neishe| 在线播放免费av福利片| 成人天天爽| 久久久久久久一级黄色打同平台| 日韩国产在线观看av| 另类欧美色| 欧美一区二区情色| 99色在线视频| 7777奇米影视久久| 午夜精品久久久久久久久久久久久 | 美女诱惑爱爱| 狠综合网| 日本加勒比无码专区一二三| 99e久久国产精品| 91网站18+| 综合操逼| 亚洲区 欧美区| 欧美一二在线| 中文字幕一区 二区三四五 区日 日骚| 综合熟妇一区二区三区| 麻豆天美电影一区二区| 在线观看黄色电话| 把腿张开老子CAO烂你| 亚洲丝袜少妇在线| 欧洲自拍第一页| 国产丝袜美女诱惑| 69人妻精品一区二区绯色| 亚洲第一视频 欧美风情 日韩| 99精品在线| www.超碰| 人摸人人操人| 欧美性生活男人的天堂| 97超碰日韩| 久草综合网| 99re这里只有精品3| 青青操青娱乐| 婷婷色婷婷| 波多野结衣先锋影音| 中字幕人妻一区二区三区| 亚洲国产综合图区中文字幕| 97超碰超欧美。| 日日日啊啊啊| 嗯嗯啊在线视频| 欧美做爰无码A片视频| 男女做爰猛烈动高潮A片免费应用 少妇厨房愉情理伦片bd在线观看 不卡中文字幕aⅴ在线 | 欧美精品三级黄片| 美女刺激久久国产欧美| 综合色啪| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 操操操操操操| 亚洲丰满很很操| 91w欧美| 97超碰9| 夜夜嗨免费视频| 60秒试看最爽10分钟网站| 亚洲精品久久久久久久久豆丁网| 亚洲,欧美,春色,另类 | 美骚妇av高清在线| 日韩精品电影| 免费精品福利在线观看| 人人潮人人摸| 日韩在线性爱免费视频| 18禁网站在线播放| 亚洲成人久久美女| 黄污污污污| 亚洲欧美中日韩| 91色综合激情| 亚洲欧洲无码一区夜| 日产成人久久| 东京热大香焦| 日本不卡一区二区三区| 精品日日人妻| 美女裸体无遮挡永久免费观看网站| 久久婷婷电影网| 久九九九九九九九热| 日韩无码服务区| 日本久久超碰| 思思热久久成人| 国产视频一区二区免费| 青青草日韩无码| 国产按摩一区二区三区| 嫩草伊人久久精品| 97久久超碰亚洲| 国产高清成人免费视频| 欧美一级久久久丰满| 天天干天天燥| 午夜福利国产欧美日韩夜夜| 美中日韩无码| 高清不卡国产| 曰本特级特黄特色黄色A级网站高清在线免费看 | 国产农村妇女一区二区| 伊人久操| 婷婷激情一区二区三区俺也去| 999九九精品| 殴美色网| 97人人夜| 天天搞在线综合网| 久久久影院| 中文字幕亚韩| 国产无码精品成人| 夜夜高潮夜夜爽| 色天堂在线观看| 精品无码一区二区三区| 亚洲人综合19| 亚洲色图图片| 嗯啊啊啊轻点视频 | 精品免费一区| 91丨熟女丨丰满熟女| 欧美顶级黄片AAAAA在线免费看| 97九色人妻| 亚洲人妻久久久| 国产中文字幕在线点播| 久久草草欧美精品| 日韩91网| 人人射人人操人人摸| 少妇69中文| 91男女| 精品国产一区二区三区香蕉欧美| 夜嗨影院| 歐美性天天| 韩国一级婬片A片AAAAA| 天天做日日做| 天天舔九色婷婷| 国产精品97超碰| 天堂а√在线最新版在线| 天美av在线观看| 综合亚洲欧美| 99热在线播放| www.成人无码| 超碰成人公开| 日欧毛片久久| 26uuu欧美日韩| 欧色综合| 亚洲风情综合网| 男人的天堂va| 青青草天天亲夜夜操网| 国产精品第一页国产大屁股视频免费区i| 色欲三区| 人人搡人人肉久久精品| 特色a在线上| 少妇超碰在线| 五月婷亚洲精品天堂| 国产精品久久久亚洲一区| 欧美色图在线视频少妇| 久久精品店| 五月天婷婷欧美三区| 国产AV天美传媒一区二区三区 | 5278欧美一区二区三区| 大但人体久久久久| 日韩人妻一二三区视频| 欧美青青视频| 人妻乱仑一区二区三区| 97操碰| 久久精品国产亚洲AV无码电影| 操少妞在线视频| 秋霞曰韩R级| 校园春色宗合网| 无色无码| 欧美熟妇色| 亚洲天堂99| 蜜臀久久99精品久久久久久| 亚洲中文字幕有码视频一区二区三区| 97超碰磁| 日日碰视频网| 九九热视频在线观看| av天堂加勒比| 日本黄 R色 成 人网站| 99久久久无码精品国产人| 国产精品久久久| 好淫网一二三视区| 亚洲伊人a线观看视频| 日本黄页视频在线观看| 99热精品在线播放| 91久久婷婷| 亚洲AV乱码专区国产噜噜亚洲| 国产成人 综合亚洲 天堂| 日影院久久婷婷夜夜网| 婷婷久草| 天堂无码| 91精品少妇搡搡搡| 91碰碰| 九九热AV| 亚洲人精品午夜不卡| 久久,精品一二三| 北条麻妃99精品青青久久| 99爱久久视频频| 91女人的网站| 五月天色电影| 中英熟女操女| 国模限制级电影| 人人操人人摸人人骑| 老熟女熟妇| 秋霞曰韩R级| 精品人妻少妇| 亚洲熟久久| 亚州精品一区二区三区香中文字幕在线| 亚洲精品成人动漫在线| 天天欲望网| 色香在线| 99精品丰满人妻无| 强奸a片网| 中文字幕AV乱伦| 欧美姓爱综合网| 超碰97首页| 在线女人91| 99热这里是精品| 国产精品视频麻豆入口| 天天肏天天干| 精品丰满熟妇人妻一区| 97在线观视频免费观看| 好淫网一二三视区| 超碰狠狠操| 亚洲砖码砖专无区2023| 日本精品一区二区中文字幕| 涩涩涩综合| 日韩ab网| 91干熟女| www.av家庭乱伦| 一区二区三区四区久久视1| 欧美 日韩 亚洲 春色| 日本人妻天堂网站在线播放| 综合影视国产无码| 97人人色| 中文字幕88av在线| 97在线视频观看网站| 中文字幕欧美日本乱码一线二线| 色婷婷狠狠| av一区二区三区不卡| 十八禁黄色成人网站观看| 日韩免费性爱视频在线观看| 久久久久久久唑| 试看60秒| 一本正道久久熟女| 久久无码电影| 97超碰香蕉| 物业黑人 AV一区| 欧美性爱一区二区三区四区| 粉嫩不卡一区二区性爱| 岛国色情视频在线观看| 香蕉视频精品亚洲一区二区三区在线播| 三上制服丝AV| 韩国久久97| 国产AV高清AV无码| 亚洲精品aa久久伊人| 欧美亚洲综合高清在线| 亚洲drav色图| 精品人妻一区二区三区-国产| 国产67194| 亚洲夜夜欢无码一区二区| 国产高清MV操逼视频| 亚洲欧洲无码bt精品合集| 四虎884| 一区,二区,三区视频| 欧美日韩情色一区二区| 黄色乱论网站| 黑丝少妇麻豆| 二三四区精品| 欧美日韩青操| 啊啊啊啊啊啊啊啊要喷了| 夜夜骑操视频| 加勒比综合九九99视频在线播放| 日本特黄f c2| 中文字幕乱碼在线| 9ⅰ久久久天天| 久久精品区| 久久这里只有精品9| 亚洲男人的天堂va亚洲男人社| 伊人久久亚洲色欲综合网站| 91精品国产长腿丝袜美女| 国产精品一区二区麻豆| 91九色丨国产丨爆乳| 婷婷国产精品九区| 亚洲成人av色网| 色五月婷婷五月天| 激情五月天丁香| 五月激情影院| 大香蕉免费中文| 黄片直播三级黄片两女一男| 久久久性| 在线岛| 亚洲欧美精品一区天堂久久| 嗯嗯,啊啊,国产精品| 亚洲欲| 97亚洲在线| 岛国免费视频在线| 熟女精品一区二区三区| 青木玲在线不卡| 欧美在线天堂| 国产女性无套 免费观看| 啪啪免费| 清柠毛片| 亚洲色图欧美色18直播在线| 国产精品久久久| 免费看欧美美女黄色大片 | 欧美专区在线| 欧美 亚洲| 九九热久久99精品re| 清柠毛片| 色图综合| 亚洲AV成人无码一区二区三区在线观看| 欧美精品久久96人妻无码| 9久久精品| 最新国产精品久久精品| 粉嫩av一区二区三区四季| 亚洲国产精品99久久久| 亚州综合电影| 欧美亚洲色图另类国产| 欧美性,亚州色| 欧美人妖内射| 久久性视频| 亚洲欧美日韩不卡人妻| 多乙久久久久久| 九九玖玖精品| 九九九九九九九九九国产精品| 啪啪资源网| 伊人伊人LD| 中文字幕一区二区日韩网| 欧美日韩国产中文精品字幕自在自线,| 激情婷婷丁香网| 色色国产| 国产a片操逼| 大香蕉综合| 春色91| 尤物AV免费网站| 嫩草 我啊~嗯~在线| 久久女同性恋一二区| 操逼内射干逼白丝91| 黑人中出21连凳花野真衣| 男人的天堂com| 日本狠狠干| 五月天婷婷在线看| 综合欧美色图| 精品国产网站| 不卡啪啪视频| 亚洲欧美色图小说| 成人五月天色网| 91在线|亚| 欧美激情另类一区二区| 成人青青草原伊人| 亚熟hd视频在线| 欧美99热| 日本天天操| 国产精品视屏| 97伊人超碰| 超碰综合色| 99丝袜福利在线播放| 午夜理论片在线观看免费| 深夜激情| 亚洲清纯唯美| 黄色不卡视频| 极品粉嫩一区二区| 秋霞无码av鲁丝片一区| 春色综合网| 亚洲天天艹| www.狠狠| 免费看日本操逼视频| 一道α片欧美| 欧美不卡五十路| 精品福利| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区 | 92人人操人人| 91c色| 国产亚洲精品av一区| 91午夜无码| 一区二区三区在线美女| 国产欧美另类久久久精品课程| 欧美人妻中出| 精国久久一区二区三区98| 九九九久久久久| 婷婷精品国产欧美精品亚洲人人爽| 99re6久热只有精品6在线直播| 大屁股xxxxx| 中文字幕AV片| 91啪9色| 国产亚洲欧洲在线观看| 亚洲区限制级| 日韩欧美久久婷婷网站| 亚洲精品1区| 日韩中文字幕宗合在线| 熟女熟妇一区二区三区视频| 在线看污网站| 欧美呦呦性爱| 欧美天天干| 91大胆欧美| 乱码熟妇人妻久久久| 制服丝袜第二页| 久久大黄片| 亚洲一区二区中文字幕| 欧美日韩国内不卡| 激情四射婷婷四五月天| 九九免费影片| 高颜值美女口爆高潮浪叫| a男人的天堂久久一级A毛片| 久操网视频| 亚洲乱色视频一区、二区在线| 风月影院男女十八禁| 中国一级αV| 日本一本道A级黄色毛片试看60分钟| av天天在线观看| 九九九九一级| 久草在线| 中文字幕日韩综合| 久久精品操| 亚洲午夜福利在线影院| 精久久久91| 人人干人人操人人爱| 91人妻少妇| 欧美中文字幕男人天堂久久精品| 欧美骚少妇| 日韩女模中文造逼| 欧美激情黑人| 探花一区在线| 91精品久久久久久77777| 亚洲图片激情综合另类| 69AV女优男人的天堂| 97天天| 精品视频久久久久九九九九9999| 熟女精品日韩一区二区三区 | 黄色工厂这里只有精品| 亚洲精品白浆高清久久久久久| 激情五月综合网| chaopen97久久| av国产无码| 91精品操美女| 亚洲国产精品久久久久久久久久| 蜜桃一区二区三区| 久久一区二区高清免费| 午夜视频久久久| 精品少妇一区二区三区免费观看| 夜夜躁狠狠躁日日躁av| WWW4虎| 久久六六| 校园春色家庭伦理欧美激情| 欧美日韩操逼嗦吊| 尤物av网站免费在线播放| 嫩草伊人久久精品| 免费精品人妻一区二区三| 啊好爽快点-国产一区二区三区撒尿在线-成人AV | 天天爽夜夜欢视| 太久视频| AⅤ片水多多| 天天综合欧美综合| 亚洲脚交| 国产一区二区欧美日本| 67914在线兔费成人视频| 久草午夜| 亚洲图片在线| 丁香五月婷婷啪啪| 综合网亚洲1| 午夜欧美J进J出白浆流出久久久 | 日韩AV一区二区三区四四| 91性色| 91在线视频免费中出| 在线观看色视频| 久久大黄片| 四虎影视欧美| 玖玖爱伊人玖玖爱| 97国产天堂岛| 国产免费永久精品无码| 91亚洲色人| 欧美五十路熟| 91色色综合| 四月丁香婷婷| 1区2区3区在线视频| 竹菊影视国产一区二区| 亚洲制服aⅴ中文字幕| 亚洲无码一区成人免费午夜| 久热大香蕉网站| 欧美日韩人人精品| 日本综合色图| 免费αV在线视频| 欧美激情久操网| 97在线观看免费视频| 91制服丝袜中文字幕| 唯美清纯 妖精视频| 91爱看| 亚洲欲| 蜜桃臀AV在线| 插插综合网天天影视网| 91在线丝袜| 超碰人人干天天射| 亚洲在饯| 久久久日本电影| 一区二区高清视频| 日韩欧美福利视频看看| 搡老女人老91妇女老熟女| 无遮挡男女激烈动态图| 思思视频免费看网站| 亚一综合久久久久久久久久| 国产成人www免费人成看片| 澳门特级毛片免费观看| 久久99视频| 亚洲 日韩 欧美 国产综合体| 青青草视频爽一爽| 97超碰碰碰| 91天堂视频| 国产怡红院| 亚洲精品97在线| 亚洲十八禁止| 酒色综合网| 狠狠中文字幕| 国产精品电影| 青青欧洲黑| 亚洲欧美电影| 国产精选三级在线观看| 色五月婷婷久久| 日韩资源网| 男女啪啪啪18禁网站| 色网在线视频观看免费| 青娱乐 成人娱乐在线| 青青草AV色| 正在播放国产精品一区| 日本一区三级韩国| 大干人妻| 国产成人午夜视频网址| 97亚洲一区| 丰满欧美放荡少妇在线| 亚洲第一免费视频| 高跟伊人julia ann| 大香蕉久久| 中文字幕啊啊啊在线观看视频| 精品9999| 国产午夜精品理论片a大结局| 九月色婷婷| 99re在线视频这里只有精品| 亚洲AV成人精品网站在AV| 97人妻色| 亚洲欧美在线丝袜| 色色色色网站| 亚洲第一页综合在线| 性色av大全| 欧美嗯啊……在线观看视频免费| 欧美天天搞| 综合熟女| 97综合| 亚洲男人天堂2012| 人妻久久一区二区三区| 亚洲日本韩国极品一区二区| 亚洲欧美另类激情小说| 伊人成人中文字幕久久网| 亚洲男人天堂视频| 另类图片五月天| 伊人一区二区在线播放| 日韩色女精品| 久久久无码国精品无码三区三区| 亚洲天堂2020| 97 国产一区| 久久婷综合| 亚洲精品97| 久久大香蕉手机高清视频| 中文字幕欧美丝袜07资源| 熟女天天干| 999亚洲国产视频| 2017天天拍大香蕉| 欧美伦乱爱| 五月天激情四射| 激情抓乳插进去啪啪啪日韩 | 精品国产丝袜一区二区三区乱码| 丝袜AV一区二区三区| 中文字幕艹艹| 免费视频在线观看啊啊啊啊啊| 欧亚在线视频| 88xx成人精品视频| 欧美成人色| 粉嫩在线一区二区懂色| 2020中文字幕在线| 人妻在线大香蕉| 久久人人爽人人爽人人片Ⅴ| 免费成人在线观看91| 白嫩妹子国产骚| 性爱AV天堂| 免费观看啪视频| 人妻一二三区| 日本不卡三级网在线播放| 91|九色|国产熟女| 欧美天天干| 色香欲天天天天综合色| 五月天综合网| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 1769一区| 大香蕉伊人75| 另类小说欧美激情校园春色| 青青草在线视频美女| 亚洲文学偷乱拍啪啪啪啪| 亚洲永久AV无码精品秋霞| 97国产亚洲中文在线| 丁香五月影院| 男人的天堂2018东京热啪啪啪| AV电影在线播放| 天天影视网综合少妇| 国产农村妇女精品1区二区| 91最新综合| 婷婷香网站| 老鸭窝成人| 麻豆熟妇乱妇熟色A片在线看 | 久男人久久| 男人天堂毛片| 97这里只有精品| 国产老太乱伦一区| 亚洲三区视频| 97人妻碰碰中文无码久热丝袜| 日韩在线观看中文字幕视频| 六月激情婷婷| 精品久久視頻在线| 亚洲精品国产精品乱码不卡| 97网址97| 亚洲熟女乱色一区二区三区 | 波多野42部激情无码喷潮| 人人操人人干网页| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 男人的天堂VA| 探花视频免费观看国产专区| 精品中文字幕第一页| 91GD.COM| 色呦呦、国产精品| 欧美三四五区| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 天天肏视频| 色欲日韩欧美在线一区| 亚洲国产剧情少妇激情| 长久操视频| 1人人看人人摸人人操| 老女人日韩美91| 亚州五月| 亚洲国产午夜真人一级片中文字幕精品黄网站 | 欧美1727免费观看视频| 天天综合网~91入口| 国产毛片片精品天天看视频| 人妻在线视频| 国模91| 18禁免费视频| 裸体女人草逼视频播放一区,二区,三区,四区,五区 | 99精品在线播放| 97超级久久| 99精品网| 久久久久夜夜夜夜| 狠狠干狠狠色| 蜜桃传媒视频第一区入口在线看| 嫖老熟女A片一二三区| 男人的亚洲天堂| 熟女被操视频网址| 久久三区四区| 奸色色 男人天堂 天天射| 亚洲熟女av中文字幕| 天天看天天综合成人网| 人人看黄色视频| 97人人模人人爽人人| 一级黄色性爱A级片| 美女AV一区二区| 无码聚合| AV天堂因数| 亚州精品丝袜-不卡成人免费| 你懂的在线观看区国产| AV丝袜少妇| 久久精品国产亚洲AV无码电影| 伊人久久亚洲色欲综合网站 | 韩国一级做A片免费的| 日韩成人人妻网站| 国产亚洲99久久精品| 激情小说图片亚洲首页| 98福利在线视频| 亚洲色堂免费视频| 可以在线观看的黄色网址| 大粗鳼巴久久久久| 操人妻逼91| 一区二区激情国产熟女 | 欧美最大综合网| 你草精品在线视频| 91成人在线免费视频| 天天看天天日天天操| 麻豆色约约| 久久鲁夜| 色综合一区二区三巨| 色99在线| 日韩乱插| 中文字幕日韩人妻视频一区二区三区| 大香蕉淫人| 日夜尻逼网| 免费网色网站| 荡小穴在线观看| www网站黄| 国产精品无码av| 成年人三级黄色片视频| 麻豆精品一区二区三区四区免费观看| 欧美高潮| 国产精彩女在线观看视频| 98福利在线视频| 欧美中文字幕一区| 日韩乱伦视频| 日韩啪啪视频| 99热综合| 色色亚洲| www激情| 67914亚洲精品| 中文字幕91综合| 无码免费一区二区三区啪啪| 玖玖视频在线资源一区二区三区| 国产精品色色| 黄色大片一区二区密桃丝袜| 91在线美女| 麻豆性爱视频在线播放| 亚洲男人天堂网久久|