文章目录
场景描述
spring boot 项目中为了简化消息模块,如果有新消息,先写入数据库,如果用户在线,设置接收消息用户的 session 中 newMessageFlag = true,前端每次轮询只需轮询 session 即可,无需每次访问数据库。
这里需要根据用户ID 获取session,所以用户登录成功,调用 put 方法,退出登录 或者session 失效,调用 remove。
session 容器
存储已登录用户的 session
public class LoggedUserSessionContext{
//默认容量为 16 ,可以根据自己网站的访问量设置一个合理的初始值,避免刚开始时候的频繁扩容。
private static Map<Integer, HttpSession> sessionMap = new ConcurrentHashMap<>(128);
public static HttpSession putIfAbsent(Integer userId, HttpSession session) {
//先前已经在某个客户端登录了,则返回那个 session,以实现多端登录session共享
return sessionMap.putIfAbsent(userId, session);
}
public static void remove(Integer userId) {
sessionMap.remove(userId);
}
public static HttpSession getSession(Integer userId) {
return sessionMap.get(userId);
}
}
添加 session
用户登录成功后执行以下代码段
HttpSession session = LoggedUserSessionContext.getSession(user.getId());
if(session != null){