Shiro的Session管理

概述和配置使用

n概述

  Shiro提供安全框架界独一无二的东西:一个完整的企业级Session 解决方案,可以为任意的应用提供session支持,包括web和非web应用,并且无需部署你的应用程序到Web 容器或使用EJB容器。

n基本使用

  可以通过与当前执行的Subject 交互来获取Session:

 Subject currentUser = SecurityUtils.getSubject();  
 Session session = currentUser.getSession();
 session.setAttribute("someKey", someValue);

n关于SessionManager

  SessionManager是用来管理Session的组件,包括:创建,删除,inactivity(失效)及验证,等等。SessionManager 也是一个由SecurityManager 维护的顶级组件。

  shiro提供了默认的SessionManager实现,一般没有必要自定义这个。

n设置Sessioin的过期时间

  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


转载于:https://my.oschina.net/boonya/blog/348149

### Apache Shiro Session 管理机制 Apache Shiro 提供了一种简单而强大的会话管理机制,允许开发者在任何环境中轻松管理和操作用户的会话状态。无论是在传统的 Web 应用还是无界面的应用程序中,Shiro 都能提供一致的 API 来处理会话。 #### 1. **核心概念** Shiro 的会话管理基于 `SessionManager` 和 `SessionFactory` 这两个接口实现。通过这些组件,Shiro 能够创建、维护和销毁会话对象。默认情况下,Shiro 使用内存来存储会话数据,但在分布式环境或高并发场景下,可以自定义持久化策略以支持集群部署[^2]。 #### 2. **主要特性** - **跨平台一致性**: 不论是 Web 应用还是桌面应用,Shiro 均提供了统一的会话管理接口。 - **可插拔性**: 开发者可以通过扩展 `DefaultWebSessionManager` 或其他内置类来自定义会话行为。 - **超时控制**: 支持设置全局或特定会话的最大存活时间以及空闲过期时间。 - **事件监听器**: 可注册 `SessionListener` 对象,在会话生命周期的不同阶段触发回调函数。 #### 3. **配置方法** ##### XML 配置 以下是使用 INI 文件配置 Shiro 会话管理的一个例子: ```ini [sessionManager] sessionValidationSchedulerEnabled = true globalSessionTimeout = 1800000 # 设置全局会话超时时长为 30 分钟 (毫秒) [main] securityManager.sessionMode = native securityManager.sessionManager.globalSessionTimeout = ${sessionManager.globalSessionTimeout} securityManager.sessionManager.sessionValidationScheduler.interval = 60000 # 每分钟验证一次有效会话 ``` 上述配置启用了本地模式下的会话管理,并设置了定时任务定期清理失效会话[^3]。 ##### Java 配置 对于 Spring Boot 用户而言,也可以借助编程方式进行更灵活的定制: ```java @Bean public DefaultWebSessionManager sessionManager() { DefaultWebSessionManager manager = new DefaultWebSessionManager(); manager.setGlobalSessionTimeout(1800000); // 单位:毫秒 manager.setDeleteInvalidSessions(true); return manager; } @Bean public SecurityManager securityManager(DefaultWebSessionManager sessionManager, MyRealm realm) { DefaultSecurityManager securityManager = new DefaultSecurityManager(realm); securityManager.setSessionManager(sessionManager); return securityManager; } ``` 此代码片段展示了如何通过注入的方式将自定义的 `DefaultWebSessionManager` 整合到 Shiro 安全管理体系之中。 #### 4. **高级主题** 当面对大规模分布式架构时,可能需要考虑以下几点优化措施: - 利用 Redis/Memcached 替代默认的内存存储方案; - 自定义序列化逻辑减少网络传输开销; - 结合负载均衡设备同步客户端 Cookie 中保存的 JSESSIONID 数据。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值