shiro会话管理示例代码
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实现: (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |