1. 程式人生 > >第十章 會話管理(六) sessionFactory

第十章 會話管理(六) sessionFactory

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中的相關程式碼。