sessionFactory 是创建会话的工厂,根据相应的Subject 上下文信息来创建会话;默认提供了SimpleSessionFactory用来创建SimpleSession会话。
首先自定义一个Session:
public class OnlineSession extends SimpleSession {
public static enum OnlineStatus {
on_line("在线"), hidden("隐身"), force_logout("强制退出");
private final String info;
private OnlineStatus(String info) {
this.info = info;
}
public String getInfo() {
return info;
}
}
private String userAgent; //用户浏览器类型
private OnlineStatus status = OnlineStatus.on_line; //在线状态
private String systemHost; //用户登录时系统IP
//省略其他
}
OnlineSession 用于保存当前登录用户的在线状态,支持如离线等状态的控制。
接着自定义SessionFactory:
public class OnlineSessionFactory implements SessionFactory {
@Override
public Session createSession(SessionContext initData) {
OnlineSession session = new OnlineSession();
if (initData != null && initData instanceof WebSessionContext) {
WebSessionContext sessionContext = (WebSessionContext) initData;
HttpServletRequest request = (HttpServletRequest)
sessionContext.getServletRequest();
if (request != null) {
session.setHost(IpUtils.getIpAddr(request));
session.setUserAgent(request.getHeader("User-Agent"));
session.setSystemHost(request.getLocalAddr() + ":" +
request.getLocalPort());
}
}
return session;
}
}
根据会话上下文创建相应的OnlineSession。
最后在shiro-web.ini配置文件中配置:
sessionFactory=org.apache.shiro.session.mgt.OnlineSessionFactory
sessionManager.sessionFactory=$sessionFactory
更多请参考https://github.com/zhangkaitao/es/tree/master/web/src/main/java/org/apache/shiro中的相关代码。