色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合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
返回資訊列表
亚洲欧美高清| 人人操人人摸人人看人人干| 国产精品久久久久亚洲av| 人妻人人操| 好爽要喷了| 亚洲精品一区二区精品| 久久av网| 日本不卡二三区| 亚洲性天堂| 欧美日韩国内不卡| 亚州色图片在线色| 另类TS人妖一区二区三区| 狠狠色噜噜狠狠狠狠狠色综合久久| 东北夫妻性偷拍| 久久久久密臀视频| 亚洲 自拍偷拍 欧美| 天天淫人人妻日日色| 人妻色情天天操| AV不卡在线| 成人久久无码www| 唯美清纯 妖精视频| 白嫩国模丰满一二三区| 色哟哟精品1精品2| 中文字幕亚韩| 色天天野狼综合社区| 国产女同视频在线播放| 伊人伊人LD| 免费中文综合精品| 日韩无码久久熟女一级片| 精品久久久久久无码| 亚洲精品97在线| 视频不卡中文字幕| 超碰天天操你比| 亚洲一区二区三区中文字幕| 欧美在线综合| 国产乱婷婷精品二区三区| 国产美女高潮| 色婷婷色99国产综合精品| 亚洲影视第一页| 成人无遮挡毛片免费看| 女人高潮大叫一级毛片| 肉动漫无遮挡h在线观看| 一牛影视久久久一区二区三区| 少妇久久久久久| 深夜激情无码| 亚洲男人的天堂va亚洲男人社| 99精品在线| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 青青青在线高清视频在线一二三四区| 亚洲激情网| 亚洲在线| 夜夜国产一区| 婷婷久久久| 久草尤物| 激情文学亚洲| 亚洲精品天天影视综合网| 第一高清av中文字幕| 91色女| 成人五月天丁香激情综合| 亚洲国产一区二区三区四区国产| 91丨人妻丨国产丨丝袜| 欧美亚洲美少妇一区二区| 国产精品内射婷婷一级二| 丝袜美女诱惑 91 视频| 97久久精品| 大香蕉伊人网WWWn0n| 黄色AAAAA欧美| 久草新免费| 亚洲中文字幕精品久久久久久直播| 78精品| 日韩三级一区 | 欧美成人一区二区三区在线播放| 蜜臀中文字幕| 97AV在线免费观看| 四虎影库国产精品免费| 日逼国产| 欧美一二三| 插入粉嫩少妇视频| 一区 欧美 日韩 麻豆| 国产精品无码论坛| 亚洲aV无码成人在线观看| 久久性爱视频免费看| 941超碰| 成人精品电影| 综合网色| 欧美激情中文字幕另类小说| 欧洲性爱无码区| 四虎精品一区| 伊人国产视频| 日本天堂网| 国内精品伊人久久久久影院会| 亚洲伊人成综合成人网| 欧美桃色网| 91n处女在线观看| 久久久人体| 天天色综亚洲91污| AV和黑人在线播放| 美国一区二区三区视频| 麻豆国产精品午夜视频| 又粗又长又大国产不卡| 啊啊啊免费| 日韩97P| 国产精品操| 久久久免费高清中文视频| 日本新免费二区三区| 丁香激情五月天| 综合色啪| 偷窥自拍A片| 亚洲αv一区二区三区| 热无码中文亚洲H一道本一区二区| 超碰97COm中文| 久久久一二三四区| 亚洲在线观看| 亚洲精品国产拍免费91在线| 丰满人妻一区二区中文| 91青青在线视频| 欧美在线综合| 蜜区区视频79| 性九九九九九九| 亚洲一区二区 麻豆传媒| 欧美亚洲第1页| 2019AV天堂| 一区| 天天天操天天天爱| 大白逼三四级| 大香蕉一人| 老鸭窝成人| 无人区高清电影免费观看一区二区三 www.qmcai2.com | 人人摸.人人色| 天天视频黄| 人妻无一区二区三区| 激情黄色片在线观看| 日韩一区二区精彩视频| 中国女人内射6XXXXX| 亚洲伊人a线观看视频| 久久午夜鲁丝片| 夜夜操av亚洲一区二区| 综合激情一一91| 粉嫩AV一区夜夜嗨| 欧美伦乱| 亚洲97成人在线观看| 操B视频日韩无码| 夜夜天天噜狠狠爱2021| 激情接吻视频久久久久久| 探花激情视频| 亚洲熟妇自偷自拍另欧美| 性感女人网页在线观看视频| 青春草A| 欧美日韩人妻婷婷一区| 精品视频一区二区| 亚洲影院无码在线| 国产亚洲日本精品在线| 亚洲国男人的天堂| 亚洲诱惑天堂 | 亚洲日韩狠狠撸视频| 超碰97久| 精品亚洲黄色片 国产精品导航一区二区 | 国产蜜臀精品一区二区尤物| 黄色片一区二区三区四区五区| 国产性爱乱伦AV| 91精品综合久久久久久五月丁香| 久久久久9999妇女| 男人的天堂 在线一区| 久久大黄片| 中文字幕交换人妻| 91亚洲黑人| 香蕉免费一区二区三区不读 | 风月影院男女十八禁| 青青青青青手机视频| 国产精品成久久久久午夜午夜| 久久综合资源一区二区| 人妻夜夜爽天天爽麻豆三区网站| 日韩欧美三级| 强奸乱伦中文字幕AV| 欧苏综合色综合| 欧美天天综合站| 国内外内射高清视频| 日操粉逼逼| 国产原创精品| 久久内射| 亚洲经典啪啪| 日本99热| 欧美精品不卡一二三四在线91| 欧美91精品国产自产| 人人摸人人叼| 久久亚码| 无码操逼视频一下| 日韩无码嘿咻黑热久| 国产蜜臀在线| 另类小色呦| 国产AV人人 夜夜人人澡| 丰满人妻一区二区三区免费| 无套内射性感少妇视频| 伊人青青草久久| 蜜臀久久99精品久久久久久-DVD| 亚洲午夜AV| 国产欧洲精品亚洲午夜拍精品| 日本成人免费一区二区三区| 欧美极品女人的天堂| 色香91| 高潮的A片激情扒开一区| 超碰人人乐97| 97伊人网| 久热色情精品| 黑人精品XXX一区一二区| 亚洲天堂男人在线| 亚州综合网| 免费观看国产小粉嫩喷水精品午| 国产美女91视频| 久久97超碰| A V少妇特黄三级| 91精品国产91熟女| 蜜臀在线免费观看在线免费观看| 污色区网站| 97色插| 欧美夜夜草视频| 免费看美国人人爽,人人操| 欧洲精品一级二级精品综合视频综合| 人妻嗯啊啊在线播放| 97欧美日韩精品| 农村妇女一级二级三级视频| 97伊人网| 920日本午夜免费| 青青五月天| 一区二区三区精品黑丝白丝酒店对鸡 | 久久久久97| 国产超碰人人操| 男人的天堂kva| 麻豆这里只有精品| 欧美综合自拍| 日韩精品熟妇| 精品国产www久久| 九九五月天| 熟女乱伦二区| 手机看片91人妻| 中 文字幕一区二区三四 五 区日 日 骚| 成人无码在线视频网站| 亚洲自拍另类丝袜综合| 精品伊人久久久大香线蕉小说| 久久久999国产精品| 久久久夜夜嗨免费视频| 欧美色亚洲| 一区二区三区日韩欧美| 久久久久国产精品片区无码直播| 91色宗合| 国产天美传媒精品| 婷婷丁香成人| 东京热一区二区中文字幕| 日日夜夜骚| 午夜久久无码1000合集| 亚洲熟女综合网| 久久久久久久国产| 五月丁香综合| 黄色免费一级在线毛片| 久久精品人妻一区二区| 青青草中文-久久青草精品一区二区三| 欧美色图亚洲色| 欧美香蕉视xxx| 亚川综合视频| 干超碰碰熟女| 国产精品禁久久久精品| 5252色欧美在线| 国产无马av| AA级电影三区| 色拍偷亚洲| 五月丁香六月| 黄网色一区二区三区四区精品| www国产无码| 日韩在线观看AV| 欧美日韩亚洲高清不卡一区二区三区| 亚洲 自拍偷拍 欧美| 日韩15p| 亚洲强奸乱伦影视网| 97干色| 麻豆a'v电影| 懂色AV中文| 婷婷色色五月| 日韩精品黄片免费观看| 亚洲色系另类精品国产| 亚洲?V高清一区二区三区尤物| wwe 天天干.com| 色狠狠 - 百度| 秋霞 色色| 玖色av| 激情四射五月天| 天美国产精品| 91超碰人人| 欧美性爱一级操| 日韩精品碰碰| 性猛交| 一本久道久久综合狠狠爱一密臀精| 91老熟女91老女人| 色哟哟av| 欧美激情内射| 日韩天天综合| 阿姨一区二区免费视频-高清正片西瓜视频下载app-T450AV | www.人人摸在线视频| 国产视频大全| 搞中出视频在线观看| 香一区二区三区| 麻豆国产尤物AV| 中文字幕一区二区三区视频播放| 日韩A优精品在线观看| 欧洲综合无码| 日韩无码操逼片| av爱爱爱| 二男一女成人A片| 熟女乱伦A| 婷婷色综合欧美日韩| 97爱综合| 97国产精品一区二区传媒公司| 国产精品禁久久久精品| 综合五月天| 亚州精品一区二区三区香中文字幕在线| 亚洲欧洲日韩国产自在线| 欧美国产精品| 亚洲三区视频| 在线免费观看日韩一区| 国产乱伦一二三区| 色色婷婷五月天| 99色| 精品91摸| 色大师网站www永久网站视频| 香蕉综合网| 少妇超碰在线| 中文字幕日韩精品一区二区三区| 国产精品电影推荐| 2003天天干夜夜操| 91一区二匹| 日韩熟女三十乱伦| 亚洲天堂无码| 天天射,天天操,天天爽-国内精品一区二区三区-成人AV | 中文字幕高清精品一区| 久久综合国产精品国产| 亚洲一区二区三区AV无码| 五月婷婷AV| 亚洲天天艹| 日韩人妻精品中文字幕| 亚洲玖玖爱| 国产精品久久久久久久久久久久久久吹| 亚洲综合电影| 乱伦日本色图AⅤ| 久久九色| 啊啊啊啊啊好大好舒服想要| 亚洲一区中文字幕| av网站免费线看| 日日操丁香五月天| 天天欧美欧美亚洲网| 亚洲黄色影视| 日韩中文字幕2020| 久操免费在线| 91人妻精华帖| 性色avv| 九九久久国产精品| 五月天亚洲网| 强奸乱伦AV网址| 欧美日韩成人| 国产自产22区| 亚洲欧洲日韩天堂av| 伦理片秋霞免费影院| 久久久久ab| 999精品乱码| 激情综合 婷婷五月 红杏| 中文AV制服乱伦| 丰满人妻大屁一区二区| 欧美老妇女内射网址| 操熟女91| 免费看日本操逼视频| 激情小说五月天| 久久视频少妇美女| 日本中文字幕不卡视频| 国产精品免费视频人成| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 操死我干死我| 天天日天天干少妇日| 天堂av2019| 午夜超爽| www鬼畜国产男人的天堂| 国产精品另类一区大香蕉| 操人人| 91xingse| 亚洲少妇自拍中文字幕懂色| 国产激情在线| 一区,二区,三区网站| 大香蕉视频啪啪啪啪| 欧美亚洲高清| 男人天堂.AB| 亚洲性高潮| 手机在线观看不卡无码av| 好湿好紧好爽 视频| 97天天插| 一块操欧美| 人人九九精| 国产亚洲精品玖玖玖在线观看| 亚洲欧美爆| 视频一区二区免费在线| 精品人妻二区三区| 国产欧美日本亚洲精品| 91原创在线观看| 99999精品成人| 17c嫩草51久久91嫩草| 97国产超湿| 国产精品96| 色女99一级片在线观看| 亚洲国产成人精品999| AV天堂男人的天堂| 免费啪啪av| 国产亚洲日本| 日韩少妇一区二区三区| 欧美熟妇精品黑人巨大91| 国产精品69人妻无码久久久| 欧中美三级一区二区三区| 精品人妻一区二区三区不卡断| 久久久91| 狠狠婷婷亚洲中文综合久久| aV中文麻| 強姦亂倫a| 懂色av中文字幕一区二区三区天美 | 啊啊啊操死我| 九热久| 丰满少妇一区二区三区免费看| 在线观看免费视频国产| 国厂麻豆77q4| www.色五月| 久热免费视频| 91色女| 丰满美女一级毛片在线播放| 青青草乱入乱欲视频在线观看| 操逼片中文| 日韩欧美久久婷婷网站| 另类亚洲图色| 亚洲图片偷拍视频区| 久操免费在线| 欧美精品在线观看| 三级网色| 中文字幕在线免费观看2| 久久久熟妇熟女国产| 国产 三级自拍| 人人妻人人澡人人爽久久av| 欧美中文狠| www.色综合| 亚洲欧洲日韩天堂av| 久久XX| 欧美日韩性爱电影在线| 新怡红院| 97精品97久久| 欧美一级欧美三级在线观看| 强免费黄色网址| 日韩性爱小视频| 亚欧美综合| 色欧美天天| 国产成人bd在线观看| 男女啪啪啪18禁网站| 欧美激情黑人| 亚洲色入欧美| 国产不卡精品91| 欧美淫乱视频| 99热网站| 国产精品毛片?v一区二区三区| 午夜无码熟妇丰满人妻| av一区二区三区 中文| 伊人天天久久动态图| 西西美女视频网| 伊人激情| 亚洲综合一区二区| 人人操人人操人人人操| 国产亚洲福利第一页丝袜| 99热这里只有精品1| 日韩兔费看黄片| 日本孕妇孕交| 97无码视频在线播放| 久久久久久中文字幕中文字幕最新| JuliaAnn丝袜熟女系列| 欧洲大香蕉| 97色色色| 中文字幕欧美丝袜07资源| 91久热这里只有精品| 久操九九九九| 伦激情人妻另类人妻| 国产精品视频在线播放| 99久久久er直播网址| 十八禁啪啪视频| 亚洲熟女综合| 日本天天色| 婷婷导航| 免费黄色片子| 性开放中文AV高清无码免费看| 一级二级在线观看| 素人伊尹大香蕉免费下载视频| 亚洲综合码| 精品国产自在在线99| 操逼逼福利视频| 在线观看不卡一区二区三区| 日韩性爱长视频免费| 噜噜噜噜天天狠狠| 福利天堂| 好屌色综合| 九九九九免费高| 国桃视频产巨乳精品一区二区在线| 日本狠狠干| 欧洲综合色| 大香交| 激情黄色五月天| 久久久久9| 亚洲色图伊人网| yy少妇精品久久| 成熟熟女国产精品一区二区| 在线电影亚洲色图| 亚洲激情片| 无码人妻丰满熟妇奶水区毛片| 香蕉久久AⅤ...| 日本黄色大片一级视频免费麻豆| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 九热大香蕉| 天堂资源欧美| 丁香7月婷婷| 天天干18禁| 日韩美女操b| 日日操丁香五月天| 五月丁香久久| 国厂麻豆77q4| 91蜜臀熟女| 97久精品| 中文字幕丝袜| 精品无码久久久久久国产浪潮| 青青青在线高清视频在线一二三四区| 人人妻人人澡人人爽久久av| 小说区 图片区色 综合区| 精品人妻一区二区视频| 深夜啪啪啪视频免费| 草伊人高潮喷水超碰| 少妇九九九九| 熟女这里只有精品6| 中文自拍欧美影视| 亚洲熟女乱色| 久久婷婷电影网| 大香蕉强奸乱伦| 国产精品经典一卡久久久 | 午夜男人天堂| 欧美裸体美女日麻屄| 国产又操| av2014 日韩在线中文字幕| 韩日性爱av| 欧美熟女激情| 最新av中文字幕高清| 五月天激情视频| 日韩午夜国产| 午夜AV人气不卡| 九九视品黄色| 国产蜜臀精品一区二区尤物| 国产乱伦一二三区| 国产欧美日韩臀 | 好吊色综合| 老鸭窝成人免费毛片视频| 91社区拍啪人妻| 在线黄色污污网站| 午夜AV人气不卡| 精品美女少妇一区二区三区| 26UUU欧美激情一区二区| 色老汉色| 精品国产一区二区三区在线播出| 欧美激情亚洲色图| 国产亚洲精品久久久久小| 99亚洲天堂| 亚洲欧美综合图片| AV天天在线观看| 人人操人人操人人人操| 很很很很操| 91在线精品| 午夜αv| 欧美色图片91| 日本一级二级三级网站| JIZZJIZZ亚洲女人被躁| 超碰久久性爱| www.黄色在线| 国产中文大片资源中文字幕| 白嫩妹子国产骚| 狂操嫩妻视频一区二区三区| 国产精品自拍视频| 蜜臀va69| 美女的肌被草喷水视频| 国产一级作爱毛片| 亚洲图片欧美色图| 51一区二区三区| 精…码一二三区| 中文字幕综合人妻| 欧美在线l亚洲| 免费黄色视频网址| 无码人妻精品一区二区中文| 国产成人亚洲精品无| 抽插一区二区视频| 啊啊啊啊啊啊啊啊啊啊在线观看| 日韩女模中文造逼| 亚洲国产精品有声| TS人妖另类精品视频系列| 国产av色网| 色婷婷综合久久久久中文一区二区| 日韩精品一二三四| 国产 码在线成人网站| 日本国产欧美高清在线| 久操视频资源站公开| 国产农村妇女毛片精品久久| 亚洲伊人久久精品影院| 91欧美成人色站| 毛片17S| 日本中文字幕高跟| 国产成人主播| 夜夜骑操视频| 2017天天插| 久操免费在线| 久久99干一本高清| 后入综合久久| 中文字幕在线免费观看| 国产精品视频自拍在线| 国产99热| 亚洲一本色码中文字幕| 大香蕉92| 欧美性暴力| 97久久精品不卡| 另类成人首页一区| 国产中文字幕在线观看| 久久精品噜噜噜成人看免欧美大片| 欧美性爱一区二区三区| 91熟女丨91老女人| 一区二区三区国产在线播放| 风月影院十八禁| 亚洲欧洲av影音| 久久精品色欧美aⅴ一区二区| 国产情侣自拍在线播放| 偷拍网站久久男女男| 99精品丰满人妻无码| 亚洲97在线| 亚洲一级性爱视频免费看| 国产黄片在线免费观看| 97在线精品| 97视频在线视频| 日本中文熟女视频| www.色婷婷色综合| 欧亚日韩三区| 青青草久草| 囯产乱伦一区二区三女| 欧美天堂日韩三级国产传媒| com 首页 18岁 禁区 女优 免费 精选 同城| 夜夜做夜夜爽精品视频| 成人小说另类在线| 69精品少妇一区二区三区蜜桃| 啊啊啊啊操死我了| 麻豆国产原创AV色哟哟| 超碰久久网| 强奸国产在线| 中文在线久久字幕| 欧美 日韩第一性色| 日本高清视频xxxx| 区一二区日韩亚洲乱码av电影| 麻豆a'v电影| 亚洲天堂中文字| 97精品中文字幕| 日韩综合无码色欲vv| 91电影色诱| 国产激情视频一区区三区| 男人的天堂亚洲| 久久久久久久97| 青青草原人妻| 国产狂喷潮在线精品| 欧美少妇大量自拍视频在线观看| 伊人欧美大香蕉视频| 成人五月香网在线| 精品一区二区三区国产| 麻豆国产原创AV色哟哟| 五十路熟女人妻一区二区在线观看 | 2023天天操夜夜操| 美女诱惑1区2区| 日韩高清黄片| 欧美亚洲清纯| 狠狠躁AV| 少妇一级婬片免费放一级a性色.| 日本欧美成人片AAAA| 久草综合网| 淮穴色AV| 日韩视频啪啪| 亚洲欲色| 亚洲精品蜜桃久久久久久久| 麻豆国产免费影片| 9 1超碰九色| 欧美亚洲20p| 日本操BAV| 日韩有码专区| 日韩一级二级| 99久久久无码国产精品性啊聊| 亚欧美天堂在线| 亚洲一区二区精品福利| 久久大黄片| 国产精品在线一区二区| 老女人日韩美91| 狠狠操夜夜| 99999精品| 久久网亚洲| 久久久久精| 亚洲精品一区二区三区在线播放| 亚洲精品乱码线路中文字幕 | 鸥美插入视频| 黄呦呦在线| 美女刺激久久国产欧美| 亚州综合| 人人摸人人入| 97天天综合| 97久久国产精品女不卡| 亚州高清AV| 久久精品91| 国产一区麻豆免费观看| 亚洲无码色| www.五月天| 91激情综合| 91色爽欧美| 情色日播放AV| 97色伦欧美| 色丁香五月婷婷| 黄色片,com| 亚洲啪啪视频一区二区| 亚洲五码一区二区三区| 91人妻Pr| 另类亚洲图色| 亚洲欧美日韩国产丝袜自拍中文| 欧美国产一区二区三区麻豆传媒| 久久久久久大| 国产精品久久久久久夜夜夜夜| 国产日韩欧美| 国产AV天美| 一本色道久久综合熟妇| 91精品少妇搡搡搡| 欧美日韩欧美| 青春草莓视频在线观看网址| 天天综合~91| 性久久久| 91chinese在线| 综合熟女| 任我爽在线视频免费观看| 综合色好色| 老熟女网站| 日韩综合无码色欲vv| 亚洲av无线观看| 麻豆天美电影一区二区| 东京太热久久久| 欧美91网| 久久东京伊人一本到鬼色| 五月综合色| 久久久久密臀一区二区| 射久久| 亚洲精品一二区| 在现视频女上位好爽| 欧美72网页| 日日躁夜夜躁狠狠躁超爽| 日韩性爱电影一区| 欧美 亚洲 91| 日本性爱欧美性爱| 色噜噜综合网| 日本中文字幕一区| 懂色Av| 五月天综合网| a人欧美综合天堂麻豆| 四方色播| 91色情黑丝搞鸡在线观看一区二区三区三州| 91天天c| 人人操人人爽人人操人人| 99久热| 久久久久久中文| 91 欧美| 久久熟女人| 另类图片欧美激情综合| 熟女自慰久久久| 日韩免费福利在线观看| 少妇 综合| 一级黄色性爱裸体视频| 北京专精特新企业招聘信息| 欧美AB在线| 91粉芽高清在线一区二区| 青青草一本道福利视频| 日韩性爱网址| 国产免费内射视频| 青娱乐导航AV| 这里只有97精品| 久久大香蕉手机高清| 99999精品| 加勒比少妇AV婷婷六月天超碰超碰| 国产五码丝袜屁眼| 欧美成人一级麻豆| 精品国产一区二区三区av在线资源| 色综九九九一区| 美女视频尤物网在线看| 伊人天堂在线| 天天操天天日天天干| 久久五十路熟女人妻| 九九热超碰97亚洲最新香蕉| 久久大| 日本有码影片下载| 伊人网高清| 懂色综合久久久| 久久精品黄色| 久久久999网站| 欧美色91| 永久免费发布性爱网| 一区二区三区成人| 五月天黄色激情视频| 97久久天天综合色天天综合色电影| 秋霞久久亚洲精品成人| 久热久| 久久久免费的精品| 亚洲男人的天堂一区二区| 日韩一级性爱无码| 亚洲美女色图| 国产精品色片一区二区| 91成人社区| 99e久久国产精品| 欧美se亚洲| 亚洲熟伦熟妇AV无码春色| 国产精品麻豆成人AV艾秋| 又大又大又大又粗爽高潮观看 | 蜜桃午夜视频一区二区| 五月丁香综合激情| 东北女人被操| 国产极品一区二区三区三州| 欧美亚洲se91| 亚洲欧洲综合成人av一区| 欧洲一区二区三区免费| 奇米四色影视777久久久| 丝袜综合| 少妇无码av专区线| 伊人久久蜜月| 玖玖爱免费观看视频| 国产有码一区| 99re热有精品视频国产| 黑人精品久久97| 天堂中文日本在线观看| 九九免费影片| 婷婷丁香五月激情啪啪| 国产久久天堂资源| 色婷婷综合久久中文字幕雪峰| 午夜男女爽爽爽影院视频| 亚洲人码13| 五月天玖玖资源站| 大香蕉综合网| 午夜综合在线| 人成午夜免费大片| …亚洲黄色厕厕女女在线播…| 乱理日韩中文| 99re国产精品视频| 久久国产对白激情浪潮 | 亚洲在高跟鞋自慰久久在色线| 人人操人人摸人 | 亚洲人妻五月丁香婷婷| 欧洲综合视频| 中文字幕日韩人妻视频| 人妻黑丝袜电影| 色五月综合网| 高清有码一区二区| 久久一二三四五六七八九区| 67194无码不卡| 99色天堂| 国内毛片婷婷六月色| 久操免费在线| 激情婷婷黑人91| 国产九区| 色播五月丁香| 一级特级aaaa毛片免费观看 | 骚妻少妇精品性色无码四色A V| 亚洲另类综合欧美| 欧美黄片免费在线观看视频| 97色97好| 成人八戒网站| 亚洲无码 国产无码| 欧美少妇高潮| 劲爆欧美人妖三区91| 色噜噜人妻av 中文字幕| 色青青久久影视| 国产在线能看的你懂的| 欧美激情专区| 色原狠狠天天天| 国产精品在线一区二区| 东北老女人的激情视频| 99热综合在线| 亚洲欧洲偷拍一区| 欧美黄片视频在线观看免费 | 亚洲欧美大| 亚洲AV成人在线| 操高情无码| 国产野战露脸在线播放| 98福利在线视频| 日韩熟女精品无码专区一区二区| 99亚洲精品| 丁香五月天堂| 中文字幕在线高清男人的天堂| 国产日韩欧美亚洲精品95 | 9精品久久| 清清草影| 亚洲综合性网址| 精品无码一二三四区| 超碰97资源大奶| 99亚洲精品| 九九九九九九九精品视频| 91婷婷| 九九热AV| 920日本午夜免费| 蜜臀国产AV中文字幕| 五月丁香| 看日韩美女二区三区免费操逼视频| 色婷久久| 九九热视频在线观看| 五月婷婷激情网| 中文字幕高清20页视频| 一区二区偷拍拍视频| 久久男人的天堂国产| 人妻精品视频一区二区三区| 欧成人精品H无码| 97色碰| 日本性爱视频一级| 在线a亚洲视频播放在线| 美女t无毒不卡不卡| 日韩99999| 啊啊啊网站| 久操91视频| 天天草夜夜草高潮片| 丁香五月综合| 97碰在线视频| 人妻天天操天天爽视频免费| 日韩精品99999| 91色爽欧美| 亚av顶级裸体一区二区三区四区五区| 亚洲日韩乱码中文无码蜜桃臀网站| 蜜桃狠狠色伊人亚洲综合| 不卡六六在线91| 天天噜| 成人免费毛片| 精品一区二区人妖| 东京热亚洲一区二区| 毛片17S| 美腿丝袜高跟网免费视频免费视频| 日日干男人的天堂| 日韩欧美三级| 欧洲综合色| 天天做天天爱| 成 人片 黄色大片| 巨爆乳肉感一区二区三区竹菊影视 | 精精品人妻一区二区三区| 啊啊啊啊操死我| 999精品国产高清一区二区| 国产精品一区二区三区,亚洲综合| 日韩不卡毛片Av免费高清| 丁香六月婷婷| 亚洲成人色情五月天丁香花| 乱色老一区二区三区的观看方式 | 黑人与人妻| 久草看看看| 国产精品日韩在线一区| 婷婷五月天影院| 嗯……啊…嗯嗯…啊…好舒服| 久偷拍欧美日韩三区| 91日韩国产欧美亚洲另类精盘州至城都| 久久久99免费| 色五月婷婷色| 伊人991| 亚洲欧美日韩激情不卡| 日韩av不卡在线看| 少妇 综合| 天天综合网亚洲综合网| 国产黄色剧情影片麻豆免费播放| 国产精品免费美女视频| 2025亚洲男人天堂| 欧美色九九| caoni国产亚洲av| 东北黄色电影| 日韩无码AB| 91天美传媒在线观看| 激情在线青青操| 日本性爱网址| 色嘟嘟人妻天堂网| 伊人久久久日韩一区| 97日韩超碰超碰中文字幕| 日本不卡高清视频| 国产精品色色| 超碰精品| 狠久久| 婷婷在线视频在线观看| A片 AV一级在线播放观看免费| 97超碰天天爱天天爱| av橘色网站| 久久精品店| 性色avv| 一起草在线视频| 日本一级黄色电影| 中文熟女五十乱码在线| 一本色道久久天天射天天干| 五月天婷婷欧美三区| 少妇高潮九九九九九九九| 福利操逼| 青青草黑寡妇男人天堂| 久久宗合97| 国精精品无码一二三区水多多| 人人噜夜夜操| 日韩三A大片在线观看| 混色激情av| 久久久久九九九九| 午夜男女爽爽爽在线视频| 大香蕉伊然在亚洲91| 欧美成人一级麻豆| 美女尤物福利视频| 欧美 亚洲 第一页| 免费精品99| 亚洲精品欧洲色| 久久麻豆一区二区| 蜜臀久久99精品久久久久久酒店| 国产免费一区二区在线A片视频| 97中文字幕一区| 无遮挡h肉动漫在线观看| 嫩草 我啊~嗯~在线| 国产三级中文有码在线视频| 日本裸体久久色噜噜| 亚洲影院365| 国产亚卅97| 亚洲AV成人无码一二三久久| 欧美白嫩女HD| 欧亚成人| 激情小说亚洲图片| 久久久精品无码亚免费| 夜夜做夜夜爽精品视频| 18禁在线视频| 欧美影音在线| 在线观看黄色电话| 色原狠狠天天天| 激情婷婷丁香| 中文字幕三四区| 天天干天天日天天射黄色大片| 午夜a成v人电影| 97欧美日韩中文| 女人午夜视频777| 久久久久熟女| 99青草| 人人摸.人人色| 精品一久久久| 俺去俺来也在线www| 久久久999国产精品| 操操逼视频| 国产高清在线自在拍69| 色婷婷九月| 欧美高清16| 97天天摸天天碰| 黑人娇小av在线播放| 欧洲乱码视频| 欧美日韩免费性爱| 校园春色美腿丝袜| 女人妻一区| 亚一综合久久久久久久久久| 婷婷五月天无码| 色色色色综合网| 天天看夜夜看日日干| 亚洲色图 综合| julia高潮后不停追击中出| 97精品人妻一二三四| 2001天天操| 美中日韩无码| 欧美美逼| 天天夜夜久久| 五月激情视频| .精品人妻一区二区三| 色噜噜人妻av中文字幕| 久久久久久久 九九九九九九九| 国产亚洲精品美女久久久久久2021| 中文字幕第7页| 热久久精品| 96久久精品一二三区色欲| 亚洲中文字幕在现观看| 老鸭窝日丰县女人| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 日本不卡一区二区三区| 亚洲超碰在线| 影音先锋日本乱伦| 色噜噜人妻av中文字幕| 五月天伊人| 日韩另类| 伊人久久在线视频观看| 大香蕉手机在线| 男人 天堂 日 亚洲| 激情综合五月天| 成人八戒网站| 强奸乱伦AV一天堂网| 亚洲区限制级| 清清一区二区三区四区不卡视频| aaaa黄片| 绯色一区二区三区不卡少妇| 欧美精品久久| 亚洲精品精品一区二区| 97亚洲综合影院| 2017天天操天天日| 欧美日韩中国x| 神马午夜久久久| 天美传媒国产原创中文字幕亚洲欧美另类| 亚瑟国产精品久久无码| 男人的亚洲天堂| 97人亚洲综合字幕| oumeisetu综合| 久操热| 亚洲Av无码成人精品国产| 搞中出久久| 欧美色日| 色哟哟国产精品免费网址| 99操碰| 做爱A级亚欧| 成·人免费午夜在线观看| com 首页 18岁 禁区 女优 免费 精选 同城 | 日本污ww视频网站| 国产黄色影片在线观看| 亚洲午夜未满十八勿入网站日本又色又爽又黄| 精品熟妇视频一区二区| 大香蕉日韩欧美| 久久超碰av在线| 91路www| 日韩精品人妻中文字有码在线| 中文乱码99| 图色综合网| 精品国产乱码久久久久久口爆网站| 色婷婷日韩精品一区二区三区| 久久久久日本视| 99久久婷婷国产综合| 亚洲一区二区中文字幕| 3d成人精品一区二区| 久干9操| 亚洲古典另类欧美在线| 91小视频| 在线观看综合精品亚洲| 91麻豆va国产精品| 一区二区三区欧美激情| 亚洲欧美中文一区二区三| 国产乱伦视频污| 国产成人超碰在线| 色综合V| 秋霞一级A片黄色视频| 九九九九九九成人| 人人人摸人人| 综合亚州欧美| 久久久96| WWW.操逼.COM| 综合操逼| 五月激情在线| 91亚洲影院综合| 一区久久久二区| 一本久久精品中文字| 亚洲极品| 大鸡巴久久| 国产色产精品在线观看| 一本色道综合久久欧美| 国内亚洲精彩视频在线| 天天谢天天干| 国产精品久久aV| 97操| 精品成人无码| 欧美网站免费| 一区二区偷拍拍视频| 色婷婷在线视频精品导航| 东京热熟女亚洲视频网站| 久久久久久无码人妻中文字幕| 久久99九九九九6666免费观看软件|