public EnterpriseCacheSessionDAO() { setCacheManager(new AbstractCacheManager() { @Override protected Cache<Serializable, Session> createCache(String name) throws CacheException { return new MapCache<Serializable, Session>(name, new ConcurrentHashMap<Serializable, Session>()); } }); }
protected Serializable doCreate(Session session) { Serializable sessionId = generateSessionId(session); assignSessionId(session, sessionId); return sessionId; }
@Bean @ConditionalOnMissingBean public SessionDAO sessionDAO(CacheManager cacheManager) { EnterpriseCacheSessionDAO sessionDAO = new EnterpriseCacheSessionDAO(); sessionDAO.setActiveSessionsCacheName(shiroSessionProperties.getActiveSessionsCacheName()); Class<? extends SessionIdGenerator> idGenerator = shiroSessionProperties.getIdGenerator(); if (idGenerator != null) { SessionIdGenerator sessionIdGenerator = BeanUtils.instantiate(idGenerator); sessionDAO.setSessionIdGenerator(sessionIdGenerator); } sessionDAO.setCacheManager(cacheManager); return sessionDAO; }
/** * 会话DAO * * @return */ @Bean public EnterpriseCacheSessionDAO sessionDAO() { EnterpriseCacheSessionDAO enterpriseCacheSessionDAO = new EnterpriseCacheSessionDAO(); enterpriseCacheSessionDAO.setActiveSessionsCacheName("shiro-activeSessionCache"); enterpriseCacheSessionDAO.setSessionIdGenerator(sessionIdGenerator()); return enterpriseCacheSessionDAO; }
@Override protected Serializable doCreate(Session session) { Serializable id = super.doCreate(session); return id; }
@Override protected Session doReadSession(Serializable sessionId) { return super.doReadSession(sessionId); }
@IocBean(name = "shiroWebSessionManager") public WebSessionManager getWebSessionManager() { DefaultWebSessionManager webSessionManager = conf.make(DefaultWebSessionManager.class, "shiro.session.manager."); // 带缓存的shiro会话 EnterpriseCacheSessionDAO sessionDAO = new EnterpriseCacheSessionDAO(); sessionDAO.setSessionIdGenerator(new UU32SessionIdGenerator()); webSessionManager.setSessionDAO(sessionDAO); //设置session会话超时时间 webSessionManager.setGlobalSessionTimeout(conf.getLong(PROP_SESSION_MANAGER_GLOBALSESSIONTIMEOUT, 1800000)); webSessionManager.setSessionValidationSchedulerEnabled(conf.getBoolean(PROP_SESSION_MANAGER_SVSE, true)); webSessionManager.setSessionValidationInterval(conf.getLong(PROP_SESSION_MANAGER_SVI, 3600000)); // cookie conf.putIfAbsent(PROP_SESSION_COOKIE_NAME, "sid"); conf.putIfAbsent(PROP_SESSION_COOKIE_MAXAGE, "946080000"); conf.putIfAbsent(PROP_SESSION_COOKIE_HTTPONLY, "true"); SimpleCookie cookie = conf.make(SimpleCookie.class, "shiro.session.cookie."); webSessionManager.setSessionIdCookie(cookie); webSessionManager.setSessionIdCookieEnabled(true); webSessionManager.setCacheManager(ioc.get(CacheManager.class, "shiroCacheManager")); webSessionManager.setSessionListeners(appContext.getBeans(SessionListener.class)); return webSessionManager; }
@Override protected void doUpdate(Session session) { super.doUpdate(session); }
@Override protected void doDelete(Session session) { super.doDelete(session); }
@Bean SessionDAO sessionDAO() { CachingSessionDAO sessionDAO = new EnterpriseCacheSessionDAO(); sessionDAO.setCacheManager(this.getEhCacheManager()); return sessionDAO; }
/** * 优先使用本地内存 */ @Override protected void cache(Session session, Serializable sessionId) { if (session == null || sessionId == null) { return; } sessions.put(sessionId, session);// 直接放入本地缓冲池 if (session instanceof OnlineSession) { OnlineSession onlineSession = (OnlineSession) session; if (onlineSession.getUserId() == null && !(onlineSessionDAOService instanceof NoopOnlineSessionDAOService)) { // 未经用户认证的会话,禁用Redis等缓存,仅使用数据库,以缓解会话数暴增的压力 return; } } super.cache(session, sessionId); }
@Override protected Serializable doCreate(final Session session) { Serializable id = super.doCreate(session); log.trace("Created session-id: {} for session: {}", id, session); return id; } }
@Override protected Session doReadSession(Serializable sessionId) { return super.doReadSession(sessionId); }
@Override protected void doUpdate(Session session) { if (session == null || session.getId() == null) { return; } HttpServletRequest request = ServletUtils.getRequest(); if (request != null) { // 手动控制不更新SESSION String updateSession = request.getParameter("updateSession"); if (Boolean.FALSE.equals(Boolean.parseBoolean(updateSession))) { return; } } super.doUpdate(session); logger.debug("update {} {}", session.getId(), request != null ? request.getRequestURI() : ""); }
@Override protected void doDelete(Session session) { if (session == null || session.getId() == null) { return; } super.doDelete(session); logger.debug("delete {} ", session.getId()); }
public void init() throws ShiroException { // use cacheing for the sessions, we can tune this with a props file per application if needed StatelessAndStatefulWebSessionManager webSessionManager = new StatelessAndStatefulWebSessionManager(); webSessionManager.setSessionDAO( new EnterpriseCacheSessionDAO() ); this.setSessionManager( webSessionManager ); } }
protected void cache(Session session, Serializable sessionId, Cache<Serializable, Session> cache) { super.cache(session, sessionId, cache); Duration duration = new Millis(sessionTimeout); // 设置SESSION的过期时间 if (session != null && sessionTimeout > 0 && cache instanceof VolatileCache) { @SuppressWarnings("unchecked") VolatileCache<Serializable> vcache = (VolatileCache<Serializable>) cache; vcache.expire(sessionId, duration); } // 设置认证信息和授权信息的过期时间 if (session != null && sessionTimeout > 0 && volatileCachingRealm != null) { volatileCachingRealm.expire(session, duration); } }
@Override protected Serializable doCreate(Session session) { Serializable sessionId = super.doCreate(session); logger.debug("创建session:{}" , session.getId()); redisTemplate.opsForValue().set(prefix + sessionId.toString(), session); return sessionId; }
@Override protected Session doReadSession(Serializable sessionId) { return super.doReadSession(sessionId); }
public EnterpriseCacheSessionDAO() { setCacheManager(new AbstractCacheManager() { @Override protected Cache<Serializable, Session> createCache(String name) throws CacheException { return new MapCache<Serializable, Session>(name, new ConcurrentHashMap<Serializable, Session>()); } }); }