日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

springboot使用shiro配置多个过滤器和session同步案例

發布時間:2024/9/30 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 springboot使用shiro配置多个过滤器和session同步案例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 知識點介紹
  • 驗證碼過濾器
  • 登錄賬號控制過濾器
  • 自定義訪問控制過濾器
  • 同步Sesion到數據庫
  • 退出過濾器
  • 定期session驗證任務調度器
  • shiro配置類
  • 自定義Session類(繼承 SimpleSession)
  • 自定義SessionFactory會話(繼承SessionFactory)
  • 自定義的ShiroSessionDao(繼承EnterpriseCacheSessionDAO)

案例代碼來自ruoyi管理系統的shiro部分

知識點介紹

AccessControlFilter

AccessControlFilter提供了訪問控制的基礎功能;比如是否允許訪問/當訪問拒絕時如何處理等:
isAccessAllowed:表示是否允許訪問;mappedValue就是[urls]配置中攔截器參數部分,如果允許訪問返回true,否則false;

onAccessDenied:表示當訪問拒絕時是否已經處理了;如果返回true表示需要繼續處理;如果返回false表示該攔截器實例已經處理了,將直接返回即可。
onPreHandle會自動調用這兩個方法決定是否繼續處理:

boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
return isAccessAllowed(request, response, mappedValue) || onAccessDenied(request, response, mappedValue);
}

配置過濾器的步驟:
1.繼承AccessControlFilter
2.重寫isAccessAllowed onAccessDenied(有時也需要重寫onPreHandle等其他方法)
3.在shiroconfig中配置自己寫的過濾器類,并加上@Bean注解,并配置過濾器鏈:

@Beanpublic ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager)shiroFilterFactoryBean.setSecurityManager(securityManager);// 身份認證失敗,則跳轉到登錄頁面的配置shiroFilterFactoryBean.setLoginUrl(loginUrl);// 權限認證失敗,則跳轉到指定頁面shiroFilterFactoryBean.setUnauthorizedUrl(unauthorizedUrl);.......

(定時任務調度的使用):
4.配置會話管理器加入自定義的任務調度器

