我有一个Web Socket服务器端点部署在Tomcat中,如下所示:
@ServerEndpoint(value="/alerts/{username}/{sessionId}/{token}",
decoders = AlertDTODecoder.class,
encoders = AlertDTOEncoder.class )
public class AlertWebSocketEndpoint {
@OnOpen
public void onOpen(Session session,
@PathParam("username") String username,
@PathParam("sessionId") String sessionId,
@PathParam("token") String token) throws IOException {
String origToken = TokenCacheServiceImpl.getInstance().getToken(username, sessionId);
if ( origToken == null || !origToken.equals(token)) {
session.close();
}else {
AlertSession.getInstance().addUserSession(username, session);
}
}
@OnClose
public void onClose(Session session, @PathParam("username") String username) throws Exception {
AlertSession.getInstance().removeUserSession(username, session);
session.close();
}
}
AlertSession是一个单例类,我在其中维护会话缓存。
TokenCacheServiceImpl用于在REDIS中缓存与每个用户对应的令牌。
由于Session是非可序列化对象,因此无法将其存储在REDIS中,必须在本地内存中维护它。我希望避免这种情况,因为如果服务器重新启动或者我想进行负载均衡,我不想丢失数据。
如何实现这一点?