亚洲有码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
返回資訊列表
免费看片黄| WWW操逼| 欧美熟妇成人一区二区| 国产亚热在线久久| 欧美综合网A| 色色色综合| 9999久久久| 国产a级精品| 亚洲欧美色图小说| JuliaAnn丝袜熟女系列| 欧美一级专区免费大片| 狠狠干,狠狠操| 激情综合网亚洲| 日本蜜桃| 91色鬼| 高清一区AV无码| 欧洲站一级二级三级h| 精品国产少妇高潮视频| 一级性爱啪啪视频| 99re视频在线播放青草| 蜜臀色乳| 久久久性少妇| 91视频女生| 久草在| 激情综合五| 大香蕉人妻| dy888午夜老子影视达达兔| 青青操日韩| 丰满人妻一区二区三区免费,| 韩日色费| 国产精品盗摄 偷窥盗摄| 国产熟女精品区| yirendaxiangjiashipin| 欧苏综合色综合| 亚洲经典啪啪| 欧美日韩操操操| 91麻豆天美传媒在线| 美女十八禁| 99爱久久视频频| 激情久久久| 欧美黑人与女人91| 最新9久久久9免费视频| 高潮综合网| 男人的天堂啪啪| 国产激情在线| 日韩精品.久久精品.AV女优.天美传媒| 操逼视频亚洲| 91午夜无码| 凹凸视频在线观看伊人| 久9re热视频这里只有精品| 熟女91网站| 鸡巴插逼视频| 亚洲第一综合| 丝袜av一区二区三区| 啊啊啊好大好湿| 丝袜色综合| 97在线亚洲| 新怡红院| 人人操人人摸人人看人人干| 亚洲无线码欧洲精品区别| 久久久久夜夜夜夜| 无遮挡男女激烈动态图| 亚洲色图91| 自拍六区| 二男一女成人A片| 密乳AV免费观看| 人摸人人操人| 嗯嗯啊啊视频一区二区三区| 一本色道久久综合精品婷婷| 青青久久手机线视频| 任你艹| 天天日日夜夜| 97精品综合久久网| 国产乱码久久久| 中文字幕一区二区三区50路| 国产精品呦一区二区三区| 国产精品网址| 婷婷五月天_亚洲小说欧美激情另类_精品久久国产字幕 | 亚洲精品黑丝| 91亚洲丝袜| 国产97视频| 91啦人妻| 国产黄a三级三级三级av在线看| 国产精品青草综合久久| 男人天堂2012| 亚洲资源一区| 久久精品国产亚洲AV高级北京| 男人夜色天堂ss| 爽爽爽免费视频| 婷婷色网| 蜜桃AV天堂| 黑人在线91| 精品国产一区二区三区香蕉欧美| 午夜天堂精品久久久久91| 亚洲国产精品久久久男人的天堂| 男女无套 免费网站| dy888午夜老子影视达达兔| 久久久久久国产精品免费网站| 亚洲性综合9| 欧美日日人人天天| 成人精品久久久午夜福利| 五月天色色网站| 日韩97超碰中文字幕| 蜜臀在线网站| 九九综合久久| 猛猛干| 激情五月天插| 日本久久综合| 免费av大片| 91女在线观看| 大香久久| 99热只有| 福利社区午夜一区二区| 五月天亚洲网| 久久精品国产亚洲AV片多多| 国产人妻精品久久久一区二区三区 | 操我啊啊啊啊啊| 清纯唯美综合亚洲| 五月丁香六月激情| 夜夜躁狠狠躁日日躁av| 激情综合婷婷| 日韩天天综合| 国产白嫩精品久久| 天堂69亚洲精品中文字| 青青草在线视频人人想人人上| 亚洲激情片| 国产亚洲人妻综合日韩 久久| 性欧美第一页| 99这里只有精品| 午夜爽爽爽| 日韩中文字幕二区| 国产精品不卡少妇白| 久久久久国产无av| 日韩三级伦理中文字幕| 国产无马av| 天天综合麻豆视频| 国产亚洲99久久精品| 天美麻豆黄色录像| 精品一区二区三区蜜桃臀赵总 | 国产13区| 人人干人人搞人人摸| 欧美色图在线视频少妇| 婷婷五月天成人网| 国产精品成人AV片免费看网站| av操操不卡| 欧美成人A√在线一区二区| 欧美精品久久96人妻无码| 国产乱伦亚洲| 蜜汁欧美| 欧美大香蕉在线观看| 精品人妻视频一区二区在线播放| 国产亚洲精品自在线亚洲情侣| 夫妻AV网站| 久久精品小视频| 男人天堂网站| 啊嗯好大视频在线观看| 麻豆国产尤物AV| 久久婷婷电影网| 91天天c| 另类天堂| 蜜乳Av成人片网站| 成人26uuu| 一本色道久久综合熟妇| 欧美性天天影院| 人妻一区视频| 国产一区二区三区高清视频| 99福利社| 中国熟女91| 天天色香欲综合网| 欧亚性爱视频免费看| 亚洲黄色| 啊啊啊好疼| 91女网站| 99色在线观看| 日韩欧美综合激情| 日韩激情电影中文字幕| 国产日韩久久| 亚洲骚逼少妇| 日韩专区久久久| 俺去久久| 天天拍天天操| 偷看洗澡一二三区美女| 激情 欧美 亚洲 小说| 日日摸日日弄日日拍| 超碰97玖玖爱| 丝袜熟女2P| wwwcaobibi| 欧美真人抽搐一进一出gif | 美女尤物福利视频| 1区2区3区在线视频| 国产福利av精彩对白| 精品综合久久久久久五月天| 91欧美网| 91亚洲欧美激情| 伊人午夜福利视频| 色哟哟1区2区| 精品网站9999| 成年女人一区| 超碰久久中文| 日韩AV中文字幕电影| 丁香五月激情啪啪| 99re6国产精品99re在线| 天天天天操| 婷婷激情五月| 超碰亚洲欧美日韩无| 中文字幕成人| 91在线|亚| 国产精品一区二区三区在线密挑| 欧美专区第一页| 亚洲午夜免费狠狠干| 久色网| 欧美精品日韩一区二区| 国产日韩欧美三级片| 亚欧韩av| 色综合色色| 超踫中文字幕| 亚洲综合影片| 国产精品在线一区二区| 91在线一起| 欧美最婬乱婬爆婬牲视频| 精品美女人人干| 蜜臀99久久精品| 久久久9 9 9精品| 超碰社区97| 久久风骚城市| 麻豆成人AV| 熟妇综合一区二区三区| 国产精品视频自拍在线| 女人高潮抽搐喷水视频网站| 97午夜剧场日韩| 97超碰无码网| 欧美韩日精品99综合| 96久久久久久久| 免费在线看黄片av| 午夜福利av电影在线| 久久久久九九九| 激情五月综合网| 精品熟女一区=区三区| 欧美综合色站| 看黑丝美女操逼青青网站| 好好的日:com久久九九| 青青操在线亚洲视频观看欧美在线 | 色哟哟国产精品免费网址| 亚洲不卡不卡中文字幕不卡| 久久久99999久网站| 少妇高潮九九九九九九九| 亚州性9| 人人人人插| 亚洲激情久久| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 色蜜AV| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 国产视频第二页| 熟妇xxxxx性春色| 蜜桃av综合网发布| 91网亚洲| 国产精品成人午夜福利| 日本不卡高清视频| 亚洲有薄码区日本系列中文字幕| 青青伊人加勒比海| 婷婷丁香九月| 久久久久久波多野吉衣高潮| 一区| 亚洲中文字幕精品一区| 日本污ww视频网站| 99国内熟女露脸视频| 蜜臀久久99精品久久久久久无删减| 97在线观看播放视频| 日日干夜夜干| 亚洲色天堂九9| 久久东京伊人一本到鬼色| 98色网| 强乱老妇中文字幕| 久操大香蕉手机视频在线看| 色一区二区三区综合| 俄罗斯一区二区视频在线观看| www.色婷婷.com| 麻豆区久久久久亚| 精品一区二区综合熟妇| 91女优在线观看 | 嫩草美女久久| 天天看特黄的免费网站| 国产毛片片精品天天看视频| 欧美毛片在线网| 少妇的嫩逼图片| 黄色免费网页无码| 美女网站黄页| 黑人狂躁日本妞一区二区三区| 欧美欲色| 一区操逼| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 丰满人妻一区二区三区免费| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 91free福利| 污电影在线观看| 免费啪啪av| 330Dv国产女人终合视频极品人与兽| 中文字幕久久婷婷丁香五月天| 午夜天堂精品久久久久91| 一二区在线观看视频| 欧美精品1区2区3区| 大干人妻| 夜夜一区二区| 日韩性爱啪啪视频| 欧美日韩天堂| 高清在线偷拍自拍视频| 97国产精品| 91在线视频免费中出| 丁香色狠狠色综合久久小说| 国产AV天美| 综合av社区| 青草影院内射高潮| 色色五月婷婷| 麻豆国产97在线| 妇女视频网站| 91超级碰碰| 男人天堂东京热| 人妻美腿丝袜制服诱惑综合天堂-| 国产无码三级视频在线观看| 欧美在线中M| 久久精品99| 国产成人亚洲精品无| 亚洲丝袜色图| 婷婷激情五月天小说网| 青青在线视频免费| 96AV久久久| 国产高清26uuu| 国产农村妇女毛片精品久久| 99热色精品| 美女被啪到深处抽搐视频| 亚洲永久永久永久永久一级一级一级精品| 一本一道vs波多野结衣| 亚洲国产综合视频| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 日骚逼视频| 日本伦理一区二区| 亚洲精品成人激情在线| 操逼视频国产无套| 热热色中文无码| 国产精品第二页| 可以免费观看的AV| 浪人综合网| 91社区伊人| 啊啊啊久久久视频| 国产精品2020| 久久乐| 国产熟女完整版中字| 久久久久久久91| 91国产在线精品| 午夜精品一区二区三区三上悠亚| 欧美操逼熟女| 97超碰磁| 26uuu成人影片| 一本色道熟妇| 97久久国产精品| 熟妇人妻一区二区| 男人兔费天堂| 日本女人操逼| 亚洲成a人在线观看久| 狠狠操,使劲操| 久久丝袜| 中文三一区| 天天色踪合| 97硬碰| 96久久科窝| 丁香六月激情| 国产亚洲国产超碰| 97久久超碰| 国产女人91精品嗷嗷嗷嗷| 亚洲无码成人精品| 欧美日韩插逼视频| 中文视频在线观看| 9久久久久| 色区97| 超碰97人人乐| 97久久久久久久久久| 国产和美国毛片| 97自拍一区| 自拍视频大全亚洲专媒视频/一区二区三区 | 国产乱码精品久久久久久| 中文伊人大香蕉视频| 婷婷五月色| 五月天激情视频| 色婷婷五月天| 91视频国品一二三区| 天天干天天干天天| 日本人妻一区二区| 日日AV加勒比| 蜜桃狠狠色伊人亚洲综合| 日韩无码久久熟女一级片| 夜夜国产一区| 天堂精品一区| 97亚洲精品超碰| 99无码| 欧美精品成人一区二区在线观看| 国产成人99久久亚洲综合| 日本十八禁免费看污网站| 另类小说综合网| 国产免费操逼| 超碰人人色| 久热色情精品| 青青草久久| 人妻喷水| 人人爱人人乐人人操| 国产精品久久aV| 啪啪91| 日逼视频日本| 插日本熟女视频| 日韩欧美俄罗斯A片| 欧美一区二区观看在线| 婷婷91| 男人的天堂,欧美亚洲另类国产日韩,日本高清一区二区 | 99夜夜操| 26uuu性| www…国产操逼| 婷婷五月色| 中文字幕加勒比海高清无码免费视频| 在线亚洲精品久久久| WWW美腿丝袜香蕉中文| 久久久久久人体| 国产精品国产亚洲区艳妇糸列| 手机在线播放国产福利| 久久最新免费视频23| 天天舔天天日天天射| 日比av无码| 少妇一区二区三区精选| 五月丁香六月| 国产精品69久久久久久久 | 激情露脸爱| 天天综合网合集91| 亚洲在线网站| 婷婷五月在线视频| 操死我了啊啊啊| aa片毛片| 婷婷五月综合在线| 330dv亚洲成年视频网| 欧美性色欧美| 亚洲最新a在线观看| 亚洲情色1区| 免费99精品国产自在在线| 人妻夜夜爽天天爽三区麻豆AV网站| 丰满人妻一区二区三区四区| 亚洲另类色图片| 变态另类专区| 国产三级多多影院2022国产AA一级毛片无码 | 日本岛国黄色网址| 麻豆精品三区视频| 在线人成亚洲视频免费观看| 色婷婷导航| 亚州熟妇精品| 九九视频黄色片| 99国产精品人妻人伦| 亚洲久久东京热一二三四五区视频| 夜草网站| 中文字幕在在线观看网站| 精品人妻少妇| 免费观看啪视频| 嫩草91| 无码丰满熟妇一区二区浪潮AV| 久久一二三四五六七八九区区区| 亚洲丝袜二区在线| 在线观看日韩av不卡| 亚洲天堂人人妻| 日本人妻中文字幕精品| 丝袜天堂| 精品人妻av在线播放| 欧洲精品一区二区三区| 欧美偷拍区| 久久久∴| 可能人人看人人摸| 色偷偷男人的天堂麻豆| 亚洲天堂人妻熟妇视频| 亚洲熟女少妇免费视频| 婷婷视频网| 亚洲丝袜少妇在线| 亚洲日韩肥臀视频在线观看| 九九九精品| 中文字幕加勒比海高清无码免费视频| 秋霞色色影院| 精品无码人妻一区二区免费蜜桃| 极品综合| 香蕉av一区二区三区| 黑人嘿嘿嘿超爽免费视频| 欧美中字不卡| 日韩精品99999| 国产精品久久久啊| 国产五码丝袜屁眼| 91人妻素女| 成人青青草原伊人| 午夜呻吟欧美| 国产欧美日韩一区二区三区| 日韩日韩日韩-国产乱码精品一区二区| 久久欧美性爱视频| 国产熟女精品一区二区| 欧美白嫩在线放| 色乱二区| 91精片| 亚洲综合骚逼| 九月婷婷| 日本性爱欧美性爱| 精品少妇一区二区| 九九九久千久久激情蜜桃在线看| 多毛小伙内射老太婆| 亚洲欧美激情小说| 青青草吊丝| 91成人久久| 久久在肏| 亚洲欧美日韩国产丝袜自拍中文| av中文在线| 自拍偷拍第26| 中国韩国明星一极片一区乱码毛片人妻熟女一区二区三区 | 中文字幕熟女人妻丝袜| AV在线资源| 婷婷在线精品| 国产精品区在线12p| 人人操人人操人妻人| 欧美五区| 99re视频在线观看这里只有精品| 香蕉久久AⅤ...| 色欲久久99国产精品久久久久久| 熟女高潮合集-永久久久-成人AV| 五月天社区| 亚洲少妇综合在线播放| 污色区网站| 美女黄色91| 98精品国产乱码久久久久久| 亚洲中文字幕有码视频一区二区三区| 日本午夜福利影院| 日本性爰一道本| 超碰97中文| 精品人妻一区二区三区蜜桃视频| 青青草啪啪网| 在线啊啊啊啊| 亚码激情| 夜夜爽33333| 伊人色综合网电影| 欧美黄片欧美黄片xxx| 囯戸精品高潮呻吟旡码| 日韩av在线精品观看| 日本精品一区二区不卡| 成人AV在线网站| 久久久久久久久久久久欧美日| 麻豆久久久久久久久丝袜| 免费看一级a性色生活片久久无| 一区二区三区黄色片a| 少妇一级无码精品| 日本操逼视频免费| 东北女人操逼| 中文字幕欧美丝袜07资源| 97在线公开视频| 91在线丝袜| 日本一级不卡一二区| 大香蕉青青9| 射丝袜大香蕉| 亚洲综人| 欧色网址| 亚洲欧美第一页| 免费国产视频| 在线播放成人高清免费视频| 乱伦熟女专区| 黄色片,com| jk白丝没脱就开始啪啪| 国产曰批免费观看久久久| 密乳AV免费观看| 性开放中文AV高清无码免费看| 欧美日日操| 18禁网站在线播放| 无遮挡h肉动漫在线观看| 女人双腿搬开让男人桶| 五月丁香影院| 久久99黄色卞西瓜| 欧美情色男人的天堂| 色网在线| 老鸭窝在线视频播放| 噜噜噜噜久久久精品免费| 96精品久久| 中国AAAAAA黄色片| 色婷婷激一区二区三区| 91麻豆va国产精品| 欧美大码在线视频| 亚洲熟女乱熟乱熟妇综合网二区| 成人欧美日超碰| 后入福利视频| 亚洲精品91| 国产真乱mangent| 日本精品无码三级网站| 丁香五月偷拍| 国产丰满熟夫69mpp| 91网站在线播放| 亚洲欧美另类图片| 91精品女厕偷拍视频| 亚洲AV成人在线| 乱理日韩中文| 91插B网站| 国产毛片毛片4p懂色| 久久精品国产亚洲AV高级北京| 91久久99久久91熟女精品| 久艹伊人精品综合在线| 蜜臀99久久精品| 尤物av网站免费在线播放| 日逼国产| 欧美性区| 欧美天堂在线| 国产浮力影院第1页| 色av中文字| 日日干夜夜骑| 日韩无码视频黄色| 五月激情在线| 日韩精品国模| 欧美性爱第一页久久| 91丨九色丨43老版熟女| 久草热制服丝袜在线观看 | 男人的天堂在线有码| 在线亚洲丝袜视频网站| 欧美组图日韩亚洲中文字幕| 无套内射性感少妇视频| 综合97亚洲| 久久精品国产Aⅴ| 欧美在线干| 大香蕉色欲AV| 爽极品影院| 欧美少妇一区二区三区| 欧美美女视频| 91热爆在线| 欧美在线色| 特级特黄一级毛片免费| 热天堂一区二区| 欧美97色| 日韩人妻少妇 一区二区三区| 激情四射五月天| 偷拍三区| 男插女青青影院| 三级日韩一区二区三区| 九九九午夜| 日韩一二三区| 爽爽歪在线视频| 日躁天天爽爽| av中文字幕在线熟女| 欧美激情内射| 99这里只有精品| 天天天干977| 免费黄色视频网址| 超碰色97| 69精品少妇一区二区三区蜜桃| 精品少妇一区二区| 久热超碰| 麻豆av一区二区| 免费观看的av| 天天爽天天操啊啊啊| 中文字幕日韩综合| 另类图片综合| 欧美综合第一| 天天操夜夜操狠很操| 高清肉丝中文无码| 国产成人免费观看在线视频| 色九色久| 亚州色图第三区| 亚洲欧美另类激情小说| 久久天天躁日日躁狠狠躁| 国产强奸乱伦xd| 亚洲男人的天堂网| 国产CHASE男男GAYGA 毛多色婷婷| 偷拍新久久| www.久久| 免费看片黄| 精品一二三区女同| 六月婷婷综合| 2017大香蕉| 上床不卡网站| 免费看久久久性性| 97免费在线观看| 91麻豆天美传媒HD| 国产九九九九九九九九| 日韩综合色图| 成人在线永久| 丁香五月大香蕉| 操b在线观看| 97就爱干| 欧美不卡在线美女| 又大又长又粗又爽又黄| 丝袜美腿操av| 日韩成人午夜精品久久高潮| 91丨熟女丨丰满熟女| 97资源久久| 1000午夜黄色| 国产乱码久久| 韩国午夜理伦三级好看| 精品传媒在线一区| 大香蕉欧美国产日韩高潮| 99热综合| 性久久| 色噜噜国产精品视频一区二区| 插老姨肥穴| 99色热| 国产精品免费日韩| 呦呦一区| 插插综合网天天影视网| 日本999精品视频| 色欲天天综合网| 大黄片做爱的大的| 黄片www视频免费| 亚洲日韩黑丝| 精品96久久| 黄色网址久久精品欧美喷水| 激情综合二| 欧美Ⅴ性爱| 啪啪啪综合| 亚洲精品国产熟女久久久| 青青草黑寡妇男人天堂| 欧美99热| 亚洲精品精品一区二区| 九月激情婷婷| 国产毛片片精品天天看视频| 99999久久精| 热热色国产一二区AV| 麻豆人妻少妇在线免费观看| 97色五月天完| 麻豆人妻精品一区二区| 日本护士高潮| 日韩国产在线观看av| se吧提供国产乱老熟视频胖女人| 后入式免费视频| 快播电影网日韩新片| 色眯眯av| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 狠狠婷婷亚洲中文综合久久| 日本二三四区| 日天天九九天堂666| 四虎免费视频| 91处女在线视频| 久久亚码| 啊嗯嗯啊好大好爽| 欧美亚洲涩涩| 爱妻综合网| 毛片麻豆91糖心精品毛情片| 91久久久老司机| se,,,亚洲欧美| 夜夜骑天天燥| 欧洲精品欧洲精品| 麻豆a'v电影| 亚洲影视第一页| 中出91视频| 国产精品日日摸天天碰| 无码人妻一区二区三区四区老鸭窝| 欲综合网| 综合久久9| 美女裸体无遮挡永久免费观看网站| 色悠久| 天美传媒婬乱| 国内毛片国产欧美拍| 欧美午夜视频免费观看| 盗摄女人妻在线| 伊欧美综合视频| 91一起操| 天天摸天天插天天日| 97内射偷拍| 久神马| 2020天天色综合| 人妻丝袜一区二区三区在线| 欧美精品成人一区二区在线观看| 日日操免费视频| 日本免费专区| 国产精品电影| 一个人在线看的黄色电影网站| 色色99| 公司1区2区3区精产精| 亚洲欧洲综合| 国产精品4p在线观看| 中文字幕一区二区在线日韩精品| 欧美三级中文字幕hd| 熟妇熟女视频一区二区三区| 午夜性| 久久九九精品一区二区| 97天堂| 亚洲蜜乳av| 激情99| 中文字幕超碰CAO| 99999久久精| 国产精品午夜福利亚洲综合网| 亚洲女毛多水多21P| 97舔舔| 夜夜夜夜爽| 国产偷拍网站| 国产高潮AA片免费看| 免费看污网站| 欧美啪啪天堂| 99久久精品无码一区二区毛片免费| 国产激情在线| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 色九九综合AV| 久久久久亚洲Av无码专区老牛影视 | 白丝1区2区3区| 在线电影亚洲色图| 国产乱伦亚洲色图高清无码| 97干在线视频| 天堂资源站| dy888午夜老子影视达达兔| 亚洲 国产 精品一区| 江都AV在线| 欧洲视频在线| 人妻乱仑一区二区三区| 国产性感在线观看| 天天爱天天操| 26uuu国产免费观看| 夜夜狠狠躁日日躁色视频| 国产97亚洲| 三级片网站在线播放| 丝袜视频一区二区在线播放国产中文| 俞拍久久国应视频| 无码视频黄色网战| 亚洲综合骚逼| 99在线免费公开视频| 91老司机在线视频免费观看| 亚洲欧美91| 国产精品久久久久无码AV会牛| 2019天天操天天爽天天拍| 亚洲日韩天堂| 亚洲综合五月天婷婷丁香| 天操天操夜操夜月月年年操操| 亚欧性爱无码| 久久偷拍人| 超碰精品日韩欧美国产| 超碰调教97| 97天天综合| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 九九热在线视频| 欧美色图99| 精品亚洲国产成人AV制服丝袜 | 久久直播国产| 裸体美女久久久| 小视频国产| 330dv亚洲成年视频网| 人人艹亚洲| 欧美国产一区二区三区麻豆传媒| 国产男女边吃边摸视频网站| 青青色综合| 人妻一区二区三区视频| 精品人妻视频一区二区三区蜜桃视频| 91精品人妻偷情| 久久亚洲天天做| 精品毛片av一区二区| 伊人精品视频| 黄片com.| 深爱伊人影院| 夜夜一区二区| 97爱爱| 久久久穴999| 日韩免费大片一级播放| AV色五月天| 久久激情视频| 91综合色噜噜| 91欧美丨精品丨入口| 国产69精品久久久久99尤物| 男女香蕉一区二区| 91美女丝袜诱惑视频| 久久精品国产亚洲AV先锋| 殴美日韩m| 无码WWW免费视频网站| 少妇久久久免费| 亚洲综合色网| 女欧美一区二三区| 操淫穴亚洲五月丁香| 超碰九色| 国产丝袜美女在线一区| 亚洲高清少妇| 91久久婷婷| 国产粉嫩蜜臀av一区二区三区| 另类 综合 日韩 欧美 亚洲| 激情五月天丁香社区| 久久久久亚洲| 色网综合网| 91久久久久免| 精品人妻中文字幕4399| 欧美日韩小说| 久久999久| 超碰在线国产| 欧美中文字幕日韩在线| 亚洲大色鬼| 青青青国产| 黄色一级视| 国产 日韩 欧美一区| 亚洲se电影| 99自拍B亚洲| 九九性爱网| 青娱乐福利99| 欧美 色 亚洲| 九九热在线精品视频| 亚洲天堂综合AV| 中文字幕精品日韩中文字幕| 97综合国产| 精品二区三四区五电影 | 人人澡人人弄| 久久久久13| www成人啪啪18秘 免费| 18禁止看精品中文字幕| 亚洲图片小说欧洲| 亚洲综合夜色| 午夜欧美J进J出白浆流出久久久 | 久草草一二三四区久久| 97超级久久强资源| 国产精品老师| 精品亚洲国产成人精品| 天天上日日上日韩精品| 亚洲精品欧洲色| 福利五区| 亚洲色情在线影视| 亚洲三级网址久久最新| 色性综合| 97久久久| 日韩免费看黄片| 十八禁的黄污污免费网站| 色欲天天婬色婬香WWW夜色| 亚洲毛片久久| 国产精品69久久久久久久| 国产乱码精品久久久久久| 又大又黄国产| 亚洲精品男人的天堂| 无码自拍SM| 人妻在线视频| 国产AV激情无码久久无码| 肏逼福利网站| 91欧美亚洲| 97在线免费看视频| 精品人妻一区二区三区免费视频| 美国三级日本三级久久99| 亚洲国内精品成人不卡| 好好的日:com久久九九| 超碰97资源中文字幕| 91女网站| 中文字幕av久久爽Av| 日韩一区二区熟女| 裸体女人草逼视频播放一区,二区,三区,四区,五区 | 极品白嫩美女白浆成人福利在线看| 日韩性爱1级片视频| 99老司机精品视频在线观看| 国产精品视频自拍在线| 啪啪啪东京| 亚洲成人性爱网站在线播放| 人妻丰满熟妇一区二区三| 日韩欧美成人午夜福利| 在线色导航| 欧美成人一级免费电影| 熟女六十路| 依人大香蕉| 日韩三级久久久| 色狠狠综合噜一二三区| 久久111| 婷婷五月天无码 | 亚洲第一狼人丝袜美女另类 | yazhouzaixian| 日本一卡二区在线| 夜夜爽夜夜操| 99精品国产户外露出| 国产精品麻豆成人av| 天天懆天天日| 国产午夜无码片在线观看影视| 五月丁香社区婷婷日韩欧美精品影院 | av在线不卡一区二区三区| 久久久麻豆精品| 操人无码| 亚洲男人的天堂V| 欧美日韩青操| 久久99久久99精品天美传媒棢·纸:. | 97精品免费| 素人一区二区三区日韩| 夜嗨影院| 人妻少妇精品一区二区三区| 狠肏骚人妻| 视频在线中文字幕| 97久久国产| 17c在线成人免费A片观看| 日本欧美亚洲高清在线看| 亚洲.欧美.丝袜.中文.综合| 激情亚洲天堂| 久久精品国产99久久,亚洲日韩久久日本一区一区三区 | 香蕉99秘 精品一区丁香| 尤物黄色在线观看网站| 午夜男人一级A片7777| 超碰超碰欧美| 久色99999| 亚洲久久久| 天天弄天天操| 国产刺激视频| 国产一区二区三区久久精品太古里| 超碰97.com| 日韩 国产 欧美自拍| 久久久久久AⅤ无码免费肉站| 久久精品欧美一区蜜桃| 色亚州人久干视频在线观看免费版| 色97干| 人妻 中文 日韩| 亚洲精品97在线| 精品久操| 精品久久久久久中文字幕三区| 亚洲精品视频在线| 欧美亚洲宗合色性图| 精品对白久久不卡| 多乙久久久久久| 在线视频一区二区传媒| 少妇淫妇久久久久久久| 在线观看AV片| 91久久午夜无码鲁丝片久久人妻| 欧美啪啪啪91| 无码WWW免费视频网站| 亚洲av总站| 91爱网| 日本国产成人亚洲精品无码| 日本黄色裸日本黄色裸体| 国产传媒日韩| 色色婷| 欧美线天码中字| 久久黄色性爱视频| 欧美中文字幕一区 | 欧洲黄色网| 精品一区二区啪啪啪| 白嫩白嫩的午夜九久久久久久久久久久久成人剧场 | 亚洲欧美变态| 一线黄色免费性爱片| 日韩精品高清资源在线| 人人妻人人澡人人爽久久av| 国产精品视频白浆免费| 老司机午夜福利视频一区二区| 2025年A片视频精品| 精品无码久久久| 蜜臀久久99精品久久久久久| 亚洲精品成人| 大色网久久| 天天躁日日躁AAA片李宗瑞| 啊啊啊啊啊啊啊网址在线观看| 日本人妻中文字幕精品| 日少妇亚洲版| 百度百度日本操逼| 欧美日韩国产传媒在线精品| 射综合网| 久草成人福利导航| 久久91| 日本免费不卡二区| 91综合色噜噜| 国产嫩草精品A88AV在线| 一级片视频啪啪| 亚洲精品欧美专业| 人人操我人人干| 中文字幕超碰CAO| 国产Aα| 女上位精品在线| 六十路日本| 丰满人妻一区二区三区免费| 极品色社| 精品国产Av无码久久久亚洲| 综合亚洲情色| 秋霞久久亚洲精品成人| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 精品国产精品一区二区| 91欧| 性色乱AV一区二区| 国产精品视频自拍在线| 久久动漫精品视频这里只有精品| 国产专区第一页| 久久久精品九| 中文字幕 人妻不满 在线视频| 大学生美女口爆| 国产美女精品| 久久久久久精品免费看A级| 精品十八在线观看| 中文字暮97| av无线看| 欧美日综合| 91在线美女| 日韩欧美aⅴ综合网站发布| 久久久性少妇| 婷婷四五区| 欧美黑人精品在线播放| 97资源站国产精品| julia在线观看久久| 五月丁香拍拍激情综合三级| 欧美图片校园春色| 天操天操夜操夜月操月年年操 | 亚洲情色 无码专区| 欧美后进式| 亚洲色系另类精品国产| 97中文字幕一区| 亚洲色图欧美色图制服丝袜| 欧美性爱一级操| 男人天堂2017| 91欧美性| 国产高清1234区| 永久免费发布性爱网| 久久精品熟妇丰满人妻99| 综合91网| 精品久久在线区一区| 懂色AV蜜臀无码精品APP| 久久精品一区二区三区四区五区| 日本高清加勒比| 日韩pv中文| 乱伦系列一区二区| 伊人网免费视频| 超碰色图| 97av,com| 二区熟妇韩日| 97色婷| 十八禁的黄污污免费网站| 日韩无码极品| 传媒在线观看一区二区三区| 一区二区三区无卡视频在线观看| 五月婷视频| 久久久久成人亚洲国产| 天天射天天| 久久久久久97| 亚洲自拍小说| 亚洲日本天堂| 亚洲 se图 欧美电影| 被窝影院午夜看片无码| 亚洲欧美洲综合| 久草线上视频免费看| 91国产大片| 国产suv精品一区二区四区999| 久久婷色| 性爱精品一区| 日本免费人成视频播放120秒| 精品人妻一区二区三区在| 大逼色网站| 2019男人的天堂| 青青草玖玖爱| 青青国产在线拍揄自揄拍| 色女网日韩| 台湾佬激情综合| 色优久久| 色九九综合| 激情综合五月丁香| 久久久成人国产精品无码| 日韩一性一交一A片俄罗斯| 天天做日日做| 欧美日韩不卡a片| 日韩综合无码色欲vv| 九九热久久99精品re| 欧美十八禁视频| 被窝影院午夜看片无码| 国产精品又黄又猛又粗| 精品欧美不卡在线播放| 久久大黄片| 东京热一区二区中文字幕| 狠狠91| 老熟妇乱轮| 国产成人超碰在线| 懂色中文一区二区三区 | 嗯嗯啊啊操死我| 久久久久9久久久久| 丰满人妻一区二区三区在线| 国产原创精品| 欧美天堂日韩三级国产传媒| 大香蕉十区| 日日A∨| 强奸熟女一区二区三区| 韩日自拍| 日日躁天天躁狠狠躁| 中文字幕一区二区无码成人| 天天干嫩逼网| 91国产操逼视频| 1级午夜影院费免区| 国产精品婬乱一级毛片彝族|