/*** 會話管理器*/@Beanpublic OnlineWebSessionManager sessionManager(){OnlineWebSessionManager manager = new OnlineWebSessionManager();// 加入緩存管理器manager.setCacheManager(getEhCacheManager());// 刪除過期的sessionmanager.setDeleteInvalidSessions(true);// 設置全局session超時時間manager.setGlobalSessionTimeout(expireTime * 60 * 1000);// 去掉 JSESSIONIDmanager.setSessionIdUrlRewritingEnabled(false);// 定義要使用的無效的Session定時調度器manager.setSessionValidationScheduler(SpringUtils.getBean(SpringSessionValidationScheduler.class));// 是否定時檢查sessionmanager.setSessionValidationSchedulerEnabled(true);// 自定義SessionDaomanager.setSessionDAO(sessionDAO());// 自定義sessionFactorymanager.setSessionFactory(sessionFactory());return manager;}

驗證碼過濾器

public class CaptchaValidateFilter extends AccessControlFilter {/*** 是否開啟驗證碼*/private boolean captchaEnabled = true;/*** 驗證碼類型*/private String captchaType = "math";public void setCaptchaEnabled(boolean captchaEnabled){this.captchaEnabled = captchaEnabled;}public void setCaptchaType(String captchaType){this.captchaType = captchaType;}@Overridepublic boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception{request.setAttribute(ShiroConstants.CURRENT_ENABLED, captchaEnabled);request.setAttribute(ShiroConstants.CURRENT_TYPE, captchaType);return super.onPreHandle(request, response, mappedValue);}@Overrideprotected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue)throws Exception{HttpServletRequest httpServletRequest = (HttpServletRequest) request;// 驗證碼禁用 或不是表單提交 允許訪問if (captchaEnabled == false || !"post".equals(httpServletRequest.getMethod().toLowerCase())){return true;}return validateResponse(httpServletRequest, httpServletRequest.getParameter(ShiroConstants.CURRENT_VALIDATECODE));}public boolean validateResponse(HttpServletRequest request, String validateCode){Object obj = ShiroUtils.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY);String code = String.valueOf(obj != null ? obj : "");// 驗證碼清除,防止多次使用。request.getSession().removeAttribute(Constants.KAPTCHA_SESSION_KEY);if (StringUtils.isEmpty(validateCode) || !validateCode.equalsIgnoreCase(code)){return false;}return true;}@Overrideprotected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception{request.setAttribute(ShiroConstants.CURRENT_CAPTCHA, ShiroConstants.CAPTCHA_ERROR);return true;} }

登錄賬號控制過濾器

public class KickoutSessionFilter extends AccessControlFilter {private final static ObjectMapper objectMapper = new ObjectMapper();/*** 同一個用戶最大會話數**/private int maxSession = -1;/*** 踢出之前登錄的/之后登錄的用戶 默認false踢出之前登錄的用戶**/private Boolean kickoutAfter = false;/*** 踢出后到的地址**/private String kickoutUrl;private SessionManager sessionManager;private Cache<String, Deque<Serializable>> cache;@Overrideprotected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o)throws Exception{return false;}@Overrideprotected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception{Subject subject = getSubject(request, response);if (!subject.isAuthenticated() && !subject.isRemembered() || maxSession == -1){// 如果沒有登錄或用戶最大會話數為-1,直接進行之后的流程return true;}try{Session session = subject.getSession();// 當前登錄用戶SysUser user = ShiroUtils.getSysUser();String loginName = user.getLoginName();Serializable sessionId = session.getId();// 讀取緩存用戶 沒有就存入Deque<Serializable> deque = cache.get(loginName);if (deque == null){// 初始化隊列deque = new ArrayDeque<Serializable>();}// 如果隊列里沒有此sessionId,且用戶沒有被踢出;放入隊列if (!deque.contains(sessionId) && session.getAttribute("kickout") == null){// 將sessionId存入隊列deque.push(sessionId);// 將用戶的sessionId隊列緩存cache.put(loginName, deque);}// 如果隊列里的sessionId數超出最大會話數,開始踢人while (deque.size() > maxSession){// 是否踢出后來登錄的,默認是false;即后者登錄的用戶踢出前者登錄的用戶;Serializable kickoutSessionId = kickoutAfter ? deque.removeFirst() : deque.removeLast();// 踢出后再更新下緩存隊列cache.put(loginName, deque);try{// 獲取被踢出的sessionId的session對象Session kickoutSession = sessionManager.getSession(new DefaultSessionKey(kickoutSessionId));if (null != kickoutSession){// 設置會話的kickout屬性表示踢出了kickoutSession.setAttribute("kickout", true);}}catch (Exception e){// 面對異常,我們選擇忽略}}// 如果被踢出了,(前者或后者)直接退出,重定向到踢出后的地址if (session.getAttribute("kickout") != null && (Boolean) session.getAttribute("kickout") == true){// 退出登錄subject.logout();saveRequest(request);return isAjaxResponse(request, response);}return true;}catch (Exception e){return isAjaxResponse(request, response);}}private boolean isAjaxResponse(ServletRequest request, ServletResponse response) throws IOException{HttpServletRequest req = (HttpServletRequest) request;HttpServletResponse res = (HttpServletResponse) response;if (ServletUtils.isAjaxRequest(req)){AjaxResult ajaxResult = AjaxResult.error("您已在別處登錄,請您修改密碼或重新登錄");ServletUtils.renderString(res, objectMapper.writeValueAsString(ajaxResult));}else{WebUtils.issueRedirect(request, response, kickoutUrl);}return false;}public void setMaxSession(int maxSession){this.maxSession = maxSession;}public void setKickoutAfter(boolean kickoutAfter){this.kickoutAfter = kickoutAfter;}public void setKickoutUrl(String kickoutUrl){this.kickoutUrl = kickoutUrl;}public void setSessionManager(SessionManager sessionManager){this.sessionManager = sessionManager;}// 設置Cache的key的前綴public void setCacheManager(CacheManager cacheManager){// 必須和ehcache緩存配置中的緩存name一致this.cache = cacheManager.getCache(ShiroConstants.SYS_USERCACHE);}

自定義訪問控制過濾器

public class OnlineSessionFilter extends AccessControlFilter {/*** 強制退出后重定向的地址*/@Value("${shiro.user.loginUrl}")private String loginUrl;private OnlineSessionDAO onlineSessionDAO;/*** 表示是否允許訪問;mappedValue就是[urls]配置中攔截器參數部分,如果允許訪問返回true,否則false;*/@Overrideprotected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue)throws Exception{Subject subject = getSubject(request, response);if (subject == null || subject.getSession() == null){return true;}Session session = onlineSessionDAO.readSession(subject.getSession().getId());if (session != null && session instanceof OnlineSession){OnlineSession onlineSession = (OnlineSession) session;request.setAttribute(ShiroConstants.ONLINE_SESSION, onlineSession);// 把user對象設置進去boolean isGuest = onlineSession.getUserId() == null || onlineSession.getUserId() == 0L;if (isGuest == true){SysUser user = ShiroUtils.getSysUser();if (user != null){onlineSession.setUserId(user.getUserId());onlineSession.setLoginName(user.getLoginName());onlineSession.setAvatar(user.getAvatar());onlineSession.setDeptName(user.getDept().getDeptName());onlineSession.markAttributeChanged();}}if (onlineSession.getStatus() == OnlineStatus.off_line){return false;}}return true;}/*** 表示當訪問拒絕時是否已經處理了;如果返回true表示需要繼續處理;如果返回false表示該攔截器實例已經處理了,將直接返回即可。*/@Overrideprotected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception{Subject subject = getSubject(request, response);if (subject != null){subject.logout();}saveRequestAndRedirectToLogin(request, response);return false;}// 跳轉到登錄頁@Overrideprotected void redirectToLogin(ServletRequest request, ServletResponse response) throws IOException{WebUtils.issueRedirect(request, response, loginUrl);}public void setOnlineSessionDAO(OnlineSessionDAO onlineSessionDAO){this.onlineSessionDAO = onlineSessionDAO;} }

同步Sesion到數據庫

public class SyncOnlineSessionFilter extends PathMatchingFilter {//PathMatchingFilter提供了基于Ant風格的請求路徑匹配功能及攔截器參數解析的功能,// 如“roles[admin,user]”自動根據“,”分割解析到一個路徑參數配置并綁定到相應的路徑:private OnlineSessionDAO onlineSessionDAO;/*** 同步會話數據到DB 一次請求最多同步一次 防止過多處理 需要放到Shiro過濾器之前*///onPreHandle:在preHandle中,當pathsMatch匹配一個路徑后,// 會調用opPreHandler方法并將路徑綁定參數配置傳給mappedValue;// 然后可以在這個方法中進行一些驗證(如角色授權),如果驗證失敗可以返回false中斷流程;默認返回true;// 也就是說子類可以只實現onPreHandle即可,無須實現preHandle。如果沒有path與請求路徑匹配,默認是通過的(即preHandle返回true)。//@Overrideprotected boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception{OnlineSession session = (OnlineSession) request.getAttribute(ShiroConstants.ONLINE_SESSION);// 如果session stop了 也不同步// session停止時間,如果stopTimestamp不為null,則代表已停止if (session != null && session.getUserId() != null && session.getStopTimestamp() == null){onlineSessionDAO.syncToDb(session);}return true;}public void setOnlineSessionDAO(OnlineSessionDAO onlineSessionDAO){this.onlineSessionDAO = onlineSessionDAO;} }

退出過濾器

public class LogoutFilter extends org.apache.shiro.web.filter.authc.LogoutFilter {private static final Logger log = LoggerFactory.getLogger(LogoutFilter.class);/*** 退出后重定向的地址*/private String loginUrl;public String getLoginUrl(){return loginUrl;}public void setLoginUrl(String loginUrl){this.loginUrl = loginUrl;}@Overrideprotected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception{try{Subject subject = getSubject(request, response);String redirectUrl = getRedirectUrl(request, response, subject);try{SysUser user = ShiroUtils.getSysUser();if (StringUtils.isNotNull(user)){String loginName = user.getLoginName();// 記錄用戶退出日志AsyncManager.me().execute(AsyncFactory.recordLogininfor(loginName, Constants.LOGOUT, MessageUtils.message("user.logout.success")));// 清理緩存SpringUtils.getBean(ISysUserOnlineService.class).removeUserCache(loginName, ShiroUtils.getSessionId());}// 退出登錄subject.logout();}catch (SessionException ise){log.error("logout fail.", ise);}issueRedirect(request, response, redirectUrl);}catch (Exception e){log.error("Encountered session exception during logout. This can generally safely be ignored.", e);}return false;}/*** 退出跳轉URL*/@Overrideprotected String getRedirectUrl(ServletRequest request, ServletResponse response, Subject subject){String url = getLoginUrl();if (StringUtils.isNotEmpty(url)){return url;}return super.getRedirectUrl(request, response, subject);} }

定期session驗證任務調度器

@Component public class SpringSessionValidationScheduler implements SessionValidationScheduler {private static final Logger log = LoggerFactory.getLogger(SpringSessionValidationScheduler.class);public static final long DEFAULT_SESSION_VALIDATION_INTERVAL = DefaultSessionManager.DEFAULT_SESSION_VALIDATION_INTERVAL;/*** 定時器,用于處理超時的掛起請求,也用于連接斷開時的重連。*/@Autowired@Qualifier("scheduledExecutorService")private ScheduledExecutorService executorService;private volatile boolean enabled = false;/*** 會話驗證管理器*/@Autowired@Qualifier("sessionManager")@Lazyprivate ValidatingSessionManager sessionManager;// 相隔多久檢查一次session的有效性,單位毫秒,默認就是10分鐘@Value("${shiro.session.validationInterval}")private long sessionValidationInterval;@Overridepublic boolean isEnabled(){return this.enabled;}//設置定期驗證session是否過期的時間間隔public void setSessionValidationInterval(long sessionValidationInterval){this.sessionValidationInterval = sessionValidationInterval;}/*** Starts session validation by creating a spring PeriodicTrigger.*/@Overridepublic void enableSessionValidation(){enabled = true;if (log.isDebugEnabled()){log.debug("Scheduling session validation job using Spring Scheduler with "+ "session validation interval of [" + sessionValidationInterval + "]ms...");}try{executorService.scheduleAtFixedRate(new Runnable(){@Overridepublic void run(){if (enabled){sessionManager.validateSessions();//org.apache.shiro.session.mgt包下的方法validateSessions();//對系統中所有打開/活動會話(那些尚未停止或過期的會話)進行會話驗證,并驗證每個會話。// 如果發現一個會話無效(例如它已經過期),它會被更新并保存到 EIS。}}}, 1000, sessionValidationInterval * 60 * 1000, TimeUnit.MILLISECONDS);this.enabled = true;if (log.isDebugEnabled()){log.debug("Session validation job successfully scheduled with Spring Scheduler.");}}catch (Exception e){if (log.isErrorEnabled()){log.error("Error starting the Spring Scheduler session validation job. Session validation may not occur.", e);}}}@Overridepublic void disableSessionValidation(){if (log.isDebugEnabled()){log.debug("Stopping Spring Scheduler session validation job...");}if (this.enabled){Threads.shutdownAndAwaitTermination(executorService);}this.enabled = false;} }

shiro配置類

創建一個ShiroConfig,然后創建一個shiroFilter方法。在Shiro使用認證和授權時,其實都是通過ShiroFilterFactoryBean設置一些Shiro的攔截器進行的,攔截器會以LinkedHashMap的形式存儲需要攔截的資源及鏈接,并且會按照順序執行,其中鍵為攔截的資源或鏈接,值為攔截的形式(比如authc:所有URL都必須認證通過才可以訪問,anon:所有URL都可以匿名訪問),在攔截的過程中可以使用通配符,比如/**為攔截所有,所以一般/**放在最下面。同時,可以通過ShiroFilterFactoryBean設置登錄鏈接、未授權鏈接、登錄成功跳轉頁等,這里設置的shiroFilter方法內容如代碼清單7-7所示。

@Configuration public class ShiroConfig {/*** Session超時時間,單位為毫秒(默認30分鐘)*/@Value("${shiro.session.expireTime}")private int expireTime;/*** 相隔多久檢查一次session的有效性,單位毫秒,默認就是10分鐘*/@Value("${shiro.session.validationInterval}")private int validationInterval;/*** 同一個用戶最大會話數*/@Value("${shiro.session.maxSession}")private int maxSession;/*** 踢出之前登錄的/之后登錄的用戶,默認踢出之前登錄的用戶*/@Value("${shiro.session.kickoutAfter}")private boolean kickoutAfter;/*** 驗證碼開關*/@Value("${shiro.user.captchaEnabled}")private boolean captchaEnabled;/*** 驗證碼類型*/@Value("${shiro.user.captchaType}")private String captchaType;/*** 設置Cookie的域名*/@Value("${shiro.cookie.domain}")private String domain;/*** 設置cookie的有效訪問路徑*/@Value("${shiro.cookie.path}")private String path;/*** 設置HttpOnly屬性*/@Value("${shiro.cookie.httpOnly}")private boolean httpOnly;/*** 設置Cookie的過期時間,秒為單位*/@Value("${shiro.cookie.maxAge}")private int maxAge;/*** 設置cipherKey密鑰*/@Value("${shiro.cookie.cipherKey}")private String cipherKey;/*** 登錄地址*/@Value("${shiro.user.loginUrl}")private String loginUrl;/*** 權限認證失敗地址*/@Value("${shiro.user.unauthorizedUrl}")private String unauthorizedUrl;/*** 是否開啟記住我功能*/@Value("${shiro.rememberMe.enabled: false}")private boolean rememberMe;/*** 緩存管理器 使用Ehcache實現*/@Beanpublic EhCacheManager getEhCacheManager(){net.sf.ehcache.CacheManager cacheManager = net.sf.ehcache.CacheManager.getCacheManager("ruoyi");EhCacheManager em = new EhCacheManager();if (StringUtils.isNull(cacheManager)){em.setCacheManager(new net.sf.ehcache.CacheManager(getCacheManagerConfigFileInputStream()));return em;}else{em.setCacheManager(cacheManager);return em;}}/*** 返回配置文件流 避免ehcache配置文件一直被占用,無法完全銷毀項目重新部署*/protected InputStream getCacheManagerConfigFileInputStream(){String configFile = "classpath:ehcache/ehcache-shiro.xml";InputStream inputStream = null;try{inputStream = ResourceUtils.getInputStreamForPath(configFile);byte[] b = IOUtils.toByteArray(inputStream);InputStream in = new ByteArrayInputStream(b);return in;}catch (IOException e){throw new ConfigurationException("Unable to obtain input stream for cacheManagerConfigFile [" + configFile + "]", e);}finally{IOUtils.closeQuietly(inputStream);}}/*** 自定義Realm*/@Beanpublic UserRealm userRealm(EhCacheManager cacheManager){UserRealm userRealm = new UserRealm();userRealm.setAuthorizationCacheName(Constants.SYS_AUTH_CACHE);userRealm.setCacheManager(cacheManager);return userRealm;}/*** 自定義sessionDAO會話*/@Beanpublic OnlineSessionDAO sessionDAO(){OnlineSessionDAO sessionDAO = new OnlineSessionDAO();return sessionDAO;}/*** 自定義sessionFactory會話*/@Beanpublic OnlineSessionFactory sessionFactory(){OnlineSessionFactory sessionFactory = new OnlineSessionFactory();return sessionFactory;}/*** 會話管理器*/@Beanpublic OnlineWebSessionManager sessionManager(){OnlineWebSessionManager manager = new OnlineWebSessionManager();// 加入緩存管理器manager.setCacheManager(getEhCacheManager());// 刪除過期的sessionmanager.setDeleteInvalidSessions(true);// 設置全局session超時時間manager.setGlobalSessionTimeout(expireTime * 60 * 1000);// 去掉 JSESSIONIDmanager.setSessionIdUrlRewritingEnabled(false);// 定義要使用的無效的Session定時調度器manager.setSessionValidationScheduler(SpringUtils.getBean(SpringSessionValidationScheduler.class));// 是否定時檢查sessionmanager.setSessionValidationSchedulerEnabled(true);// 自定義SessionDaomanager.setSessionDAO(sessionDAO());// 自定義sessionFactorymanager.setSessionFactory(sessionFactory());return manager;}/*** 安全管理器*/@Beanpublic SecurityManager securityManager(UserRealm userRealm){DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();// 設置realm.securityManager.setRealm(userRealm);// 記住我securityManager.setRememberMeManager(rememberMe ? rememberMeManager() : null);// 注入緩存管理器;securityManager.setCacheManager(getEhCacheManager());// session管理器securityManager.setSessionManager(sessionManager());return securityManager;}/*** 退出過濾器*/public LogoutFilter logoutFilter(){LogoutFilter logoutFilter = new LogoutFilter();logoutFilter.setLoginUrl(loginUrl);return logoutFilter;}/*** Shiro過濾器配置*/@Beanpublic ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager){ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();// Shiro的核心安全接口,這個屬性是必須的shiroFilterFactoryBean.setSecurityManager(securityManager);// 身份認證失敗,則跳轉到登錄頁面的配置shiroFilterFactoryBean.setLoginUrl(loginUrl);// 權限認證失敗,則跳轉到指定頁面shiroFilterFactoryBean.setUnauthorizedUrl(unauthorizedUrl);// Shiro連接約束配置,即過濾鏈的定義LinkedHashMap<String, String> filterChainDefinitionMap = new LinkedHashMap<>();// 對靜態資源設置匿名訪問filterChainDefinitionMap.put("/favicon.ico**", "anon");filterChainDefinitionMap.put("/ruoyi.png**", "anon");filterChainDefinitionMap.put("/html/**", "anon");filterChainDefinitionMap.put("/css/**", "anon");filterChainDefinitionMap.put("/docs/**", "anon");filterChainDefinitionMap.put("/fonts/**", "anon");filterChainDefinitionMap.put("/img/**", "anon");filterChainDefinitionMap.put("/ajax/**", "anon");filterChainDefinitionMap.put("/js/**", "anon");filterChainDefinitionMap.put("/ruoyi/**", "anon");filterChainDefinitionMap.put("/captcha/captchaImage**", "anon");// 退出 logout地址,shiro去清除sessionfilterChainDefinitionMap.put("/logout", "logout");// 不需要攔截的訪問filterChainDefinitionMap.put("/login", "anon,captchaValidate");// 注冊相關filterChainDefinitionMap.put("/register", "anon,captchaValidate");// 系統權限列表// filterChainDefinitionMap.putAll(SpringUtils.getBean(IMenuService.class).selectPermsAll());Map<String, Filter> filters = new LinkedHashMap<String, Filter>();filters.put("onlineSession", onlineSessionFilter());filters.put("syncOnlineSession", syncOnlineSessionFilter());filters.put("captchaValidate", captchaValidateFilter());filters.put("kickout", kickoutSessionFilter());// 注銷成功,則跳轉到指定頁面filters.put("logout", logoutFilter());shiroFilterFactoryBean.setFilters(filters);// 所有請求需要認證filterChainDefinitionMap.put("/**", "user,kickout,onlineSession,syncOnlineSession");shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);return shiroFilterFactoryBean;}/*** 自定義在線用戶處理過濾器*/public OnlineSessionFilter onlineSessionFilter(){OnlineSessionFilter onlineSessionFilter = new OnlineSessionFilter();onlineSessionFilter.setLoginUrl(loginUrl);onlineSessionFilter.setOnlineSessionDAO(sessionDAO());return onlineSessionFilter;}/*** 自定義在線用戶同步過濾器*/public SyncOnlineSessionFilter syncOnlineSessionFilter(){SyncOnlineSessionFilter syncOnlineSessionFilter = new SyncOnlineSessionFilter();syncOnlineSessionFilter.setOnlineSessionDAO(sessionDAO());return syncOnlineSessionFilter;}/*** 自定義驗證碼過濾器*/public CaptchaValidateFilter captchaValidateFilter(){CaptchaValidateFilter captchaValidateFilter = new CaptchaValidateFilter();captchaValidateFilter.setCaptchaEnabled(captchaEnabled);captchaValidateFilter.setCaptchaType(captchaType);return captchaValidateFilter;}/*** cookie 屬性設置*/public SimpleCookie rememberMeCookie(){SimpleCookie cookie = new SimpleCookie("rememberMe");cookie.setDomain(domain);cookie.setPath(path);cookie.setHttpOnly(httpOnly);cookie.setMaxAge(maxAge * 24 * 60 * 60);return cookie;}/*** 記住我*/public CookieRememberMeManager rememberMeManager(){CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();cookieRememberMeManager.setCookie(rememberMeCookie());if (StringUtils.isNotEmpty(cipherKey)){cookieRememberMeManager.setCipherKey(Base64.decode(cipherKey));}else{cookieRememberMeManager.setCipherKey(CipherUtils.generateNewKey(128, "AES").getEncoded());}return cookieRememberMeManager;}/*** 同一個用戶多設備登錄限制*/public KickoutSessionFilter kickoutSessionFilter(){KickoutSessionFilter kickoutSessionFilter = new KickoutSessionFilter();kickoutSessionFilter.setCacheManager(getEhCacheManager());kickoutSessionFilter.setSessionManager(sessionManager());// 同一個用戶最大的會話數,默認-1無限制;比如2的意思是同一個用戶允許最多同時兩個人登錄kickoutSessionFilter.setMaxSession(maxSession);// 是否踢出后來登錄的,默認是false;即后者登錄的用戶踢出前者登錄的用戶;踢出順序kickoutSessionFilter.setKickoutAfter(kickoutAfter);// 被踢出后重定向到的地址;kickoutSessionFilter.setKickoutUrl("/login?kickout=1");return kickoutSessionFilter;}/*** thymeleaf模板引擎和shiro框架的整合*/@Beanpublic ShiroDialect shiroDialect(){return new ShiroDialect();}/*** 開啟Shiro注解通知器*/@Beanpublic AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(@Qualifier("securityManager") SecurityManager securityManager){AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);return authorizationAttributeSourceAdvisor;} }

自定義Session類(繼承 SimpleSession)

public class OnlineSession extends SimpleSession {private static final long serialVersionUID = 1L;/** 用戶ID */private Long userId;/** 用戶名稱 */private String loginName;/** 部門名稱 */private String deptName;/** 用戶頭像 */private String avatar;/** 登錄IP地址 */private String host;/** 瀏覽器類型 */private String browser;/** 操作系統 */private String os;/** 在線狀態 */private OnlineStatus status = OnlineStatus.on_line;/** 屬性是否改變 優化session數據同步 */private transient boolean attributeChanged = false;@Overridepublic String getHost(){return host;}@Overridepublic void setHost(String host){this.host = host;}

自定義SessionFactory會話(繼承SessionFactory)

@Data @Component public class OnlineSessionFactory implements SessionFactory {@Overridepublic Session createSession(SessionContext initData){OnlineSession session = new OnlineSession();if (initData != null && initData instanceof WebSessionContext){WebSessionContext sessionContext = (WebSessionContext) initData;HttpServletRequest request = (HttpServletRequest) sessionContext.getServletRequest();if (request != null){UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent"));// 獲取客戶端操作系統String os = userAgent.getOperatingSystem().getName();// 獲取客戶端瀏覽器String browser = userAgent.getBrowser().getName();session.setHost(IpUtils.getIpAddr(request));session.setBrowser(browser);session.setOs(os);}}return session;} }

自定義的ShiroSessionDao(繼承EnterpriseCacheSessionDAO)

public class OnlineSessionDAO extends EnterpriseCacheSessionDAO {//extends AbstractSessionDAO/*** 同步session到數據庫的周期 單位為毫秒(默認1分鐘)*/@Value("${shiro.session.dbSyncPeriod}")private int dbSyncPeriod;/*** 上次同步數據庫的時間戳*/private static final String LAST_SYNC_DB_TIMESTAMP = OnlineSessionDAO.class.getName() + "LAST_SYNC_DB_TIMESTAMP";@Autowiredprivate SysShiroService sysShiroService;public OnlineSessionDAO(){super();}public OnlineSessionDAO(long expireTime){super();}/*** 根據會話ID獲取會話** @param sessionId 會話ID* @return ShiroSession*/@Overrideprotected Session doReadSession(Serializable sessionId){return sysShiroService.getSession(sessionId);}@Overridepublic void update(Session session) throws UnknownSessionException{super.update(session);} // EnterpriseCacheSessionDAO有一個方法: // protected Serializable doCreate(Session session) { // /*通過sessionId保存對應的session*/ // Serializable sessionId = this.generateSessionId(session); // /*將sessionId和session捆綁*/ // this.assignSessionId(session, sessionId); // return sessionId; // }/*** 更新會話;如更新會話最后訪問時間/停止會話/設置超時時間/設置移除屬性等會調用*/public void syncToDb(OnlineSession onlineSession){Date lastSyncTimestamp = (Date) onlineSession.getAttribute(LAST_SYNC_DB_TIMESTAMP);if (lastSyncTimestamp != null){boolean needSync = true;long deltaTime = onlineSession.getLastAccessTime().getTime() - lastSyncTimestamp.getTime();if (deltaTime < dbSyncPeriod * 60 * 1000){// 時間差不足 無需同步needSync = false;}// isGuest = true 訪客boolean isGuest = onlineSession.getUserId() == null || onlineSession.getUserId() == 0L;// session 數據變更了 同步if (!isGuest && onlineSession.isAttributeChanged()){needSync = true;}if (!needSync){return;}}// 更新上次同步數據庫時間onlineSession.setAttribute(LAST_SYNC_DB_TIMESTAMP, onlineSession.getLastAccessTime());// 更新完后 重置標識if (onlineSession.isAttributeChanged()){onlineSession.resetAttributeChanged();}AsyncManager.me().execute(AsyncFactory.syncSessionToDb(onlineSession));}/*** 當會話過期/停止(如用戶退出時)屬性等會調用*/@Overrideprotected void doDelete(Session session){OnlineSession onlineSession = (OnlineSession) session;if (null == onlineSession){return;}onlineSession.setStatus(OnlineStatus.off_line);sysShiroService.deleteSession(onlineSession);} }

總結

以上是生活随笔為你收集整理的springboot使用shiro配置多个过滤器和session同步案例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

国产91亚洲精品 | 在线欧美日韩 | 久久久久五月天 | 天天爽夜夜爽人人爽一区二区 | 久久免费视频7 | 欧美精品在线观看 | 伊人天天 | 国产一区二区影院 | 日本公妇在线观看 | 免费视频18 | 亚洲一区网| 少妇搡bbbb搡bbb搡忠贞 | 波多野结衣一区 | 国产精品嫩草影视久久久 | 色视频在线 | 日韩精品久久久久久 | 亚洲无人区小视频 | 香蕉一区| 成人久久久精品国产乱码一区二区 | 久久精品久久精品久久精品 | 日韩欧美高清不卡 | 91人人视频在线观看 | 成人va在线观看 | 97人人添人澡人人爽超碰动图 | 国产小视频在线 | 999成人国产 | 久99久在线 | 91欧美精品| 九九激情视频 | 日产中文字幕 | 五月婷久| 中文字幕一区二区三 | av三级在线免费观看 | 亚洲精品国产精品国产 | 欧美日韩国产精品一区 | 亚洲国产av精品毛片鲁大师 | 一本色道久久综合亚洲二区三区 | 亚洲国产69 | 久久人人97超碰精品888 | 蜜臀av免费一区二区三区 | 黄色av在 | 男女激情网址 | 欧美日韩免费在线视频 | 热99在线视频 | .国产精品成人自产拍在线观看6 | 三级黄色理论片 | 亚洲理论片在线观看 | 久久激情视频免费观看 | 国产免费一区二区三区最新 | 97福利在线 | 久久久黄视频 | 又黄又爽又无遮挡的视频 | 欧美一级黄色视屏 | av一区二区三区在线 | 精品无人国产偷自产在线 | 麻豆国产精品视频 | 日韩精品91偷拍在线观看 | 狠狠色噜噜狠狠狠合久 | 亚洲小视频在线 | 午夜精品视频免费在线观看 | 久久国产精品色婷婷 | 国产成人久久av | 久久丁香| 99久久婷婷国产 | 国产成人免费观看 | 免费 在线 中文 日本 | 黄色一级大片在线免费看产 | 亚洲一二三在线 | 色综合久久综合中文综合网 | 久久av高清| 天天色天天 | 婷婷av网 | 综合网天天射 | 日韩在线首页 | 欧美性春潮| 福利区在线观看 | 深夜男人影院 | 国产不卡av在线播放 | 精品久久久久久电影 | 18做爰免费视频网站 | 最近中文字幕国语免费av | 久久艹在线观看 | 久久国产精品久久w女人spa | 日韩综合色 | 精品免费一区二区三区 | 美女黄视频免费看 | av丁香花 | 中文字幕日韩一区二区三区不卡 | 成人免费观看视频网站 | 999国内精品永久免费视频 | 国产黄色免费 | 色综合天天色综合 | 成人黄色中文字幕 | 免费黄色av片 | 在线综合 亚洲 欧美在线视频 | 欧美日韩二区三区 | 久久亚洲视频 | 97视频在线观看网址 | 久久久久久久久久免费视频 | 日韩激情视频 | 亚洲一区久久久 | 91免费观看网站 | 国产色视频123区 | 亚洲五月综合 | 国产乱对白刺激视频不卡 | 99产精品成人啪免费网站 | 天堂网av在线 | 国产大尺度视频 | 亚洲精品乱码久久久久久9色 | 香蕉影视app | 久久人人做 | 久久草草热国产精品直播 | 精品国产精品国产偷麻豆 | 成人av亚洲 | 九七视频在线观看 | 91传媒免费在线观看 | 欧美最猛性xxxxx免费 | 日批视频在线观看免费 | av丝袜制服 | 国产精品专区在线 | 亚洲一区久久久 | 天天亚洲综合 | 国产护士hd高朝护士1 | 久久精品一区 | 91麻豆精品国产91久久久无限制版 | 在线精品视频免费播放 | 久久公开视频 | 免费69视频| 狠狠色狠狠色综合日日小说 | 四虎成人精品在永久免费 | 欧美高清成人 | 日韩av中文字幕在线免费观看 | 国产精品av一区二区 | 日韩高清一 | 免费观看91 | 欧美日韩在线观看一区 | 婷婷成人在线 | 91桃色视频| 国际精品久久久 | 免费观看91视频 | 中文字幕国产精品 | 中文字幕资源在线观看 | 欧美污污网站 | 亚洲精品乱码久久久久久蜜桃动漫 | 国产午夜免费视频 | 日韩久久精品一区 | 精品毛片一区二区免费看 | av福利在线免费观看 | 日韩在线观看第一页 | 日韩三级在线 | 一区二区三区四区免费视频 | 天天艹天天 | 欧美精品xxx| 国产91免费在线 | 精品国产一区二区三区四区在线观看 | 久久精品视频18 | 免费看三片| 麻豆国产网站入口 | 91手机视频 | 在线观看视频黄色 | 欧美精品久久久 | 中文字幕中文字幕中文字幕 | 亚洲一区二区三区四区在线视频 | 九九热国产 | 99精品国自产在线 | 97成人精品 | 亚洲区视频在线 | 97超碰人人模人人人爽人人爱 | 国产视频1 | 成人av午夜 | 黄色日本免费 | 色偷偷中文字幕 | 天天色天天操综合网 | 一区二区精品在线 | 婷婷视频 | 国产精品丝袜在线 | 在线亚洲精品 | 婷婷色伊人 | 日韩av综合网站 | 久黄色 | 国产999视频 | 在线观看中文字幕亚洲 | 国产va饥渴难耐女保洁员在线观看 | 新av在线 | 免费网站观看www在线观看 | 四虎5151久久欧美毛片 | 一区二区三区在线影院 | 国产在线a不卡 | 精品国产91亚洲一区二区三区www | 国产a精品| av黄色一级片 | 激情欧美一区二区三区 | 91九色在线视频 | 日韩视频a | 国产精品免费成人 | 久久综合精品国产一区二区三区 | 天天射天天舔天天干 | 99国产精品视频免费观看一公开 | 色噜噜日韩精品一区二区三区视频 | 在线播放 日韩专区 | 91精品国产91久久久久久三级 | 久久96国产精品久久99软件 | 人人插人人澡 | 天天干天天搞天天射 | av综合av| 天天干天天综合 | 亚洲免费av网站 | 91传媒免费在线观看 | 久久99在线观看 | 国产伦精品一区二区三区照片91 | 一区二区在线电影 | 久久国产系列 | 91完整版在线观看 | 亚洲成aⅴ人片久久青草影院 | 狠狠狠狠狠狠 | 免费在线观看一区 | 亚洲精品玖玖玖av在线看 | 色中色综合 | 午夜在线观看一区 | 日韩精品在线观看av | 国产探花在线看 | 91久久精品一区二区三区 | 久九视频 | 天天干天天干天天操 | 中文字幕在线视频国产 | 美女视频黄是免费的 | 超碰大片 | 久久成年人视频 | 亚洲精品国久久99热 | 欧美 高跟鞋交 xxxxhd | 久久香蕉影视 | 亚洲一区尤物 | 精品999在线| 91精品国产一区 | av成人资源| www.日日日.com| 日韩色综合 | 国产高清在线永久 | 日本性久久 | 国产精品久久久免费看 | 亚洲欧美日韩不卡 | 在线精品国产 | 国产精品一区一区三区 | 六月激情丁香 | 欧美性色综合网 | 久久精品国产99国产 | 亚洲精品午夜国产va久久成人 | 国产高清免费在线播放 | 久久国语露脸国产精品电影 | 九九色网 | 免费网站污 | 国产黄色片在线 | 国产91精品看黄网站在线观看动漫 | 成人app在线播放 | 欧洲亚洲国产视频 | 国产中文字幕视频 | 国产99久久久国产精品成人免费 | 欧美久久久久久久久 | 精品视频一区在线 | 国产美女免费观看 | av视屏在线播放 | 天堂网中文在线 | 久久精品美女视频 | 国产精品专区h在线观看 | 国产亚洲久一区二区 | 久久免费激情视频 | 午夜精品久久久久久久久久久久 | 亚洲毛片在线观看. | 日韩精品一区二区三区中文字幕 | 国产精品毛片一区视频播 | 欧洲精品视频一区 | 成人a在线| 激情五月开心 | 亚洲精品久 | 久久综合色8888 | 91精品视频免费看 | 国产原创av在线 | 超碰在线cao| 天天色天天骑天天射 | 九九热视频在线 | 最新av在线网站 | 97热久久免费频精品99 | 精品国产诱惑 | 亚洲乱码国产乱码精品天美传媒 | 丁香婷婷色综合亚洲电影 | 操处女逼 | 97精品国产97久久久久久粉红 | 成片免费观看视频 | 久久人人爽人人片 | 色综合久久久网 | 亚洲国产成人av网 | 精品一区在线看 | 日本电影黄色 | 中文字幕一区二区三区精华液 | 中文在线最新版天堂 | 国产最顶级的黄色片在线免费观看 | 中文字幕在线看视频 | 精品99免费 | 国产中文字幕视频 | 五月婷久| 国产一二三四在线观看视频 | 91视频麻豆视频 | 国产视频九色蝌蚪 | 久久久久久久久电影 | 99精品国产一区二区三区不卡 | 久久久一本精品99久久精品66 | 亚洲成人网av | 日韩一区二区三区高清在线观看 | 国产欧美日韩视频 | 国产高清成人 | 国产一区二区在线视频观看 | 国产福利一区在线观看 | www色网站| 国产伦理一区二区三区 | 色a4yy| 91香蕉国产在线观看软件 | 又黄又爽又湿又无遮挡的在线视频 | 97国产电影 | 亚洲高清视频在线观看免费 | 免费黄色在线网站 | 亚洲 综合 专区 | 夜夜骑首页 | 欧美日韩高清一区二区三区 | 91桃色国产在线播放 | 日韩视频在线不卡 | 午夜精品久久久久久99热明星 | 久久深夜福利免费观看 | 五月婷婷久草 | 特黄免费av| 欧美日韩在线免费观看视频 | 91成人精品一区在线播放69 | 天天射天天干天天插 | 99成人精品 | 黄色一级在线观看 | 69国产成人综合久久精品欧美 | 中文字幕观看视频 | 日韩高清免费在线观看 | 久久夜色精品国产欧美乱 | 日韩成人中文字幕 | 99久久成人 | 亚洲国产视频a | 国产在线精品一区二区不卡了 | 黄色不卡av | 天堂网中文在线 | 亚洲国产手机在线 | 美女黄久久 | 日韩精品中文字幕一区二区 | 二区三区毛片 | 久久激情视频 久久 | 伊人狠狠操 | 视频99爱 | 国产在线永久 | 欧美 日韩 成人 | 草久在线| 超碰人人在 | 久久综合影院 | 精品嫩模福利一区二区蜜臀 | 精品 一区 在线 | www久久九| 在线观看亚洲精品 | 最近免费观看的电影完整版 | 国产美女精品人人做人人爽 | 99视频在线观看视频 | 久久视频精品 | 免费高清影视 | av在线之家电影网站 | 久久香蕉国产精品麻豆粉嫩av | 天天做日日做天天爽视频免费 | 国产精品美乳一区二区免费 | 久久免费视频3 | 爱爱av网站 | 欧美在线一级片 | 在线观看 国产 | 在线观看中文字幕2021 | 色在线亚洲| 久久国产免费看 | 免费看麻豆| 午夜视频色| 久久69av | 国产精品久久久久国产精品日日 | 国产第一福利网 | 很黄很黄的网站免费的 | 国产亚洲免费观看 | 亚洲情影院 | 久久成人高清视频 | 日韩大片在线看 | 亚洲91网站 | 精品欧美一区二区精品久久 | 成av在线| 99在线视频观看 | 色综合天天狠天天透天天伊人 | 亚洲成人资源在线观看 | 久久天天躁狠狠躁亚洲综合公司 | 综合天天久久 | 久久99精品久久久久婷婷 | 久久丁香网| av电影不卡在线 | 日韩有码中文字幕在线 | 综合黄色网 | 午夜婷婷综合 | 911国产 | 亚洲三级影院 | 欧美一级片免费在线观看 | 国产精品欧美在线 | 探花视频在线观看 | av中文字幕av| 国产高清99 | 黄色三级在线观看 | 夜夜夜夜猛噜噜噜噜噜初音未来 | av网站有哪些 | 黄色片免费在线 | 精品国产亚洲在线 | 成年人在线免费看 | 精品乱码一区二区三四区 | 日韩欧美一区二区三区免费观看 | 日韩在线不卡视频 | 日韩视频免费观看高清完整版在线 | 天天干,天天操 | 一区二区三区免费在线观看视频 | 欧美a级在线免费观看 | 欧美日韩裸体免费视频 | 日韩精品视频免费 | 天天曰天天干 | 九九电影在线 | 三级视频片 | 在线观看av的网站 | 欧美日韩aaaa| 日韩av免费网站 | 亚洲精品午夜久久久 | 青青草在久久免费久久免费 | 91视频大全| 色综合久久久网 | 日韩精品视频免费专区在线播放 | 久草在线在线视频 | 国产一级淫片在线观看 | 蜜桃视频成人在线观看 | 最新动作电影 | 在线视频亚洲 | 午夜国产一区 | 国产精品一区一区三区 | 国产成人中文字幕 | 美女免费视频一区 | 国产免费久久精品 | 999久久国精品免费观看网站 | 狠狠干免费 | 精品国产电影一区二区 | 欧美综合国产 | 国产专区一 | 狠狠干免费 | 色噜噜噜 | 久久视影 | 天天干天天操天天入 | 国产精品久久久久久a | 久久国产精品第一页 | 91视频高清免费 | 精品国产乱码久久久久久1区2匹 | av在线网站大全 | 五月婷婷电影网 | 午夜123 | 免费一级片在线 | 国产精品久久一区二区三区, | 精品伊人久久久 | 天天干.com| 国产精品99蜜臀久久不卡二区 | 国产一区国产二区在线观看 | 狠狠色狠狠色终合网 | 亚洲日本三级 | 国产成人av网站 | 99精品国产福利在线观看免费 | 天天想夜夜操 | 欧美analxxxx| 久草干| 日韩免费电影网站 | 国产第一福利网 | 人人爽人人爽人人片 | 国产成人av电影在线 | 久草精品电影 | 午夜10000| 国产一线二线三线性视频 | 色网址99| 国产精彩视频一区 | 色综合天天射 | 亚洲黄色大片 | 国产高清av| www.久久99| 中文字幕一区二区三区在线播放 | 国产精品96久久久久久吹潮 | 日日爱网站 | 色综合久久88色综合天天免费 | 手机在线中文字幕 | 亚洲精品视频在线观看免费视频 | 欧美日韩在线视频免费 | 九九免费在线观看视频 | 欧美一区视频 | 五月天天色 | 亚洲免费在线播放视频 | 有码中文在线 | 久久精品日产第一区二区三区乱码 | 午夜久草 | 欧美福利网址 | 婷婷干五月| 国产精品成人av久久 | 精品国产精品一区二区夜夜嗨 | 日韩手机视频 | 国产福利a | 国产欧美久久久精品影院 | 九九精品久久久 | 九九九电影免费看 | 国产一区二区三区在线 | 精品专区 | 婷婷精品国产一区二区三区日韩 | 亚洲人成在线电影 | 国产精品九九久久久久久久 | 精品国产电影 | 婷婷综合激情 | 丝袜足交在线 | 亚洲免费色 | 国产精品美女网站 | 国产美女主播精品一区二区三区 | 亚洲国产偷 | 亚洲乱码中文字幕综合 | 国产精品第7页 | 91av色| 在线色亚洲 | 91精品国产福利在线观看 | 少妇bbb搡bbbb搡bbbb′ | 国产91精品高清一区二区三区 | 最新中文在线视频 | 中文字幕丝袜美腿 | 二区视频在线 | 日韩欧美亚州 | 国产精品久久久久久影院 | 97香蕉久久超级碰碰高清版 | 狠狠操.com | 91久久精品一区二区二区 | 2023国产精品自产拍在线观看 | 最近更新的中文字幕 | 日韩高清在线观看 | 久在线观看 | 免费激情在线电影 | 激情伊人五月天 | 久久久免费看片 | 亚洲国产精品99久久久久久久久 | 99在线免费视频 | 亚洲性少妇性猛交wwww乱大交 | 国产成人精品一区一区一区 | 日韩美在线观看 | 少妇高潮流白浆在线观看 | 国产亚洲91 | 国产精品亚州 | 久久精品1区2区 | 国产伦精品一区二区三区四区视频 | 色婷婷狠狠干 | 六月婷婷色 | 亚洲闷骚少妇在线观看网站 | 久久污视频 | 射射射av| 中文字幕av最新 | 人人舔人人爱 | 中文字幕高清在线 | 在线日韩 | 日韩在线资源 | 久久精品视频4 | 国产欧美日韩精品一区二区免费 | 黄色大片av | 色.www| 天堂资源在线观看视频 | 91亚洲在线 | 午夜精品久久久久久久99婷婷 | 色婷婷电影网 | 射久久久 | 天天操夜夜逼 | 亚洲国产999 | 精品欧美乱码久久久久久 | 日精品在线观看 | 欧美视频国产视频 | 中文字幕在 | 成人一级电影在线观看 | 99精品国产一区二区 | 激情九九 | 欧美激情视频一区二区三区免费 | 亚洲一区精品人人爽人人躁 | 国产不卡在线 | 91成人精品在线 | 国产免费一区二区三区最新 | 欧美成人亚洲 | 黄色影院在线观看 | 免费av免费观看 | 久久精品久久久久电影 | 日韩动漫免费观看高清完整版在线观看 | 日韩黄在线观看 | 久久久久久久久毛片 | 亚洲一级国产 | 亚洲欧美经典 | 久久久久久美女 | 国产精品久免费的黄网站 | 96在线 | 日韩av电影国产 | 精品国产一区二区三区av性色 | 亚洲欧美激情精品一区二区 | 精品一区免费 | 国产高清在线a视频大全 | 日韩a在线 | 精品国产aⅴ麻豆 | 欧美日韩在线观看视频 | 国产精品久久久久久欧美 | 亚洲一区免费在线 | 中文字幕一二三区 | 波多野结衣精品视频 | 免费91麻豆精品国产自产在线观看 | 国产精品久久久久久久免费 | 成人羞羞免费 | 亚洲乱码中文字幕综合 | 国产精品女人久久久 | 亚洲视频分类 | 美女视频黄是免费的 | 久久久国际精品 | 亚洲日本色 | 国产精品久久久久久久久岛 | 国产日韩欧美视频 | 国产伦理久久精品久久久久_ | 国产精品久久久免费 | 99 久久久久 | 激情综合啪啪 | 激情综合网五月激情 | 国产福利一区二区在线 | 99热最新在线 | 成人av电影免费观看 | 四虎影视成人 | 特级西西444www高清大视频 | 在线视频你懂得 | 午夜性福利 | 又黄又爽又刺激的视频 | 日韩精品久久久久久中文字幕8 | 美女黄视频免费看 | 久久免费资源 | 国产成人精品亚洲 | 日本精品视频网站 | 美女精品在线 | 免费av视屏 | 欧美在线视频第一页 | 伊人久久五月天 | 亚洲丝袜一区二区 | 97理论电影 | 97超碰国产在线 | 人人草网站 | 国产精品自在线拍国产 | 欧美va在线观看 | 免费观看www7722午夜电影 | www中文在线 | 亚洲成人国产 | 久久97超碰 | 一级成人免费视频 | 免费试看一区 | 国产精品久久久久久久久久久久久 | 免费高清影视 | 一 级 黄 色 片免费看的 | 91精品老司机久久一区啪 | 久久久久国产精品免费免费搜索 | 国产亚洲成人网 | 99热这里只有精品1 av中文字幕日韩 | 日本久久99 | 成人精品视频久久久久 | 日韩欧美在线综合网 | 欧美a性 | 久久久久成人精品亚洲国产 | 亚洲综合视频在线 | 欧美激情精品 | 国产短视频在线播放 | 亚洲 欧美日韩 国产 中文 | 狠狠色综合欧美激情 | 男女全黄一级一级高潮免费看 | 97成人在线免费视频 | 久久精品免费 | 免费观看v片在线观看 | 国产在线理论片 | 久久久久国产精品免费 | 国产亚洲精品久久久久久网站 | 久久国产精品一区二区三区 | 久久99精品久久只有精品 | 久久影视精品 | 91亚洲狠狠婷婷综合久久久 | 青青草久草在线 | 九九热精品视频在线观看 | 国产精品乱码一区二区视频 | 伊人丁香 | 欧美俄罗斯性视频 | 国产精品黄网站在线观看 | 国产免费成人av | 日日日视频| 色噜噜狠狠色综合中国 | 精品国产理论片 | 成人久久国产 | 中文在线a∨在线 | 久久伊人色综合 | 欧美日韩在线电影 | 97超碰资源总站 | 99热这里只有精品1 av中文字幕日韩 | 黄色大片网| 日本精品久久久久 | 久久国产麻豆 | 成人在线观看资源 | 久久久久久久久久久久国产精品 | 激情视频网页 | 久久综合九色综合久99 | 日韩在线网址 | 在线播放av网址 | 天天综合久久综合 | 日韩女同一区二区三区在线观看 | 国产一区黄色 | 欧美日韩国产三级 | 国产黄a三级| 国产精品久久久久久久久久不蜜月 | 婷婷丁香激情 | 麻豆一二三精选视频 | 美女黄视频免费看 | 色av资源网 | 五月婷婷在线视频 | 一区二区精品在线观看 | av在线色| 国产精品综合久久久久 | 久久男人中文字幕资源站 | 亚洲网站在线 | www视频在线播放 | 午夜av电影院 | 黄网站a | 波多野结衣在线中文字幕 | 国产精品视频不卡 | 国产色网站 | 91精品区 | 最近免费中文字幕大全高清10 | 国产色网站 | 精品国产伦一区二区三区观看说明 | 国产亚洲片 | 91亚瑟视频 | 成人午夜久久 | 免费看一级黄色 | av不卡免费看 | 怡红院成人在线 | 日本老少交 | 在线免费视频你懂的 | 五月激情婷婷丁香 | 蜜臀aⅴ国产精品久久久国产 | 91欧美国产 | 国产91全国探花系列在线播放 | 黄污在线观看 | 久久免费视频在线 | www.777奇米 | 婷婷色在线视频 | 91女神的呻吟细腰翘臀美女 | 久久久精品 | 欧美色综合久久 | 狠狠色丁香久久婷婷综合丁香 | 久草在线视频资源 | 国产成人福利在线观看 | 国产亚洲精品久久久久久无几年桃 | 免费人人干 | 超碰在线免费97 | 黄色大片免费网站 | 99国内精品久久久久久久 | 国产精彩视频一区二区 | www.看片网站 | 日韩视频一二三区 | 中文字幕丰满人伦在线 | 激情视频二区 | 日韩色综合网 | 日本99精品 | 九色自拍视频 | 久久久久久国产精品亚洲78 | 亚洲 综合 精品 | 精品国产大片 | 天天综合入口 | 亚洲精品动漫在线 | 成人免费一区二区三区在线观看 | 欧美一区免费观看 | 丁香六月五月婷婷 | 久久视精品 | 黄色免费观看网址 | 国产在线传媒 | 精品国产成人在线影院 | 超碰97av在线 | 色www免费视频 | 波多野结衣久久资源 | 国产一级大片免费看 | 六月丁香久久 | 婷婷色在线播放 | 成人精品在线 | 国产精品一区二区中文字幕 | 久久精品网站视频 | 97超碰在线资源 | 91视频91自拍 | 日本高清中文字幕有码在线 | 九九在线高清精品视频 | 天天亚洲综合 | 国产精品久久久久久久久久妇女 | 月丁香婷婷 | 夜夜操夜夜干 | 久久精品1区 | 国产精品18久久久久久久久久久久 | 中文免费在线观看 | 麻花天美星空视频 | 欧美日韩精品二区第二页 | 久久久久久高潮国产精品视 | 808电影免费观看三年 | 在线国产欧美 | 婷婷丁香色 | 国产精品黑丝在线观看 | 久久久久久免费视频 | 国产精品成人久久久久久久 | 免费激情在线电影 | 国产日产av | 日日夜夜精品视频天天综合网 | 特级西西444www高清大视频 | 日日精品 | 国产精品福利无圣光在线一区 | 欧美一区中文字幕 | 日韩成人黄色av | 亚洲欧美日韩国产精品一区午夜 | 国产在线专区 | 欧美国产日韩激情 | 欧美在线aa | 国产成人三级一区二区在线观看一 | 亚洲精品日韩一区二区电影 | av亚洲产国偷v产偷v自拍小说 | 久久天天操 | 免费观看成年人视频 | 久综合网 | 日韩色中色 | 黄污污网站| 婷婷精品在线 | 国产精品99久久久精品免费观看 | 亚洲激情综合网 | 亚洲综合成人婷婷小说 | 国产在线自 | 伊人激情综合 | 美女视频黄网站 | 国产精品破处视频 | 456免费视频 | 国产亚州精品视频 | 久久新视频 | 午夜av一区| 色久天 | 久久96国产精品久久99软件 | 综合天天网 | 国产精品黄色影片导航在线观看 | 亚洲欧美国产精品va在线观看 | www.操.com| 一本大道久久精品懂色aⅴ 五月婷社区 | 毛片网站免费在线观看 | 国产1区在线 | 日韩在线二区 | 日本三级香港三级人妇99 | 久久久精品午夜 | 亚洲免费永久精品国产 | 亚洲五月激情 | 国产一区在线视频观看 | 在线观看免费成人av | 91成品人影院 | 中文字幕在线观看第二页 | 91精品专区| 成人一区二区三区在线 | 久久久在线 | 在线观看黄污 | 国产资源在线免费观看 | 亚洲天堂香蕉 | 国产精品va在线观看入 | 国产精品久久久久久爽爽爽 | 免费观看高清 | 天天射天天爱天天干 | 狠狠色丁香久久婷婷综合丁香 | 久在线观看视频 | 手机在线观看国产精品 | 国产久草在线观看 | 国产精品免费久久久 | av资源网在线播放 | 免费看片日韩 | 国产成人在线免费观看 | 在线之家免费在线观看电影 | 西西人体4444www高清视频 | 欧美一二在线 | 亚洲无人区小视频 | 奇米影视999 | 精品女同一区二区三区在线观看 | 成人免费91 | 黄色avwww | 国产精品毛片一区视频播 | 免费看黄网站在线 | 免费观看性生活大片 | 久久最新 | 久草视频免费观 | 一区二区三区日韩精品 | 欧美综合久久久 | 精品理论片 | 久久av中文字幕片 | 国内精品久久天天躁人人爽 | 亚洲精品中文字幕在线观看 | 色噜噜色噜噜 | 色婷婷成人网 | 免费在线观看成年人视频 | 在线看一区二区 | 国产91在线 | 美洲 | 99爱爱| 97超视频在线观看 | 欧美一级电影在线观看 | 国产专区视频 | 人人爱在线视频 | 在线国产一区二区 | 天天综合视频在线观看 | 亚洲欧美国产精品18p | 亚洲日b视频 | 免费观看一级特黄欧美大片 | 国产一区国产二区在线观看 | 国产精品久久久久永久免费观看 | 久久久国产精品一区二区三区 | 久久久电影网站 | 亚洲 综合 国产 精品 | 亚洲在线资源 | 国产精品美女毛片真酒店 | 四虎影视成人 | 99在线视频播放 | 91精品国产乱码 | 在线免费视频你懂的 | 国产亚洲精品久久久久5区 成人h电影在线观看 | 午夜影院一级 | 日韩成人邪恶影片 | 五月婷婷另类国产 | 97国产一区二区 | 中文字幕一区二区三区乱码在线 | 日韩有码网站 | 天天色天 | 国产视频亚洲 | 91传媒视频在线观看 | 免费观看的黄色片 | 最近最新mv字幕免费观看 | 91av在线电影 | 808电影| 91亚洲精品国偷拍 | 97视频人人澡人人爽 | 一区二区久久久久 | 日韩理论在线观看 | 一区二区 不卡 | 国产在线精品一区二区 | 91在线视频| 中文字幕丝袜 | 久久久久视 | 四虎国产永久在线精品 | 国产在线精品一区 | 久久av在线| 超碰国产在线 | 亚洲国产高清在线观看视频 | 91成版人在线观看入口 | 成人免费观看网址 | 久久免费a| 国产裸体永久免费视频网站 | 在线日韩视频 | 国内成人精品视频 | 日韩中文字幕国产 | 激情av在线播放 | 亚洲免费小视频 | 91亚洲国产 | 国产91精品久久久久 | 久草在线资源观看 | 天天操天天爱天天爽 | 国产精品自产拍在线观看桃花 | 精品国产1区2区3区 国产欧美精品在线观看 | 日韩影视大全 | 最近免费中文字幕 | 麻豆小视频在线观看 | 亚洲 中文 欧美 日韩vr 在线 | 在线观看成年人 | 一级黄色片毛片 | 欧美激情精品一区 | 国产女人免费看a级丨片 | 91在线看黄| 天天干夜夜想 | 国产一区二区综合 | 黄色毛片一级片 | 欧美99久久 | 欧美日韩视频网站 | www.黄色片网站 | 亚洲精品乱码久久久久久 | 在线国产视频 | 六月婷婷网 | 久久久精品网 | 日韩久久久久久久久 | 久久久福利影院 | 亚洲三级黄 | 国产成人精品一区二三区 | 天天射天天爱天天干 | 国产中文字幕在线视频 | 一级电影免费在线观看 | 国产一区免费视频 | 三级性生活视频 | 天天操天天干天天爱 | 日韩久久电影 | 欧美在线视频精品 | 99久免费精品视频在线观看 | 日韩视频一区二区三区在线播放免费观看 |