一般我们的 session 会话过期时间默认为 30 分钟,有的用户认为 30 分钟太短了,有时候临时有事出去了,回来已经过期了,工作还没完成就只能登出了,非常不方便,于是要求我们改变 session 的过期时间
- 1、指定本系统 sessionid
/** * 指定本系统sessionid, 问题: 与servlet容器名冲突, 如jetty, tomcat 等默认jsessionid, * 当跳出shiro servlet时如error-page容器会为jsessionid重新分配值导致登录会话丢失! * * @return */ @Bean public SimpleCookie sessionIdCookie() { SimpleCookie simpleCookie = new SimpleCookie("shiro.session"); // 防止xss攻击,窃取cookie内容 simpleCookie.setHttpOnly(true); return simpleCookie; }
指定了本地的 session 的 key 为 shiro.session,便于单独管理
- 2、配置 session 管理器
/** * 会话管理 * 默认使用容器session,这里改为自定义session * session的全局超时时间默认是30分钟 * * @return */ @Bean public DefaultWebSessionManager sessionManager() { DefaultWebSessionManager sessionManager = new DefaultWebSessionManager(); // 会话超时时间,单位:毫秒 sessionManager.setGlobalSessionTimeout(60 * 60 * 1000); // 定时清理失效会话, 清理用户直接关闭浏览器造成的孤立会话 sessionManager.setSessionValidationInterval(60 * 60 * 1000); // 是否开启定时清理失效会话 sessionManager.setSessionValidationSchedulerEnabled(true); // 指定sessionid sessionManager.setSessionIdCookie(sessionIdCookie()); // 是否允许将sessionId 放到 cookie 中 sessionManager.setSessionIdCookieEnabled(true); // 是否允许将 sessionId 放到 Url 地址拦中 sessionManager.setSessionIdUrlRewritingEnabled(false); // 默认使用MemerySessionDao,设置为EnterpriseCacheSessionDAO以配合ehcache实现分布式集群缓存支持 sessionManager.setSessionDAO(new EnterpriseCacheSessionDAO()); return sessionManager; }
设置了过期时间为 60 * 60 * 1000 = 60 分钟,即表示用户 60 分钟无操作后,会话就会过期
- 3、配置安全管理器
/** * 安全管理器 */ @Bean public SecurityManager securityManager() { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); // 设置自定义的relam securityManager.setRealm(loginRelam()); // 设置session管理器 securityManager.setSessionManager(sessionManager()); return securityManager; }