日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满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精品国产91久久青草| 蜜汁欧美| 26UUU欧美日本| 中文字幕亚洲热播人妻| 亚州精人品大香蕉| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | www.91人妻.com| 欧美日韩国产中文精品字幕自在自线| 人人天天欧洲| 亚洲无码日韩电影| 在线观看免费视频国产| 不卡码视频| 欧洲精品二区| 亚洲综合五月天| 欧美综合色图网| 亚洲1区2区三区高清中文字幕| 大香蕉免费中文| 97亚洲中文| 另类一区| 亚洲加勒比色图| 欧美天天干| 天天操av懂色| 黄色免费网| 一二三四免费视频| 欧美欧美啪啪视频| 一区二区 电影 亚洲| 成人午夜高潮av猛片| 久久欧美按摩999| 久久伊人东京热| 精品国产精品一区二区| 欧洲亚洲人妻无码久久三区四区| 婷婷导航| 国产精品 久久久精品一牛| 亚洲一二三精品久久网| 亚洲欧洲自拍图片专区满春格| 91人人爽人人爽| 日韩无码一级黄色av片| 啊啊啊好疼| 亚洲精品视频在线播放| 国产深夜福利| 亚洲 欧美 综合 91| 爽 好舒服 无码刺激久久| 欲综合网| 嗯嗯啊啊啊啊轻点视频| 欧美白嫩在线放| 欧美特大黄一级片片免费| 久久精品日韩专区免费观看| 99色婷婷中文字幕乱色| 亚洲成人免费电影| 欧美一区二区日韩三区| 91精品久久久久| 精品视频97| 91麻豆va国产精品| 操逼操网| 午夜精品探花| 日韩无码专区| 黄片免费久久久久久久| 黄片无码在线制服| 久久久亚洲Av| 亚洲无码精品AV久久久| 91欧美情色| 人妻酒店出差被中出免费在线播放| 日韩一级片在线看| 99这里有精品视频| 蜜乳av一区二区| 久久久久9999| 欧美亚洲天堂| 免费的黄片有限公司| 亚洲国产精品无码AV久久| 国产精品国产| 亚洲情色一区二区三区| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 岛国黄| 91w欧美| 试看60秒 爽| 色九久| 97精品一区| 黄站在线免费观看| 青娱乐999| 色欲天天综合久久久无码网中文| 欧美激情综合| 岛国片在线播放| 国产美女自拍AV| 99久久久久久亚洲精品不卡| 操逼国产免费| 五月天婷婷基地| 国语人妻精彩刺激| 91男同| 伊人天天久久动态图| 久久欲| 五月天婷婷色色| 91新在线欧美| 精品天堂| 国产成人无码高清| 800zy一区二区| 亚洲日韩久久精品一区| 被男人吃奶很爽的毛片| 久久久夜夜嗨免费视频| 国产一区二区久久| 国产高清成人mv在线观看| 麻豆天美制片厂网站视频| 在线亚洲精品久久久| 吊色| 欧美精品日韩久久久九| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 精品中文日韩字幕视频| 天天操夜夜操| 亚洲91av| 久久一二三四| 日韩天堂av电影在线观看| 色九九九综合| 日韩免费高清大片在线| 国产视频三区四区| 中文操逼字幕| 亚州 综合 色图| 欧美性生活男人的天堂| 96免费视频在线| 亚洲色图尤物视频| 精品人妻一区二区三区蜜桃视频| 久久婷婷热| 美女黄页网站| 九一亚洲国产免费| 欧美精品日韩久久久九| 日日骚精品视频| 欧美一区二区日韩三区| 91少妇香蕉久久精品| AV麻豆免费一区| 使劲用力艹少妇视频一区二区| 夜草网站| 国产吹潮女在线观看| 国产呦精品一区二区三区下载| 久久草视频污视频| 欧美视频一区二区在线| 高清视频一区| 久久一二三四不卡 | 久久人人舔人人爽舔人人av片| 天天综合有色网| 亚洲成a人v欧美综合天堂下载| 久久9精品视频| 老熟女乱子伦中文字幕一区二区 | 中文字幕青青草| 思思热在线观看| 9久久久久| 嗯嗯啊啊视频在线看| 欧美裸体美女日麻屄| 国产亚卅97| www.91久久| 欧美日韩国产中文精品字幕自在自线| 国产精选视频| 欧美韩国你懂得在线| 婷色五月天| 亚洲国产综合视频| 女生看匆91网站| 搡老女人老妇女老妇老熟女怎么读| 成人a大片在线观看| 91天天综合日韩欧美| 久久久久国产| 死我十八禁| 97超碰美国| 一级黄色影片| 成人日本精品九区| 人妻熟女字幕一区二区| 午夜高清成人在线视频| 日韩人妻免费精品| 俺去啦俺来也久久综合 | 国语精品av| 日韩美女,国产传媒,视频一区| 2011国产精品| 国产白嫩精品久久| 欧美亚洲se91| 青青青草原| 欧美97se| 欧美日韩中文视频播放| 天堂v无码免费视频| 国产亚洲色婷婷久久99精品91 - 百度| 91欧美丨精品丨入口| 色香伊人| 粉嫩AV一区二区夜夜| 91视频综合网| 欧美成人A天堂片在线观看| 日韩去日本高清在| 中文字幕黑人大片| 国产精品一二三区福利| 精品96久久| 青青草综合在线| 日韩欧美女求操每天更新| 亚洲精品久久久久毛片A片拉屎 | 久久精品国产亚洲AV片多多 | 亚洲图片欧美在线视频| 亚洲性猛交| 精品人妻一区二区三区四区不卡在| 日韩色| 国产精品国产精品国产| 人人潮人人摸| 26uuu欧美| 热久日综合| 亚洲色图伊人网| 日本一区二区不卡| 激情五月综合| AV色女综合| 中国一级特黄大片护士| 欧美精品成人亚洲| 密臀在线视频| 成人亚欧免费视频| 欧美日动态视频| 中文字幕国产| 亚洲欧美日韩精品久久久一区二区| 区日韩亚洲乱码av电影| 超碰久超碰久| 天天操狠狠日夜夜干超碰撸com视频在线观看 | 女人高潮大叫一级毛片| 久久久亚洲精品中文字幕人妻| 国产亚洲中文不卡二区| 噜噜噜亚洲精品| 九九热免费视频| 97jingpin| 大香蕉78| 日本熟妇熟色97一本在线观看| 日本不卡一二区| 青青草操逼逼视频| 97干97色| 激情露脸爱| 欧美一级黄色免费专区| 91成人在线| 久久九九视频九九视频| 欧美色道啊| 日韩av乱伦| 黄色视频高清无码网站| 老女人碰碰在线碰碰视频| 大香蕉黄色一级片免费看| 亚洲欧美国产中文字幕| 熟女视频久久| 久久精品午夜国产亚洲AV无码| 狂操嫩妻视频一区二区三区| 伊人操你| 四虎免费在线观看| 精品美女人人干| 国产精品久久伊人| 91成人高清在线观看| KK色在线影院| 第四色色综合91| 国产亚州高清国产拍精| 欧美五十路熟| yaouchengrenav| 97超碰色情| 天天色踪合| 91在线免费观看处女| 日韩一级片| 欧美性爱一级操| 久久久555| 密臀成人视频久久久| 久久久久元码视频| 少妇第一页| 久久人妻视频网| 国产乱人伦AVA麻豆软件.| a片久久久久久久久久久久| 国产麻豆91欧美一区二区久久婷婷国产精品 | 91成人在线免费视频| 99re9| 97欧美资源| 天天在线91| 91国产美女丝袜足交精品视频| 夜夜操2028| 国产在线视视频有精品| 强奸乱伦Av网| 婷婷色中文字幕| 久久伊人大香蕉| 久悠悠av| 九九亚洲精品| 91N综合网| 四虎av在线| 国产日韩中文字幕欧美| 岛国不卡超碰护士AV在线播放| 国产免费久久精品99re韩国| 2026国产精品视频| 道久久五香丁月婷婷激情综合| 九九九九九九九九九五码| 大香蕉男人的天堂| 老女人综合| 亚洲中文丝袜美腿诱惑字幕| 少妇第一页| 91免费看一区二区三区| 丝袜美腿制服人妻二区中文字幕| 强奸a片网| 欧美亚洲丝袜人妻制服99| 亚洲有码第一页| 精品国产乱码| 九九黄色网| 一本大道综合伊人精品热热| 欧美日韩色| 欧美黑人精品在线播放| 久久久久久久极品香蕉视频| 台湾佬中文娱乐网久久久久久久久久com| 躁躁躁日日躁2020| 美国一区二区免费视频| 麻豆激情综合| 国产精品分类在线观看| 女优视频第10页| 国产在线精品电影观看| 伊人久久大香线蕉无码| 欧美亚洲美少妇一区二区| 国产精品夜夜| 亚洲精品人妻在线| 日韩精品 资源| www.91视频网| 日本高清一区二区在线| 亚洲一二三| 99老司机精品视频在线观看| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 夜夜高潮夜夜爽夜夜爱爱一区 | 久久精品国产亚洲妲己影视| 国产精品 午夜福利| 亚洲图片欧美| 欧美久久九九| 国产日韩欧美亚洲精品95 | 性色AV蜜色av色欲av| 激情第四色| 久久中文字幕女同性恋一区| 欧美刺激色黄片免费看| 东京热av男人的天堂| 久久伊人最新网址视频| 欧美一级欧美三级在线观看| 国产一级内射无挡观看| 精品久久久久成人码免| 五月丁香六月激情综合| 操逼操逼操| 高潮嗯啊性感美女久久久| 岛国在线国产| 欧美在线综合| 91狠狠综合久久久久久| 爽极品影院| 2019午夜福利视频| 骚逼高潮久久精品| 国产A v无码专区| 久这精品中文在线观看视频| 成人久久久精品| 91爽啪| 天天色,天天干,天天干| 久久男人的天堂| 超碰九九| 亚洲第一男人天堂| 91艹| 91成人在线| 在线无码操| 99精品国产户外露出| 欧美姓爱综合网| 91亚洲欧美综合高清在线| 91人人爽人人爽| 国产成人+综合亚洲+天堂| 日本精品中文字幕视频| 亚洲一区二区中文字幕| 一区| 欧美爆操91| 夜夜操狠狠操| 欧美日韩午夜精品一区二区三区| 欧美日韩国产精品久久色婷婷| 超碰99在线观看| 天天躁日日躁XXXXYY| 成人5码视频| 国产日韩在线播放av| 人人爱人人乐人人操| 香蕉人欧美综合| 久久色精品视频在线| 91性网| 亚洲欧洲自拍| 精品国产av一区二区三区四区入口| 蜜臀Av一区二区三区| 少妇精品| 人人干黄色| 国产精品高清2021在线| 久久五十路熟女人妻| 岛国激情视频软件| 一线黄色免费性爱片| 少妇一区二区三区精选| 少妇xx精品| 91欧美大片| 日本熟女不卡视频| 亚洲精品人体| 人人操人人摸avav| 欧美成人午夜免费福利785| 日本精品第一视频在'| 五月丁香啪啪网| 日韩97视频!在线| 精品一区二区三区四区外站| 欧美与日韩97| 91A欧美电影网站| Sekablack无码一区| 麻豆啪啪啪视频| 91亚洲精品青草| 亚洲成人妻日韩在线| 成人一二三区| 桃花色涩综合影院| 天天操天天日天天干| A 天堂| 人人操人人狠狠操| 91黑丝少妇| 91久久国产综合精品| 美女天天干| 国产精品亚洲色婷婷久久久| 亚欧免费| 操逼视频免费日韩无码| 天天夜夜久久| 天堂а√在线最新版在线 | 日本不卡二三区| 熟女精品日韩一区二区三区| 国产精品99久久久www| 亚洲涩图欧美| 激情视频网址| 1区2区3区视频| 97干在线| 2017大香蕉| 亚州AV无码国产精品| 亚洲情色在线| 日本Xx性爱| 992大香蕉| 黄色免费网页无码| 久草精品一区| 天天色黄色影院天天操| 色九九九综合| 午夜大香蕉| 女人香蕉久久毛毛片精品| 色婷婷亚洲婷婷| 操人妻逼91| 国产在线观看一区二区三区| 欧美精品双插| 亚洲欧美在线观看免费| 人妻蜜桃臀| 三级片大波波| 国产黄片精品在线| 91模特在线观看| 91青视频| 亚欧性爱ab| 啪啪视频免费在线观看| 亚洲综合九| 美女视频尤物网在线看| 97bbn| 欧美在线观看综合国产| 亚洲欧美国产中文视频| 天天内射| 日本精品人妻少妇一区二区| 久久久久久AⅤ无码免费肉站| 日本亚洲嫩草影院啪啪| 草久久久| 91在线页| 亚洲成人AB| 精品一区二区三区国产| 欧美精品1区2区3区| 国产婷婷一区| 97色色色| 色哟哟av网址| 九九热超碰97亚洲最新香蕉 | 欧美久久婷婷| 91超碰人人操| 337p大胆噜噜噜噜噜91Av| 人人操人人插人www| 国产亚洲精品一区二区三区| 青女偷拍网| 国产91丝袜 在线播放| 97国产|免费| 欧州91高潮| 超碰在线人人射| 中国农村熟妇毛片视频| 性开放中文AV高清无码免费看| 欧美黄色大片在线观看 | 4虎在线视频| 欧美综合狠| 好吊色综合| 呦呦影院| 欧美丰满少妇xx高潮| 被男人添B超爽视频| A片三级无码| 日韩女模中文造逼| 女同性恋一区二区三区精品视频| 大奶尤物鲍汁淫荡欧美视频粉嫩夜夜骚| 成人日韩中文字幕| 91热色| 日韩av情韩国爱禁区av一区二区| 夜夜騷av、一區二區| 日韩特一级久久| 综合少妇网| 中文字幕AV乱伦| 日韩国产不卡在线视频| 超碰97爽| 中文字幕乱亚洲美女精品一区| 亚洲色电影在线| 欧美一级国产一级| 绑缚麻绳人妻寝取完整版| 色原狠狠天天天| 国产精品原创巨作?v网站| 五月丁香综合激情| 久久人人爽av亚洲精品天堂桃色| 东京热一区二区中文字幕| 性爱乱伦一区| 日韩中文9| 操逼逼福利视频| 亚洲精品一区二区三区新线路| 亚洲在线观看| 色香色欲天天综合网天天来吧| 亚洲伊人久久精品狠狠在线| 91精品人妻一区二区三区蜜桃| 日本东京热加勒比久久| 丁香五月天社区| 牛牛久久国产精品视频一二三 | 亚洲老司机123专区| 乱伦一二三区| 久久一本大香蕉 | 日本加勒比无码专区一二三| 日韩无码黄色片| 欧美性爱一区二区三区四区| 在线中文字幕| 日本久久久久久久久| 97色97干| 亚洲日韩青青草色月| 免费福利视频中文字幕| 久久久久免费少妇| 啪啪啪综合网| 97网址97| 七久久久| 3d成人精品一区二区| 九热超碰| 91爱综合| 久久久久亚洲?V片无码V| 日韩青久久| 亚洲欧洲综合视频在线| 超碰91在线| 久日91在线| 免费视频a级毛片免费视频| 东京热av影院| 久久精品成人一区二区三区蜜臀| 又粗又长又大国产不卡| 亚洲激情欧美色图| 色婷婷久久| 日本操逼视频导航| 懂色Av| 久热精品在线| 亚洲网污污污污| 嗯嗯嗯啊啊啊操的我好爽| 香蕉人人操tv| 亚洲黄色网址视频| 粉嫩av久久一区二区三区| 天操老女人| 天天综合网~69| 成视频在线观看免费看| 天堂69亚洲精品中文字| 成·人免费午夜在线观看| 美女上床网站| 久久风骚城市| 丁香五月天啪啪| 国产精品成人蜜臀AV在线| 欧美午夜精品久久久久久超碰| 看一级黄色视频| 一区二区三区四区五区高清无码永久视频| 无码人妻精品一区二区三区九九 | 亚洲综合一区二区| 成人性爱全视频观看| 欧美亚洲激情小说| 日本在线999| 国产一区二区三区高清视频| 色婷婷五月综合激情中文字幕| 亚洲天堂第一页| 岛国999| 人人摸.人人色| 国产馆极品诱惑| 有码专区最新中文字幕有码| WWW.操逼.COM| 亚洲一区二区三区婷婷| www.人人摸在线视频| 欧美综合另类| 97天天| 一二三四区电影| 中文字幕天天操| 人人操人人精品影片| 天天日天天干少妇日| 午夜福利1区2区3区| 韩国一级婬片A片AAAAA| 国产精品国产自产拍高清AV| 乱子伦一区二区三区国产精品| 欧美午夜视频| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 婷婷久久综合| 最新国产精品| 日韩精品中文字幕一| 99热这里只有精品99| 97在线免费看| 久久久少妇诱惑精品视频| 人妻精品一区二区全免费| 是还免费视频1727我| 欧美综合网站999| 91露脸熟女专区| 久久久久9999| 熟妇高潮二区三区| 国产一进一出视频网站| 盗摄 精品 另类 一区| 激情视频图片| 欧美一级A一级a爱片久久| av天堂手机版追回| 蜜臀久久在线视频| 阿姨一区二区免费视频-高清正片西瓜视频下载app-T450AV | 久久久免费的精品| 国产污视频麻豆传媒一区二区| 国产农村妇女毛片精品久久| 黄色香蕉视频网站一区| 久久AV无码1区2区3区| 97天天日| 91天天综合网,天天综合网| 夜夜精品视频| 国模吧 一区二区三区| 欧美亚洲成人在线一区二区三区| 99热99在线播放激情| 日韩亚洲美女一区久久| 黑白配性爱AV成| 九九Av| 日本506070| 色婷婷五月天| 青娱乐淫乱1314| 秋霞男人网| 夜夜做夜夜爽精品视频| 男女性感激情网站| KK色在线影院| 国产精品一区午夜福利| 久久久精| 天天综合在线4| 男女做爰猛烈动高潮A片免费应用| 啊灬快c我灬啊灬用力灬啊灬-国产精品性做久久久久久-成人AV | 中文字幕久久婷婷丁香五月天 | 中文字幕久久精视频久久大全| 国产隔壁老王影院在线| 亚洲夜色在线| 国产操操日韩三级黄| 日韩免费人妻色情网站| 日本成人A片免费看| 亚洲图片偷拍欧美| 欧美日韩夜夜| 综合欧美日本三级| 熟女人妻一区二区三区免费看| 爽爽爽免费视频| 色综合网1| 国产精品毛片?v一区二区三区| 91白嫩| 亚洲素人网| 欧美色图片91| 99国产人成精品| 午夜男女爽爽爽在线视频| 88xx成人精品视频| 曰韩人妻中文字幕在线| 99www.bibizy香蕉资源国产一区二区三区高清| 国产小视频91| 国产午夜精品在线观看| 麻豆区99999| 好吊妞转入那个网| 精品色色| 五月丁香成人网| 狠狠综合网| xxx0国产在线播放| 日美免费黄片| 思思热久久成人| 黑人操一区二区| 一区二区三区探花在线观看| 久久免费少妇| 天天日天天操天天射河南省| 日韩在线观看三级电影| 91欧美综合| 91 亚欧| 四虎视频在线观看| 天天操天天射青青草| 伊人女女资源在线观看| 色官网在线| 国产精品无码av在线| 精品蜜乳AV免费观看| 日韩色欲久久一二三四区| 中文字幕日韩国产传媒欧美精品| 欧美在线 亚洲| 美女啊啊啊啊啊啊啊| 久久成人东京热人妻| av天堂精品久久| 草久久久| 日本性爱欧美性爱| 91精品丝袜久久久久久无码人妻| 综合夜夜| 色好看av| 免费黄色片。| 91/欧美| 亚洲超碰97| 97人人射| 色牛aV| 美性中文综合网| 亚洲囯产精品女人久久久| 国产av热热色| 亚洲欧美经典一区二区| 亚洲av资源| 高清不卡一二三区视频......| 99国产精品自在自在| 乱精品一区字幕二区| 中文字幕一区二区无码成人| 美女尤物福利视频| 欧美日韩啪啪电影| 免费97视频| 一区二区三区免费岛国片| 日本中文字幕在线视频| 热热色91| 国产乱弄免费在线视频。| 一级成人性爱| 黑丝91视频| 在线强奷到舒服的无码视频| 91精品人妻一区二区三区蜜桃| 岛国人妻少妇av在线观看| 国产97视频免费观看| 99在线精品视频| 激情欧美日韩女同久久| 亚洲 日韩 丝袜 熟女 变态| 97伊人超碰| 九热大香蕉| 99日韩| 色爱欲亚洲| 一区二区三区黄片免费观看| 精品.99999| 国际精品久久久| 欧美91网站| 天天拍天天操| 五月天婷婷在线看| 骚货| 日韩欧美亚洲一区二区三区影院| 国产女人视频三四五区| 91男女| 小草精彩毛片| 亚洲图片另类| 丝袜视频网国产90| 亚洲吊色| 美女91在线观看| 天天射,天天操,天天爽-国内精品一区二区三区-成人AV | 亚洲图片欧美色| 国产精品伦理| 狠插 制服 自拍| 性色一线| 无码九九九九| 热热色色综合| 欧美在线伊人色| 久久国产精品91| 欧美玖玖爱免费玖玖| 国产宅男宅女在线观看| 日韩欧美女优电影| 激情视频网址| 日韩中文字幕宗合在线| 国内精品不卡无毒99999| 亚洲国产一区二区三区四区国产| 欧美日韩国产中文精品字幕自在自线| 99e久久国产精品| 久久精品老司| 夜夜操夜夜高潮夜夜爽国产精品区| 夜夜狼人妻| 日韩精品一区二区三区色欲 | 理论久久婷婷网 8| 在线99热| 亚洲91av| 天天综合网~91综合网| 亚洲日精品| 好看的91视频| 欧美劲爆视频一区二区| 亚欧视频在线| 国产成人手机视频激情| 久久久久久网址| 91xingse| 国产乱伦性爱区| 影音先锋少妇| WWW.操逼.COM| 一本色道久久天天射天天干| 自偷自拍的亚洲视频| 青青操狠狠撩| 久视频在线观看| 伊人四虎综合| 欧美精品69性爱| 91超碰丝袜制服| 欧美日韩国第一区| 欧洲精品在线播放| 日本性一区| 久久久精选| 欧美激情精品| 亚洲天堂在线怕怕视频| 啪啪啪东京| 日本午夜操逼| 熟妇熟女亚洲天堂网| 天天干天天日天天射黄色大片| 97公开久久| 中文精品少妇天堂| 91丝袜美女视频| 乱伦日本中文自拍| 上海一级黄片| 六月激情网| 日日狠狠久久偷偷色综合免费| 岛国艾薇凹凸视频天堂| 天天干天天插| 麻豆精品久久久久久久| 丝袜天堂| 欧美亚洲系列| 少妇一区二区三区精选| 性一交一乱一交A片久久四色| 69人妻人人揉人人躁人人精品| 伊人青青草久久| AV天黑人| 日韩在线欧美精品一区二区| 人人做人人妻人人夜视频| 草草影院在线视频| 久艹99| 精品妇操一区二区三区| 国产又粗又长的视频| 免费家庭乱伦视频| 少妇一级婬片免费放一级a性色.| 免費黃色視頻觀看一| 91久久18禁| 91观看 国产白丝| 亚洲一区二区三区中文字幕| 26uuu欧美| 夜夜免费视频| 色综合av综合久久| 婷婷丁香成人| 欧洲亚洲天堂精品| 91色人妻| 久久精品色欧美aⅴ一区二区| 激情露脸爱| 亚洲综合有玛| 久久久日本电影| 5月婷婷6月六月丁香| av天天在线| 国产精品美女久久久久AⅤ国产馆| 欧美刺激色黄片免费看| 日本高清有码网址视频| 男女打扑克高清网站| 久久人人爽爽爽人久久久| 久热99999| 无码精品久久久久久亚洲| 国产福利精品最新在线| 男人网站婷婷| 中文字幕五月婷婷免费| 精品国产嫩穴视频| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 亚洲男人的天堂V| 亚洲色人阁| 国产A v无码专区| 亚洲 另类 丝袜 自拍 动漫| 精品999日本| 日韩欧洲操屄视频| 亚洲二区精品在线观看| 九九热精品| 久久久久久久六六| 立川理惠被中出无码| 色婷婷综合视频| 天综合网欧美| 国产福利在线视频网站| 97在线观看免费视频l| 97精品免费| 激情图片亚洲色图| 后入式福利| 亚洲欧美精品福利在线| 人妻喷水| 六月丁香啪啪| 欧美色院| 青青草自拍视频在线播放| 九九九九国产| 日韩精品人妻系列无码天堂| 亚洲日韩精品久久久久一区壹牛| 成人精品视频一区二区| 国产传媒午夜理伦精品| 亚洲视频,小说| 蜜臀AV午夜精品久| 小草精彩毛片| 国产黄色小视频网站| 午夜综合在线| 91深夜夜| 开心六月色| 大香蕉乱级| 志村玲子视频一区二区| 精品久久97| 十八禁网站在线| 欧美福利视频啊啊啊啊| 欧美激情性爱视频网站| 午夜一级免费毛片| 亚洲系列第一页| 亚洲欧洲激情卡通另类文学四射小说网站| 91少妇香蕉久久精品| 99自拍视频在线| av资源在线播放天堂| 色综合久久久久| 密臀在线免费观看| 嗯嗯啊啊视频在线看| 国产一区二区在线播放量| 欧美黄页| 色网在线视频观看免费| 亚洲 欧美 中文 日韩超碰| 深夜国产一区二区三区在线看| 精品免费成人久久| 伊人色综合网| 国产不卡的视频 | 人人干人人操人人..com| 欧美日韩性爱精品| 第45页一区二区| 欧美人妻熟女在线| 十八禁成人网站在线观看| 920日本午夜免费| 日韩欧美加勒比| 色盈盈影院| 青草av在线| 午夜国产综合视频在线观看 | 亚欧高清| 久久成人精品| 亚洲AV高潮| 曰韩成人免费视频| 国产97在线视频| 欧美青青草视频| 99色在线| 国产综合网站在线播放 | 欧美性爽xyxOOOO| 狠狠97| 蜜臀久久99精品久久久久免费观| 亚洲成人一区二区精品| 久久久久久九九九九| 五月天色色色| 蜜臀Av一区二区三区| av大香蕉网站| 久久久久成人网| 五月天色图| 欧美熟妇色| 九九在线精品| 夜夜高潮夜夜爽夜夜爱爱一区 | 欧美精品,四区。五区| 亚洲人妻中文在线视频| 人人爽夜夜玩视频| 蜜臀久久99精品久久久久久久久| 强奸乱伦av电影| 久久久久久69国产一区二区| 另类图片综合| 欧美亚洲系列| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 午夜精品久久久99| 黑人天8A∨高清网站| 五月天丁香| 成人欧美一区二区三区黑人一| 日韩欧美加勒比| 97超碰欧美手机| 蜜区区视频79 | 天天澡天天爽日日av| 色色无码| 国产精品一区av在线| 91人妻少妇| 色眯眯av| 国产a级精品| 国产精品自产拍在线观看社区| 伊人久久在线视频观看| 人人摸人人添人人操 | 69视频入口| 囯产精品久久久久久久久久梁医生| 99999精品| 国产精品扒开腿做爽爽爽视频| 97在线免费看视频| 97干在线视频| 久久永久无码人妻视频| 国产传媒av天美传媒在线| 97久久国产精品女不卡| 9Ⅰ超碰| 东北熟女91| 青青在线视频日韩欧美| 丰满人妻一区二区三区免费,| 国产91精品福利在线| 97人人模人人爽人人| 无码高清少妇久久| 在线日韩日本亚洲国产| 亚洲超碰97| 久久久久元码视频| 欧洲射精91| 果冻国产精品麻豆成人av| 欧美大波激情xxxx| 91久久午夜无码鲁丝片久久人妻| 久久99午夜精品一区人妻| 人人操人人舒服| 亚瑟国产精品久久无码| 欧美亚洲另类在线蜜桃| 国产小u女在线观看| 99综合免费视频| 欧美制服网站美腿丝袜| 国产成人综合网| 亭亭丁香激情| 激情五月天校园春色网| 综合情欲网| 超碰人妻97| 91亚洲综合在线| 69XX一中文字幕人妻91| 国产精品久久久久久久毛片1| 五月丁香六月综合缴清无码| 韩日无码在线观看| 欧美日韩国产中文超碰| 日本欧美色| 亚洲一区二区 麻豆传媒| 精品一区二区2| 久久精品超碰| 成人自拍三级在线观看| 99热这里只有精品8| 2025亚洲男人天堂| 天天干夜夜操一区二区| 亚洲 欧美 第一页 | 俺去俺来也在线www| 精品 码产区一区二-1080P高清在线www-B029AV | 欧美96交| 国语精品av| ..日韩av毛片精品久久久| 9色在线| 91 在线亚洲| 色诱avtt| 91强在线播放| 亚洲人妻在线精品| 国产 v乱码一区二| 欧美三级免费伊人| 国产精品扒开腿做爽爽爽视频| 麻豆久久一区二区三区| 日本国产高清色www视频在线| jizzjizz欧美| 人人摸人人干| 亚洲欧洲激情卡通另类文学四射小说网站| 天天插夜夜操| 亚洲欧美综合区自拍另类| 国产精品久久久久久无码红治院| 一级A啪啪啪啪| 久热在线精品免费观看| A V少妇特黄三级| 嗯嗯啊啊日韩精品| 无码人妻一区二区三区色欲aⅴ | 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 天天上日日上日韩精品| 激情综合婷婷| 色偷偷男人的天堂麻豆| 黄色AAAAA欧美| 亚洲精品a人片在线观看视| 成人性爱电影一区二区| 久久久久久久久9| 久久噜噜噜精品国产亚洲综合| 成人激情无码在线视频| 岛国黄片网站| 高清无码网址| 中 文字幕一区二区三四 五 区日 日 骚 | 青青欧美| 国产日韩区| 乱精品一区字幕二区| 日本久久久久久久久久| 无码国产精品久久久久| 亚洲第91页 | 色噜噜人妻丝袜a∨先锋影| 97香焦色区| 青青伊人这里只有精品| 啊啊啊久久久视频| 偷拍三区| 黄站在线免费观看| 欧洲色| 十八禁视频一区二区| 97精品在线| 亚洲成人一区二区精品| 国产欧洲精品亚洲午夜拍精品| 欧美在线91| 激情五月天色色| 玖玖爱免费观看视频| 国产精品久久久久绯色| 玖玖综合视频| 国产无马av| 欧美激情 亚洲色图| 99热只有| 后入合集| 91麻豆天美国产欧美| 久久老女人| 亚洲91网。| 一级aaaaa欧美中文字幕录像片| 少妇99| 人妻少妇av在线观看| 久久久精品视频欧州站| 东北丰满熟女国产一区| 欧美BT 亚洲色图| 长长久久免费视频| 无码精品久久久久久亚洲| 婷婷色网| 久久亚洲AV无码专区国产精品| 国内毛片四区| 色97| 精品成人无码| 91爱欧美| 国产亚洲在线观看| V A在线| 五月天人妻综合| 国产精品国产自产高清AV| 全国男人天堂网| 久久国产99精品72福利| 亚洲黄片免费在线播放| 久久久九| 免费在线黄片视频| 婷婷丁香人妻| 中文字幕乱碼在线| 91快色色色色色| 精品视频一区二区| 东北女人被操| 大色综合| 美国日韩黄片| 91亚洲电影| 五月激情影院| 丁香五月偷拍| TS人妖另类精品视频系列| 人妻激情在线视频| 欧美美逼| 久久人妻熟女一区二区| 国产狂喷潮在线精品| 五十路六十路七十路熟婆| 日本亚洲嫩草影院啪啪| 天天看精品动漫视频一区| 91色人| 欧美激情 亚洲色图| 骚乳在线| 亚洲精品乱码久久久久久蜜桃麻豆 | 精品国产www久久| 久久久精品91八戒| 青青草在线视频播放器| 日韩精品99久久久久久中文字幕| 亚洲人成网www| 欧美人与性动交a美精品| 精品人妻一区二区三区四区不卡在| 99re这里只有精品3| 欧美黄片欧美黄片xxx| 亚洲AV麻豆Aⅴ无码电影一| 91在线观看,天天综合| 日本91白丝| 国产 日韩 欧美高清| 九热中文字幕| 一本一道久久综合久久| 亚洲青色欧美| 中文字幕一二三区| 久久人妻视频网| 一本精品日本在线视频精品| 人妻精品一区一区三区蜜桃91| 95精品在线| 欧美99热| 丁香五月激情婷婷| 国产97在线视频| 97精品国产97久久久久久| 天天上日日上日韩精品| 精品一区二区三区蜜桃臀赵总| 国产一级高清免费观看| www.高清无码诱惑一区.com | 久久久9999| 综合熟妇一区二区三区| 媚薬在线视频麻豆| 欧美 亚洲 大香| 国产午夜福利视频在线| 日日日啊啊啊| 91 国产丝袜在线放观看| 在线啊啊啊啊| 国产视频一区二区在线观看| 不卡中文字幕aⅴ在线| 五月婷视频| 91操熟女| 日日干夜夜欢| 午夜一区二区三区国产| 啊好爽快点-国产一区二区三区撒尿在线-成人AV| 久草精品视频| 国产女人操逼视频| 视频二区美腿制服人妻欧美|