注意:这个Session不是Tomcat的那个,而是Shrio提供的一个Session
1、在首次调用subject.login()方法时,创建Session对象
2、默认30分钟过期
3、在调用subject.logout()方法时,销毁Session对象
subject.login()
:主体登录(认证)方法,同时创建Session对象
subject.getSession()
:获取Shiro封装的Session对象
subject.logout()
:主体登出方法,同时会销毁Session对象
public class ShiroSessionListener implements SessionListener{
//使用AtomicInteger,线程安全,统计在线人数
private final AtomicInteger sessionCount = new AtomicInteger(0);
public AtomicInteger getOnLineSessionCount(){
return this.sessionCount;
}
//session过期,执行该方法
@Override
public void onExpiration(Session arg0) {
System.out.println("会话过期,在线人数减一");
sessionCount.decrementAndGet();
}
//客户端首次访问服务器,创建session对象,执行该方法
@Override
public void onStart(Session arg0) {
System.out.println("首次访问服务器时,会话人数加一");
sessionCount.incrementAndGet();
}
//session调用stop方法时,执行该方法
@Override
public void onStop(Session arg0) {
System.out.println("退出时,会话人数减一");
sessionCount.decrementAndGet();
}
}
//自定义的SessionListener组件
@Bean
public ShiroSessionListener getShiroSessionListener(){
return new ShiroSessionListener();
}
//SessionManager组件
@Bean
public SessionManager getSessionManager(){
//获取一个SessionManager实现类
DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
//创建集合,将自定义的SessionListener存入集合
List<SessionListener> list = new ArrayList<>();
list.add(getShiroSessionListener());
//设置自定义SessionListener到SessionManager中
sessionManager.setSessionListeners(list);
//默认session存活时间30分钟
sessionManager.setGlobalSessionTimeout(1000*60*30);
return sessionManager;
}
//配置安全管理器
@Bean
public DefaultWebSecurityManager getDefaultWebSecurityManager(){
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
//安全管理器管理创建的Realm域对象
securityManager.setRealm(getLoginAndAuthRealm());
//安全管理器管理创建的SessionManager对象
securityManager.setSessionManager(getSessionManager());
return securityManager;
}