概述和配置使用html
n概述java
Shiro提供安全框架界独一无二的东西:一个完整的企业级Session 解决方案,能够为任意的应用提供session支持,包括web和非web应用,而且无需部署你的应用程序到Web 容器或使用EJB容器。python
n基本使用web
能够经过与当前执行的Subject 交互来获取Session:数据库
Subject currentUser = SecurityUtils.getSubject(); Session session = currentUser.getSession(); session.setAttribute("someKey", someValue);
n关于SessionManagerapache
SessionManager是用来管理Session的组件,包括:建立,删除,inactivity(失效)及验证,等等。SessionManager 也是一个由SecurityManager 维护的顶级组件。缓存
shiro提供了默认的SessionManager实现,通常没有必要自定义这个。安全
n设置Sessioin的过时时间session
Shiro 的SessionManager 实现默认是30 分钟会话超时。框架
你能够设置SessionManager 默认实现的globalSessionTimeout 属性来为全部的会话定义默认的超时时间。例如,
[main] # 3,600,000 milliseconds = 1 hour securityManager.sessionManager.globalSessionTimeout = 3600000
nSessioin的事件监听
你能够实现SessionListener 接口(或扩展易用的SessionListenerAdapter)并与相应的会话操做做出反应。 配置示例:
[main] aSessionListener = com.foo.my.SessionListener anotherSessionListener = com.foo.my.OtherSessionListener securityManager.sessionManager.sessionListeners = $aSessionListener, $anotherSessionListener
SessionDAO
n概述
每当一个会话被建立或更新时,它的数据须要持久化到一个存储位置以便它可以被稍后的应用程序访问,实现这个功能的组件就是SessionDAO。
你可以实现该接口来与你想要的任何数据存储进行通讯。这意味着你的会话数据能够驻留在内存中,文件系统,关系数据库或NoSQL 的数据存储,或其余任何你须要的位置。
n基本配置
SessionDAO是做为一个属性配置在默认的SessionManager 实例上
[main] sessionDAO = com.foo.my.SessionDAO securityManager.sessionManager.sessionDAO = $sessionDAO
这种SessionDAO主要在本地应用中起做用。
n基于EHCache的SessionDAO,基本配置以下:
[main] sessionDAO = org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO securityManager.sessionManager.sessionDAO = $sessionDAO cacheManager = org.apache.shiro.cache.ehcache.EhCacheManager securityManager.cacheManager = $cacheManager
nShiro提供了默认的EHCache的配置xml,若是你要配置本身的EHCache.xml,须要注意如下几点:
1:overflowToDisk=“true” - 这确保当你溢出进程内存时,会话不丢失且可以被序列化到磁盘上。
2: eternal=“true” - 确保缓存项(Session 实例)永不过时或被缓存自动清除。这是颇有必要的,由于Shiro 基于计划过程完成本身的验证。若是咱们关掉这项,缓存将会在Shiro 不知道的状况下清扫这些Sessions,这可能引发麻烦。
3:若是你想使用一个不一样的名字而不是默认的,你能够在EnterpriseCacheSessionDAO 上配置名字,例如:sessionDAO.activeSessionsCacheName = myname
只要确保在ehcahe.xml 中有一项与这个名字匹配
Web应用中的Session
n在web应用上,默认使用的是容器的会话,若是你想基于Web 应用程序启用SessionDAO 来自定义会话存储或会话群集,你将不得不首先配置一个本地的Web 会话管理器。例如:
[main] sessionManager=org.apache.shiro.web.session.mgt.DefaultWebSessionManager securityManager.sessionManager = $sessionManager # Configure a SessionDAO and then set it: securityManager.sessionManager.sessionDAO = $sessionDAO
n在web应用上,若是想要在每个请求的基础上启用或禁用会话的建立,能够在配置中的[urls] 里面,为相应的url设置一个noSessionCreation过滤器,以下:
[urls] /rest/** = noSessionCreation, authcBasic
自定义SessionDAO
n在某些场景中,咱们须要管理用户的Session信息,好比把Session信息放到数据库中,这样就能够记录一个操做日志,或是统计在线人员等等。
n自定义SessionDAO也很是简单,一般是继承AbstractSessionDAO,实现对Session数据的CRUD便可,简单示例以下:
public class MySessionDAO extends AbstractSessionDAO{ private Map<Serializable,Session> map = new HashMap<Serializable,Session>(); public void update(Session session) throws UnknownSessionException { System.out.println("now update session"); map.put(session.getId(),session); } public void delete(Session session) { System.out.println("now delete session"); map.remove(session.getId()); } public Collection<Session> getActiveSessions() { System.out.println("now getActiveSessions session"); return map.values(); } protected Serializable doCreate(Session session) { System.out.println("now doCreate session"); Serializable sessionId = generateSessionId(session); assignSessionId(session, sessionId); map.put(sessionId, session); return sessionId; } protected Session doReadSession(Serializable sessionId) { System.out.println("now doReadSession session"); return map.get(sessionId); } }
n基本的配置示例:
sessionDAO = cn.javass.hello.MySessionDAO securityManager.sessionManager.sessionDAO = $sessionDAO
私塾在线 原创,转载请注明 http://sishuok.com/forum/blogPost/list/0/7458.html