加入收藏 | 设为首页 | 会员中心 | 我要投稿 武陵站长网 (https://www.50888.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 创业 > 经验 > 正文

shiro会话管理示例代码

发布时间:2020-12-24 13:40:02 所属栏目:经验 来源:网络整理
导读:Shiro提供了完整的企业级会话管理功能,不依赖于底层容器(如web容器tomcat),不管JavaSE还是JavaEE环境都可以使用,提供了会话管理、会话事件监听、会话存储/持久化、容器无关的集群、失效/过期支持、对Web的透明支持、SSO单点登录的支持等特性。即直接使
副标题[/!--empirenews.page--]

Shiro提供了完整的企业级会话管理功能,不依赖于底层容器(如web容器tomcat),不管JavaSE还是JavaEE环境都可以使用,提供了会话管理、会话事件监听、会话存储/持久化、容器无关的集群、失效/过期支持、对Web的透明支持、SSO单点登录的支持等特性。即直接使用Shiro的会话管理可以直接替换如Web容器的会话管理。 

会话

所谓会话,即用户访问应用时保持的连接关系,在多次交互中应用能够识别出当前访问的用户是谁,且可以在多次交互中保存一些数据。如访问一些网站时登录成功后,网站可以记住用户,且在退出之前都可以识别当前用户是谁。 

Shiro的会话支持不仅可以在普通的JavaSE应用中使用,也可以在JavaEE应用中使用,如web应用。且使用方式是一致的。 

Java代码  

login("classpath:shiro.ini","zhang","123"); 
Subject subject = SecurityUtils.getSubject(); 
Session session = subject.getSession(); 

登录成功后使用Subject.getSession()即可获取会话;其等价于Subject.getSession(true),即如果当前没有创建Session对象会创建一个;另外Subject.getSession(false),如果当前没有创建Session则返回null(不过默认情况下如果启用会话存储功能的话在创建Subject时会主动创建一个Session)。

Java代码  

session.getId(); 

获取当前会话的唯一标识。 

Java代码  

session.getHost();

 获取当前Subject的主机地址,该地址是通过HostAuthenticationToken.getHost()提供的。  

Java代码  

session.getTimeout(); 
session.setTimeout(毫秒); 

获取/设置当前Session的过期时间;如果不设置默认是会话管理器的全局过期时间。  

Java代码  

session.getStartTimestamp(); 
session.getLastAccessTime(); 

获取会话的启动时间及最后访问时间;如果是JavaSE应用需要自己定期调用session.touch()去更新最后访问时间;如果是Web应用,每次进入ShiroFilter都会自动调用session.touch()来更新最后访问时间。     

Java代码  

session.touch(); 
session.stop(); 

更新会话最后访问时间及销毁会话;当Subject.logout()时会自动调用stop方法来销毁会话。如果在web中,调用javax.servlet.http.HttpSession. invalidate()也会自动调用Shiro Session.stop方法进行销毁Shiro的会话。  

Java代码  

session.setAttribute("key","123"); 
Assert.assertEquals("123",session.getAttribute("key")); 
session.removeAttribute("key"); 

设置/获取/删除会话属性;在整个会话范围内都可以对这些属性进行操作。  

Shiro提供的会话可以用于JavaSE/JavaEE环境,不依赖于任何底层容器,可以独立使用,是完整的会话模块。 

会话管理器

会话管理器管理着应用中所有Subject的会话的创建、维护、删除、失效、验证等工作。是Shiro的核心组件,顶层组件SecurityManager直接继承了SessionManager,且提供了SessionsSecurityManager实现直接把会话管理委托给相应的SessionManager,DefaultSecurityManager及
DefaultWebSecurityManager默认SecurityManager都继承了SessionsSecurityManager。 

SecurityManager提供了如下接口: 

Java代码  

Session start(SessionContext context); //启动会话 
Session getSession(SessionKey key) throws SessionException; //根据会话Key获取会话

另外用于Web环境的WebSessionManager又提供了如下接口: 

Java代码  

boolean isServletContainerSessions();//是否使用Servlet容器的会话 

Shiro还提供了ValidatingSessionManager用于验资并过期会话: 

Java代码  

void validateSessions();//验证所有会话是否过期 

shiro会话管理示例代码

Shiro提供了三个默认实现:

DefaultSessionManager:DefaultSecurityManager使用的默认实现,用于JavaSE环境;
ServletContainerSessionManager:DefaultWebSecurityManager使用的默认实现,用于Web环境,其直接使用Servlet容器的会话;

DefaultWebSessionManager:用于Web环境的实现,可以替代ServletContainerSessionManager,自己维护着会话,直接废弃了Servlet容器的会话管理。

替换SecurityManager默认的SessionManager可以在ini中配置(shiro.ini):

Java代码  

[main] 
sessionManager=org.apache.shiro.session.mgt.DefaultSessionManager 
securityManager.sessionManager=$sessionManager 

Web环境下的ini配置(shiro-web.ini):

<!--EndFragment-->

(编辑:武陵站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读