久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

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
返回資訊列表
污到发麻的视频 国产| 91精品微拍福利| 少妇熟女1区2区3区| 精品无码不卡视频| 伊人青青一区成人视频在线观看区| 丁香成人五月天| 东京热av男人的天堂| 曰本道人妻久久久在线不卡色视频 | 国模不卡| 日韩无码久久熟女一级片| 亚洲国产成人精品女人久久久| 超97在线精品视频| 精品一区96| 日本高清视频在线观看黄已三辽| 99国产在线 精品 视频| 国产传媒日韩| 亚洲日韩国产欧美综合v| 国产农村妇女精品一| 蜜臀久久久99久久久久 | 桃色五月天| 日韩二区三四区五区六区在线看| 国产人妖视频一区在线观看| 超碰97最新人妻| 超碰人人干天天射| 五月天偷拍| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 我想要 啊 啊 啊| 午夜理论片在线观看免费| 大香蕉伊在线久草麻豆天堂故事| 午夜九九九九九九| 日本人体九九九九九九| 99999精品| 激情五月天婷婷| 99999久久精| 人妻精品视频一区二区| 亚洲情色 自拍| 欧美性爱十八禁| 国产久久久久影院老熟女| 国产探花日韩援交| 风骚少妇视频中文字幕| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | www被窝色com| 五月婷婷无码| 九九九精品成人免费视频小说| 人妻天天爽夜夜爽爽| 97在线欧| 久操99| 九热久| 亚洲欧洲网站免费观看| 0755午夜福利视频| 九九久久久久久爱| 风流老熟女一区二区三区l| 天天插天天操天天摸天天射天天看| 51一区二区三区| 呻吟 欧美 日本 中出| www.人人cao| 欧美熟妇精品黑人巨大91| 青青国产精品在线| 成人性爱免费播放| 色香综合天天影视综合| 国内三级自拍小视频在线观看| 夜夜高潮夜夜爽国产伦精品| 欧美成人9797| 激情国产乱伦Av| 后入式999| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 精品超碰国产| 中国操逼无码| 美女爽爽爽刺痛洞洞| 久久婷婷精品| 另类一区| 日本不卡一二区| 天堂国产AV| 亚洲 国产 精品一区| 精吧天堂| 青青草视频爽一爽| 中文字幕在线日亚州9| av网站在线看| 久久日韩肥臀| 激情久久日韩精品中文字幕麻豆| 好爽,再快点啊哈嗯嗯嗯嗯| 激情视屏国产乱伦强奸| 欧美性生活免费网| 蜜臀99久久精品| 精精夜夜| 97网址www| 欧美强奸乱能| 91五月天| 人妻性爱一区二区| 91痴汉| 免费9 1久久| 操屄日韩| 日韩成人午夜精品久久高潮| 丝袜综合| 欧美熟妇视频| 色婷亚洲五月在线观看| 国产亚洲精品美女久久久久久2021| 一区超碰一区| 99在线免费公开视频| 欧美极品色| 六月色婷婷| 成人97人人超碰人人| 97久操| 加勒比日本在线| 在线观看AV不卡| 国产精品岛国片在线观看| 亚洲中文人妻色| 六月丁香啪啪啪| 麻花传媒免费网站在线观看| 放黄片放3级黄片没穿衣服| 日韩精品作爱导航| 中文字幕丝袜人妻| 久久久久久久久久久999| 亚洲精品第一| 日韩精品一区二区三区色欲| 看日韩操逼| 人人操人人93| 久久岛国| 四虎在线观看视频| 欧美色女人| 九九无码| 国产成年女黄特黄| 超碰成人人人爽人人爽| 亚洲久久久| 欧美日韩另类激情图片| 99re欧美| 久久久久免费看少妇A片特黄| 欧美78P| 国产精品亚洲日韩骚欢乐谷最新地址发布页huanieguty性屋娱乐妖精视频 | 激情综合 婷婷五月 红杏| 射 色综合| 超碰亚洲欧美日韩无| 国产精品伦理| 青青草在线成人视频| 伊人操操| 骚逼高潮久久精品| 国产欧美另类久久久精品课程| 午夜福利 成人 91| 国产成人五月天丁香花| 美女久久久久久久久久久| 亚洲乱熟女一区二区| 色综合20p| 久久久久幕乱码| 天躁夜夜躁2021| 欧美日韩久久精品爱爱| 国产二区三区免费视频| 久久av成人无码免费| 91高清无码下载| 中文字幕成人理论在线| 色婷婷狠狠| 欧美亚涩| 久久九操在线观看| 日韩91网站| 26uuu成人影片| 国产操逼逼网| 超碰79人人乐| 日韩一级二级在线| 日本少妇va7777| av午夜玫瑰| 4虎在线视频| 91超碰人人| 久久性爱大全| 日韩高潮一区| 啊啊啊啊啊啊啊在线| 亚洲国产97在线精品一区| 97chaopengongkai| 欧美少妇性爱网站| 天天影视综合网欧美精品| 亚洲中文电影| 91精品人妻偷情| 日本加勒比无码专区| 国产精品不卡一区二区三区av| 蜜臀无码视频在线观看| 97人人模人人爽人人| 五月天色图| 97超碰免费人人性爱| 色阁阁AV综合网| 91色狼| 操逼www.| 99精品热| 亚洲九九九九| 伊人午夜福利视频| 国产高清成人传媒影视| 婷婷在线视频| 精久久久| 1000部熟女视频在线观看| 91成人久久| 国产怡红院| 中文字幕欧洲有码| 日韩精品碰碰| 日韩97视频!在线| 一本一道久久综合久久| 夜夜影视四色| 狠狠做深爱婷婷久久二区| 嗯嗯啊啊好爽| 亚洲情色第一页| 97在线亚洲| 最近二区三区视频大全| 九色97| 青青草大香蕉在线视频| 99这里只有精品国产| 亚洲91极品| AV在线资源| 欧美综合国产精品久久丁香| 亚洲码和欧洲精品激情系列| 天天夜躁日日躁狠狠2002| 十八禁的黄污污免费网站| 中文字幕日产av人| 少妇一级婬片免费放一级a性色.| 91色碰| 色臀aV| blacked精品一区国产| 欧美亚洲第1页| 国产怡红院| 天天干1区2区在线| 91精品国产91久久青草| 色婷婷99| 狠狠躁日日躁夜夜躁A| 亚洲精品91| 久久女婷| 极品出轨视频网站| 国产激情久久久| 日本999精品| 欧美91精品国产自产| 欧美日韩操逼嗦吊| 天天操天天干美女网址导航| 午夜视频久久久久一区| 亚热日本熟女| 国产懂色精品国产av| 亚洲AV人人澡人人爱| 在线观看日韩av不卡| 热热色色综合| 婷婷91| 97超碰免费人人性爱| 可以在线观看的黄色网址| 婷婷丁香一区二区三区| 日韩精品中文字幕一| 婷婷五月天无码| 欧美成人精品欧美一级乱黄一区二…| 97干色天堂| 中文字幕性感少妇av| 男人的天堂在线| 天天看天天日| 精品人妻1237| 国产女s强制榨精视频| 国产在线精品偷| 91在线一起| 情侣开房子拍 日韩无码 女的很漂亮| 青青草在线视频播放器| 亚洲精品三| 亚洲视频中文一区| 欧美肥臀在线| 人妻丝袜无 码视频专区| 无码人妻1727| 超碰伊人在线| 青青网三级视频| 色色网91| 国产精品9999| 国产传媒美日韩av| 亚洲综合色婷婷| 三上悠亚在线毛片91| 97精品国产手机| 我爱大香蕉| 日韩在线地址一| 神马久久久久久久久久久久| 青青草天天亲夜夜操网| 国产操逼网站亚洲一级黄色| 欧美色图20P| 安徽熟妇视频| 麻豆精品久久久久久久| 国产亚洲精品第一最新| 亚洲色婷婷久久久综合日本| 色777999综合| 91欧美高清| 东京热熟女亚洲视频网站| 婷婷中文网| 操逼无码操逼| 亚洲欧美日韩偷拍色图| 久热精品在线| 色悠久久久av| 成人影 天天操 亚洲| 美中日韩无码| 久久久999| 丰满人妻一区| 夜草欧美| 国产美女激情| 亚洲官网在线| 欧美日韩国产中文精品字幕自在自线, | 日韩欧美成人性爱在线| 日韩有码 一区二区三区| 女上位精品在线| 黑丝日韩av丝袜av| 国精品一区二区三| 最新加勒比丝袜在线| av一区二区三区不卡| 亚洲资源一区| 69AV女优男人的天堂| 黑人白女精品一区| 日韩欧洲操屄视频| 蜜桃视频啊啊啊啊| 91草草草| 97久久国产精品| 狠狠操狠狠| 开心五月婷婷激情| 黄片免费看黄片免费看| 国产乱伦性爱区| 中文字幕av亚洲精品| 欧美色另类| 亚洲色图欧美色18直播在线| 黄页网站成人免费| 天天内射| 国产精品高朝久久久久久久| 国产中文字幕在线观看| 夜夜操一区二区| 精品96久久| 免费成人在线熟妇网| 久操高青| 久久做97| 国产91影院| 日韩欧美女求操每天更新| 亚洲综合另类色图| 久热色情精品| 欧洲亚洲天堂精品| 狠狠干妹子| a人欧美综合天堂麻豆| 99国产精品免费| 精品一区二区三区四区外站| 日本999精品| 美女丝袜激情小说| 日韩欧美天天爽爽爽天天爽爽| 久草精品视频| 91欧| 亚洲人妻久久久| 一卡二卡三卡| 人人妻人人澡人人爽久久av| 天堂性色| 黑人美精品 A片| 久久久网站| 亚洲熟妇丝袜在线观看| 中文97国产| 麻豆人妻偷人精品无码视频| 成人性交免费视屏| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 91丨九色丨大屁股| 欧洲综合视频| 久久精品99久久久久久| 后入人妻一区| 澳门人妻久久| 内射黑人| 少妇熟女视频一区二区三区| 久久久久九九九| 干我久操| 无码聚合| 亚州久久9| 亚洲激情深爱文学小说网站| 97视频免费播放| 一区操逼| 丝袜大香蕉| 欧美另类自拍| 男人天堂网手机版婷婷| 亚洲 欧美 日韩 国产一区二区| 日本三级一区二区 在线| 丁香九月激情啪| 超碰97在线 欧美 国产| 99黄页网站| 酒色综合网| 在线观看一级α片刺激高潮视频| 五月天开心网| 一区 欧美 日韩 麻豆| 免费草草草草草视频| 大色综合| 粉嫩绯色AV一区二区在线| WWW4虎| 色婷婷一区二区三区久久午夜 | 青娱乐手机日韩在线视频| 亚洲视频精选| 成人午夜视频免费播放| 国产精品电影推荐| 国产精品欧美在线观看 | 九九热精品| 日韩无码久久熟女一级片| 久久九色| 色婷婷九月| 使劲用力艹少妇视频一区二区 | 欧美性爱18观看| 98久久| 久久久久久久国产视频| 久久97| 亚洲熟妇综合久久久久久| 边做饭边操逼逼| 亚洲av在线免费观看| 少妇超碰在线| juliaann丝袜| 秋霞无码av鲁丝片一区| 97免费视频网| 蜜臀va69| 狠狠色色| 亚洲少妇自拍中文字幕懂色| 日韩丝袜二区| 亚洲色图综合网| 欧美日韩国产黄色片| 99热精品青草在线| 2025年A片视频精品| AV天天综合| 91n处女在线观看| 成人性爱电影一区二区| 一二三四区电影| A片 AV一级在线播放观看免费 | 亚洲另类电影| 亚洲清纯综合| 三级三级三级日本99| 久久东京热成人| 国产福利影视| 久久久日本电影| 五月综合激情| 清纯唯美亚洲综合| 超91综合网| 2024黄色视频| 97爱b| 国产久久av| 欧美体内射精| 精品性爱无码在线播放| 特污精品女优骚货黄色视频在线免费观看| 国产亚洲99久久精品| 性爱av在线免费观看| 久操| 激情综合97| 69av一区二区三区| 激情综合网一盗摄| 丁香六月激情综合| 肏逼视频日本| 欧美亚洲厕所精品偷拍91| 麻豆国产精品午夜视频| 超碰久久草| 日本国产欧美高清在线| 91 丝袜在线播放| 天天射夜夜| 美国一区二区三区视频| 久久人妇| 日韩啪啪啪啪啪| av中亚| 久草男人天堂| 久久一二三四五六七八九区区区 | 草草影院日本第一页| 国产欧美日产一区二区三区 - 国产欧美日 | 久久东京国产精品视频| 人人摸人人入| 欧美日韩国产色五月综合在线| 一区二区三区精品黑丝白丝酒店对鸡| 色婷婷六月丁香七月婷婷| 天天干夜夜肏| 精品国产一级久久| 51久久夜色精品国产麻豆| 欧美日韩精品青青| 婷婷五月色| 国产精品无码av嫩草| 清纯唯美综合| 伊人大香蕉在线| 另类 日韩 熟女| 2017av无码免费无线播| 情色大香蕉| 亚洲限制级| 人人插人人搞人人操| 蜜乳中文字幕a在线| 性生活性生大爱77AV国产| 亚洲丝袜色图| 国产一区二区在线播放| 91色综合色| 黄网站黄视频网站进入口| 国产网红精品| 日本人妻伦在线中文字幕| 黄页网站成人免费| 国产AV人人 夜夜人人澡| 成人婷婷丁香| 狠狠综合网| 丰满人妻无码一区二区三区| 无码高清操逼网址| 91啦人妻| 中文字幕天堂在线| 日韩9区| 欧美偷偷网| 97天天操天天干| 欧美78p| 床上啊啊啊一区二区三区| 99久久精品无码一区二区| Sekablack无码一区| 亚洲激情欧美色图 | 成人AV在线电影| 日韩无码视频黄色| yaouchengrenav| 少妇天堂| 96久久精品一二三区色欲| A片A5445444| 亚洲av噜噜噜噜噜噜| 亚洲欧美不卡线| 欧美综合色综合| 超碰97在线中文| 性欧美精| 欲色啪| 茄子社区国产精品| 97精品久久久久久久| 蜜桃传媒一区二区亚洲| 亚洲少妇诱惑| 60秒试看最爽10分钟网站| 欧美少妇一区二区三区| 国产免费大片| 日韩钢筋无码高清啾啾啾| 蜜桃久久久久久久| 欧美在线啊啊啊| 日本不卡二三区| 青青欧美在线| 午夜精品久久久久| 天天爽夜夜欢视| 超碰97男人| 中文字幕免费观看| ai欧美亚洲小说| 国产女人极品高潮毛片| 翔田千里AⅤHD无码| 7777奇米影视久久| 久久婷色| 婷婷六月色| 亚洲美女精品| 国产女人9999| 欧美性五月| 东京太热男人的天堂久久久| 97超碰超碰| 无码人妻精品一区二区中文| 日本熟妇人妻中出视频| 日本高清_区二区三区 | 日日骚av| 亚洲一级黄色毛片| 搡老熟女免费视频| 老子午夜伦不卡影院| 精品亚洲国产成人精品| 91综合在线| 婷婷国产精品九区| 操死我了啊啊啊| 伊人骚琪琪亚洲天堂网站| 蜜臀99久久精品久久久久| 亚洲男人天堂av| 欧美性爱免费短视频| 成人三一级一片aaa| 开心激情婷婷| 欧美页片| 97中文字幕一区| 亚洲阿v天堂在线| 日韩精品一区二区日韩| 亚洲日韩国产精品| 国产又粗又长视频| 一个国产在线综合网站| 五月天婷婷综合网| 国产成人精品必看| yy少妇精品久久| 久久伊人最新网址视频| 97超碰中文| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区 | 久久久久久国产无码精品| 影音先锋新男人| 亚州综合AⅤ| 亚洲美女精品九九视频| 亚欧免费观看视频| 精品国产精品一区二区| 白丝少妇一区二区| 亚州一区二区| 在线精品福利免费播放| 狠狠图片青青草| 亚洲人妻精品一区二区| 亚洲一本色道中文无码aV天美| 亚洲AV资源| 99热销国产这里有精品| 亚欧国产无码精品在线| 国产精品熟妇一区二区三| 91情色| 欧美性爱伊人| 四虎在线播放| 韩国手机不卡无码三级视频| 丰满人妻一区二区三区在线| 欧美大的香蕉有线电视视频| 欧美日韩中文亚洲v在线综合| 九九九九九九成人| 欧美精品久久久久久久丰满| 东北黄色电影| 亚洲美女av无码| 日韩精品一区二区三区色欲 | 天天看特黄的免费网站| 91狠狠综合| 精品少妇后入一区二区三区四区人妻巨乳| 啊啊啊啊啊在线视频| 一区二区三区免费视频入口| 欧美精品人妻视频| 国产无码精品久久久久久| 岛国1区2区3区在线观看| 激情自拍 校园春色| 天美传媒AV在线播放| 天天爽天天爽| 蜜臀久久99精品久久久| 熟女在线视频| 老熟女乱伦一区| 中文字幕55555| 国产精品露脸在线观看| 欧美熟妇操操视频| www.91理论| 九九九九九九九九九五码| 亚洲影院成人| 99热超碰| 精品国产乱码| 中文子幕一二三| 曰韩av中文字幕专区| 97K超碰在线| 91黑丝在线播放| 热99这里有精品综合久久 | 精品女同一区| 国产无码三级视频在线观看| 狠狠色婷婷7777久| 欧美熟妇色| 天天欧美色| 天天懆天天日| 91欧美综合在线| 欧美在线观看综合国产| 超碰地址久久| 久久久久七视频| 三级片网站在线播放| 丰满人妻被猛烈进入中| 激情文学 亚洲图片| 婷婷丁香五月综合| 亚洲最大成人a毛毛片| julia国产在线 | 久久老子无码午夜伦不卡| 色盈盈影院| 九九久久一区二区伦理| 91国精产品| 国产成人网址| 日本欧美不卡| 亚洲欧洲色情高清| 另类专区在线观看| 亚洲欧美色图| 国产精品午夜福利视频| 蜜臀少妇一区二区| 国产中文大片资源中文字幕| 日本欧美色| 国产大陆天天艹| 国产9l 大屁股| 无码视频一区二区| 亚洲精品视频二区| 看黄片视频免费| 岛国天天午夜影院传媒网| 亚洲 日本 一 二 三| 国产一级高跟丝袜| 欧美劲爆第一页| 久久精品99久久久久久| 综合色图区| 精品久久久久av影院| 九七超碰| 九久久九九久视频| 亚洲国内精品成人不卡| 国模精品娜娜一二三区 | 精品高清一区二区三区三州| 2017天天操| 欧洲精品欧洲精品| 超碰1024久久| 狠狠操天天干| 中文字幕第9页萱萱影音先锋| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 欧美激情亚洲色图| 国产精品久久伊人| 天天干干天天干干| CCYY草草影院地址入口| 鸥美中出| 久久精品操| 欧美视频第二页| AAA久久| 国产精品点击进入在线影院| 人人爱人人乐人人操| 9精品久久| 日本伦理一区二区| 黄页大片在线观看| 一区三区啪啪| 无码高清专| 91一区二匹| 南澳成人一级片在线播放| 亚洲高清无码AAA久久久精品| 91久久精品美女高潮喷水| 91丝袜美女| 无毛精品| 日本影视久久免费| 果冻传媒A片麻豆熟妇人妻| 亚欧美色图| 五十路成人在线视频二区三区| 91麻豆一二三区| 97欧美色综合| 综合欧美色图| 欧美性高潮| 欧美日韩97| 一级性爱视频免费观看 | 天天夜夜rb| 超碰99在线| 国产高清自拍视频| 天天做日日做| 日韩一级成人毛片免费观看 | 大香蕉一区二区在线观看.| 久久综合亚洲色1080p| av天堂5| 97综合在线| 国产精品久久久视频| 久久爽爽精品| 超碰在线综合97| 亚洲久久久久| 超碰99re| 一本大道不卡一二三区| 婷婷丁香五月激情啪啪| 人妻熟女字幕一区二区| 男生女生啊啊啊啊| 国产嫩草精品A88AV| 丝袜AV一区二区三区| 亚洲图片色图欧美另类| 亚洲色欲天天人妻无码系列专区| 五月丁香婷婷啪啪| 99操| 久久精品超碰| 欧美A片中文字幕| 色综合婷婷| 爽爽爽免费视频| 熟女露脸激情自拍视频| 亚洲国产精品无码AV久久| 国产女人与拘做受视频免费| 五月天激情影院| 97超碰逼| 大屁股国产在线视频| 久操精品| 亚洲成人久久美女| 国产精品国产自产拍高清AV| …中文字幕亚洲乱,97人妻无码费视… | 欧美黄片视频在线观看免费 | 久久精品美女一区| 亚洲一二三四区机械| 91操熟女视频| 日欧亚洲二三区大片不卡| 99综合网| 一区二三区四区视频大全套| 日本成熟少妇A∨网站| 青娱乐久久艹| 男人干美女| 91欧美综合| 美女国产一区二区久久| 伊人成人情色综合| 香蕉99秘 一区精品蜜桃臀| 日日操免费视频| 伊人久久88国产女| 91色射| 热无码中文亚洲H一道本一区二区| 久久人妻视频网| 公司1区2区3区精产精| 国产粉嫩蜜臀av一区二区三区 | 国产精品网址| 97精彩视频网站| 99re视频在线播放青草| 日韩黄色一区二区三区| 97资源欧美| 欧美激情久操网| 日本免费中文一区二区三区四区| 色网1| 精品国产一区二区三区香蕉欧美| 亚洲综合另类欧美久久久| 亚洲情色 自拍| 尤物一级在线免费观看| 欧美国产操逼| 欧美一区二区三区互相| 91久久精品国产| 999精品久久久久久久| 久久香蕉国产线看观看猫咪av| 欧美少妇性乱| 欧美精品日韩久久久九| 精品人妻一区二区免费蜜桃| 家庭乱伦麻豆| 精品少妇一区二区三区免费观看| 91中出在线| 国产伦精品一区二区三区在线观| 成人开心网在线视频| 久久亚洲AV无码专区国产精品| 99蜜桃臀久久久欧美精品网站| 黑人精品XXX一区一二区| 国产蜜臀精品一区免费尤物| 91在线丝袜| 成人av动漫在线观看| 加勒比色综合| 九九性爱网| 清纯唯美第一页| 少妇超碰在线| 综合97| 午夜福利久久久噜久噜久久综合 | 欧美色网| 白丝1区2区3区| 日韩高清黄片| 嗯嗯啊啊日韩精品| 天天干天天操天天干天天操| 好爽要喷了| 嗯啊不要在线| 国产精品久久久久久亚洲色欲| 亚洲综合码| 国产精品久久久久久无码红治院| 天天日熟妇| 亚洲九区| 日韩欧美亚欧在线视频| 粉嫩小泬久久久一区二区| 日韩一级欧美一级国产一级台湾| 国产SV一线| 人妻aa| 夜夜爽夜夜操| 毛片17S| 国产精品制服丝袜清纯唯美| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 狠狠干精品一二三四五六2022| 人人贴人人摸| 后入精品| 婷婷亚洲天堂| 极品综合| 青草精品视频一日本久久久久网站| 在线观看十八禁| 欧美日韩大黄片| 久操电影网| 熟女天天干| 欧美日韩岛国大片在线观看| 91春色| 欧美天天在线| 欧美最婬乱婬爆婬性视频| 91午夜无码| 美女好片色日本| 岛国人妻少妇av在线观看| 日人妻视频91| 中文AV制服乱伦| 亚洲色图片区| 日韩有码一区三区| 免费在线黄片视频| 九九九九热| 舔人妻中文免费视频| 久久9精品视频| 国产一区二区欧美日本| 色吧5亚洲| 97欧美色| 午夜福利区| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 开心五月婷婷激情| 精品国产91av一区二区三区 | 亚欧操逼片在线观看| 插入综合网| 久久艹逼视频| 一起草日韩| 三级日韩一区二区三区| 2017天天操天天日| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 亚洲 欧美 天天| 欧美另类综合久久| 日韩一区二区精彩视频| 91欧美在线| 国产熟码AV| 激情黄色五月天| 91jk色拍| 久操在97| 有码色中文字幕在线观看| 日本人体九九九九九九| 亚洲色欲天天人妻无码系列专区| 午夜亚洲国产理论秋霞| 人妻9117c| 人人操人人色网| 久伊人网78| 99久在线精品99re8| 秋霞鲁丝午夜无码一区二区三| 天天综合有色网| 激情五月婷婷| 91蜜桃婷婷狠狠久久综合9色| 国产精品免费视频人成| 国产一区二区三区视频在线看| 在线毛片片免费观看| 久久精品国产亚洲5555| 久久男人天堂| 色图综合| 青青草福利视频| 亚洲欧洲自拍| 在线看污网站| 熟妇人妻精品一区二区| www.91视频网| 老熟女网站| 日韩啪啪视频| 9久精品| 九九综合九九综合| 国产剧情在线| 欧美狠狠| 五月天婷婷在线看| 国产传媒午夜理伦精品| 成人精品久久久午夜福利| 一二三四视频中文字幕在线看| 黄色电影在线播放综合网站| 国产成人91一区二区三区| 亚洲欧美国产中文视频| 级做a爱无码性色永久免费| 日韩免费高清大片在线| 在线人成亚洲视频免费观看| 亚洲,日韩,欧美,成人播放| ..日韩av毛片精品久久久| 国内毛片无遮挡国产| 国产女人和拘做爰视频 | 色妹子A V| 亚洲丝袜色图| 精久久久91| 日本三级韩国三级美三级91| 岛国天天午夜影院传媒网| 最新制服中文第一页| 久久精品店| 日韩激情无码影院| 可以免费观看的日韩av毛片| 黄色一级视| 99亚洲精品| 国产传媒日本欧美专区| 日本孕妇孕交| 日本道日本道中文字幕日本道最新日本道在线观看 | 97视频网站在线观看| 婷婷丁香六月| 久久成年精品| 少妇熟女视频一二三区| 97干色| 84YTCOM性无码| 精品久久久久久中文| 久久伊人五月天| 97综合在线观看| 2017大香蕉国产精品久久| 91精品国| 呦呦影院| 夜夜影视四色| 亚洲AV无码天美传媒一区| 欧美日韩大陆黑人少妇99| 国产91丝袜 在线播放| 国产农村妇女精品| 日本一区二区不卡精品| 狠狠中文字幕| 久久久精品日本一道| 媚薬在线视频麻豆| 日本506070| 亚洲欧综合另类无码一区| 色婷婷久久| 啊啊啊快操我视频| 日韩大香蕉AV影片| 99国产在线 精品 视频| 激情综合五月丁香| 天天日天天屌天天操| 亚洲欧美黄| 凸凹视频在线观看| 亚洲欧洲小说图片视频 | 综合久久六月久久婷婷| 久久精品国产精品亚洲艾通辽熟妇 | 人妻AV 中文字幕的| 亚洲性猛交| 91久热| 国产东北女人在线视频| 青青草在线成人视频| KK色在线影院| 国产AAAAAABBBBB| 日日夜夜天天| www.acm成人黄色毛片| 秋霞一级A片黄色视频| 婷婷丁香久久| 91色s| 日日夜夜精品| 亚洲人在线| 亚欧洲日韩国产精品| 五月天玖玖资源站| 77国产精品| 日本人妻伦在线中文字幕| 97人妻碰碰中文无码久热丝袜| 九九热精彩视频| 韩三级a视频在线观看| 男女打扑克高清网站| 大香蕉2017| 大伊香蕉在线视频免费| 日韩视频小说在线观看| 乱伦一二三区| 久久色人体| 999久久久国产精品| 久久五月丁香| 日本幼女18+| 国语av最新自产拍在线观看| 超碰在97| 日本成人电影资源网| 99久热精品99re6热| 免费AV中文网在线观看| 人妻碰碰碰碰碰碰| 欧美天天射| 殴美牲| …中文字幕亚洲乱,97人妻无码费视…| 在线播放一级无码视频| 天天看片麻豆| 国产网红精品| 国产精品熟女AV中文字幕在线播放| 91成人精品| 五月天激情婷婷| 人人妻人人爽一区二区三区| 人妻久久久| 91中文字幕制服丝袜免费视频| 六月丁香网| 日韩综合色图| 久久精品视频久久久| 青娱乐啪啪视频| 神马精品视频| 国产精品又黄又猛又粗| 国产农村妇女精品一二区| 欧美爱三级日韩久久| 中出789在线视频| 国产无马视频| 人妻蜜桃臀| 国产后入精品| 欧美人体性爱互联网第一页婷婷日本| 九九久久久九九| 在线综合 亚洲 欧美中文字幕| 99热这里只有是精品10| 亚洲成人无码影院| 国内一区二区三区| 色婷婷激情| 97免费视频在线观看| 一块操欧美| 好爽视频在线观看视频 | 91精品黄在线观看| 蜜臀网 一区| 口爆综合网| 日本一区二区三区免费观看| 日韩资源网| 国产67194| 日本一级特级毛片视频| 国产又大又粗又色生活片亚洲国产精品成人久久久综合免费 | 亚洲 无码 有码 中文字幕| 国产成人无码久久精品| 精品国产Av无码久久久伦古装| 中国黑人三级片网站上区| 国产人妖视频一区在线观看| 欧美色图校园春色| 综合亚洲情色| 自拍偷拍2025在线观看| 久久精品久久久久久久| 亚洲欧美日产国产91毛片| 国产超碰人人操| 自拍内地三级在线观看| 国产后入清纯| 日日夜夜狠狠| 亚洲欧美日韩免费电影| 这里只有精品97| 粉嫩AV一区夜夜嗨| 国产精品无码论坛| 国产色产精品在线观看| 国产av色网| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 欧美九九爱| 久久肏大逼| 懂色Av一区二区三区| 91丝袜在线视频| 亚洲18禁| 免费a在线播放v| 看日韩黄片| 亚洲天天自拍| 天天内射| 97色插| 久久综合99| 一区不卡在线观看av| 色综合天天爱去电影网| A一级色女| yazhousetuoumei| 中文字幕一区日韩精| 久久综合国产精品国产| 天天综合97| 精品视频一区二区| 精品久久九| 日本三级黄页| 中文字幕在线观看二区三区| 国产精品国产自产高清AV| 久久精品一区二区一8| 九九热av| 夜夜操av亚洲一区二区| 日韩九区| 中国国国产一级特黄毛片| 黄色人人| 人人搞人人插人人操| 亚洲美女精品九九视频| 超碰视97中文| 欧美少妇性乱| 韩国三级三级BD在线| 一二三啪啪专区| 熟女人妻av在线资源,黄色的资源| 黑人精品XXX一区一二区| 97色网| 九热中文字幕| 青草一区二区| 91丝袜人妻| 欧美日韩美女精品久草一区二区三区| 日韩精品9999| 亚洲淫乱骚妇AV| 天天香香欲综合| 偷窥自拍亚洲色图| 五月丁香久久| 婷婷导航| 成人看片网站| 粉嫩在线一区二区懂色| 午夜欧美女人操逼| 99精品久久久久久久婷婷| 十八禁视频一区二区| 国产精品不卡一区二区三区av | 黄色网址久久精品欧美喷水| 国产十八禁视频| 大吊色| 99热超碰在线| 天天爽夜夜操| 东京热亚洲一区二区| 亚洲欧美经典一区二区| 美日韩成人| 国产 日韩 欧美 人妻 熟女 中文| 欧美专区日本专区| 国模精品娜娜一二三区| 国产超碰| 九九aV| 亚洲天堂中文字幕无码男同| 91亚洲人电影| 99国产精品人妻人伦| 自拍盗摄一区| 中文字幕精品久久久久人妻红杏ⅰ| 香蕉久久精品| 久久宗合亚洲| 蜜汁欧美| 91精品国| 青青草中文字幕| 国产日韩精品suv| 曰韩人妻中文字幕在线| 久久免费99精品久久久久久| 日韩av不卡在线看| 亚洲色色探花| www.久久久久| 啊啊啊com| 人妻在线臀日韩| 青青欧美| 97在线视频免费看| 九九九九九精品| 国产一区免费午夜视频| hd成人一区二区在线| 天堂8在线新版官网| 天无日色综合| 丝袜翘臀后入欧美校园亚洲自拍另类小说一区中文字幕少妇诱惑 | 青青青草原| 超碰97 线线 在现| 亚洲欧美综合网 | 亚州五月| 操国产高清| 狠狠操官网| 久草大| 91中文精品日韩欧美在线| 欧洲Au麻豆| 久久精品成人一区二区三区蜜臀| 婷婷午夜清品久久久久久久性色视频观| 亚洲久久天堂| a片久久久久久久久久久久 | 欧美色图天堂网m| 久久日本熟妇熟色高清| 春色91| 欧美日韩不卡a片| 澳门特级毛片免费观看| 嗯啊不要啊啊在线观看视频|