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

shiro会话管理示例代码

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

Java代码  

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

另外可以设置会话的全局过期时间(毫秒为单位),默认30分钟:

Java代码  

sessionManager. globalSessionTimeout=1800000 

默认情况下globalSessionTimeout将应用给所有Session。可以单独设置每个Session的timeout属性来为每个Session设置其超时时间。

另外如果使用ServletContainerSessionManager进行会话管理,Session的超时依赖于底层Servlet容器的超时时间,可以在web.xml中配置其会话的超时时间(分钟为单位): 

Java代码  

<session-config> 
 <session-timeout>30</session-timeout> 
</session-config> 

在Servlet容器中,默认使用JSESSIONID Cookie维护会话,且会话默认是跟容器绑定的;在某些情况下可能需要使用自己的会话机制,此时我们可以使用DefaultWebSessionManager来维护会话:

Java代码  

sessionIdCookie=org.apache.shiro.web.servlet.SimpleCookie 
sessionManager=org.apache.shiro.web.session.mgt.DefaultWebSessionManager 
sessionIdCookie.name=sid 
#sessionIdCookie.domain=sishuok.com 
#sessionIdCookie.path= 
sessionIdCookie.maxAge=1800 
sessionIdCookie.httpOnly=true 
sessionManager.sessionIdCookie=$sessionIdCookie 
sessionManager.sessionIdCookieEnabled=true 
.securityManager.sessionManager=$sessionManager 

sessionIdCookie是sessionManager创建会话Cookie的模板:

sessionIdCookie.name:设置Cookie名字,默认为JSESSIONID;

sessionIdCookie.domain:设置Cookie的域名,默认空,即当前访问的域名;

sessionIdCookie.path:设置Cookie的路径,默认空,即存储在域名根下;

sessionIdCookie.maxAge:设置Cookie的过期时间,秒为单位,默认-1表示关闭浏览器时过期Cookie;

sessionIdCookie.httpOnly:如果设置为true,则客户端不会暴露给客户端脚本代码,使用HttpOnly cookie有助于减少某些类型的跨站点脚本攻击;此特性需要实现了Servlet 2.5 MR6及以上版本的规范的Servlet容器支持;

sessionManager.sessionIdCookieEnabled:是否启用/禁用Session Id Cookie,默认是启用的;如果禁用后将不会设置Session Id Cookie,即默认使用了Servlet容器的JSESSIONID,且通过URL重写(URL中的“;JSESSIONID=id”部分)保存Session Id。

 另外我们可以如“sessionManager. sessionIdCookie.name=sid”这种方式操作Cookie模板。 

会话监听器

会话监听器用于监听会话创建、过期及停止事件: 

Java代码  

public class MySessionListener1 implements SessionListener { 
 @Override 
 public void onStart(Session session) {//会话创建时触发 
  System.out.println("会话创建:" + session.getId()); 
 } 
 @Override 
 public void onExpiration(Session session) {//会话过期时触发 
  System.out.println("会话过期:" + session.getId()); 
 } 
 @Override 
 public void onStop(Session session) {//退出/会话过期时触发 
  System.out.println("会话停止:" + session.getId()); 
 } 
} 

如果只想监听某一个事件,可以继承SessionListenerAdapter实现:

Java代码  

public class MySessionListener2 extends SessionListenerAdapter { 
 @Override 
 public void onStart(Session session) { 
  System.out.println("会话创建:" + session.getId()); 
 } 
} 

在shiro-web.ini配置文件中可以进行如下配置设置会话监听器:

Java代码 

sessionListener1=com.github.zhangkaitao.shiro.chapter10.web.listener.MySessionListener1 
sessionListener2=com.github.zhangkaitao.shiro.chapter10.web.listener.MySessionListener2 
sessionManager.sessionListeners=$sessionListener1,$sessionListener2 

会话存储/持久化 

Shiro提供SessionDAO用于会话的CRUD,即DAO(Data Access Object)模式实现:

Java代码 

//如DefaultSessionManager在创建完session后会调用该方法;如保存到关系数据库/文件系统/NoSQL数据库;即可以实现会话的持久化;返回会话ID;主要此处返回的ID.equals(session.getId()); 
Serializable create(Session session); 
//根据会话ID获取会话 
Session readSession(Serializable sessionId) throws UnknownSessionException; 
//更新会话;如更新会话最后访问时间/停止会话/设置超时时间/设置移除属性等会调用 
void update(Session session) throws UnknownSessionException; 
//删除会话;当会话过期/会话停止(如用户退出时)会调用 
void delete(Session session); 
//获取当前所有活跃用户,如果用户量多此方法影响性能 
Collection<Session> getActiveSessions(); 

Shiro内嵌了如下SessionDAO实现:

shiro会话管理示例代码

(编辑:晋中站长网)

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

热点阅读