收藏私塾在线
 

欢迎您来到私塾在线网!   

请登录! 

免费注册 


renqiwang的笔记
状态: 离线
人气:2719040
访问用户量:2505
笔记经验:
总积分:389
级别:普通会员
搜索本笔记
ta的交流分类
ta的交流主题贴(61)
ta的所有交流贴(81)
ta的全部笔记
全部笔记(189)
未分类笔记(15)
JAVA(73)
课程问题(0)
Hibernate4(7)
Spring3(11)
Struts2(1)
ant(1)
maven(1)
jBPM(5)
Java Web(11)
研磨Struts2(15)
jquery(1)
Oracle&JDB……(2)
PL-SQL(1)
Android(0)
log4j&slf4……(1)
Mybaits(4)
研磨设计模式(28)
SpringMVC(11)
Spring Dat……(1)
存档
2013-11(10)
2013-07(12)
2012-11(1)
2012-08(28)
2012-03(6)
2012-02(132)

2013-11-12 14:36:38
第七章:Shiro的Session管理——深入浅出学Shiro细粒度权限开发框架——私塾在线原创
浏览(68281)|评论(0)   交流分类:Java|笔记分类: JAVA

概述和配置使用

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

 


精品视频课程推荐

Java数据结构和算法精讲版
本课程专注于数据结构和算法的内容,使用Java来进行代码示例,不空洞的讲解概念和理论,重点放在代码的实现和示例上。 从零开始、全面系统、成体系的讲解数据结构和基本算法,循序渐进的讲述构建软件系统所常见的数据结构和算法。

深入浅出学Shrio视频教程
内容概述:Shiro是目前最热门、最易用、功能超强大的Java权限管理框架,强烈推荐,每个项目都必备的权限管理技术!通过本课程,你将从零开始直到彻底掌握Shiro的相关开发知识,达到可以进行实际项目开发的能力。包括:权限管理基础、Shiro入门、配置、身份认证、授权、Realms、Session管理、和Spring的集成、Web、Cache等众多开发细节技术 技术要点:源码级分析Shiro的授权过程、自定义开发Realm、多个Realms的开发配置、自定义开发AuthenticationStrategy、自定义开发自定义SessionDAO、和Struts2+Spring3的集成(包括修正struts2的bug)、Shiro和SpringMVC+Spring3的集成、包装使用其他的Cache框架、缓存数据同步更新的解决方案等等实际开发中常用的内容

Ajax+JSON基础实战视频教程
数据校验、Javascript模拟多线程、下拉列表联动、操作XML、AJAX结合JSON的操作、Json-lib的使用

Javascript基础视频教程
JavaScript的内置对象--Array、String、Date、Math等,可以通过DOM对象进行对象控制,创建控制菜单及复选框的控制,创建二级联动列表框及列表框选项的移动,JavaScript项目,创建基于JS的商品管理系统。

XML基础视频教程
创建规范的XML文档,DTD的作用,并且可以根据要求创建私用的DTD,通过JavaScript解析XML DOM

浏览(68281)|评论(0)   交流分类:Java|笔记分类: JAVA

评论(0)
请登录后评论 登录

关于我们 | 联系我们 | 用户协议 | 私塾在线服务协议 | 版权声明 | 隐私保护

版权所有 Copyright(C)2009-2012 私塾在线学习网