[英]Storing Web Socket sessions in Redis
我在tomcat中部署了一個Web套接字服務器端點,如下所示:
@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中緩存與每個用戶相對應的令牌。
我不能將會話存儲在REDIS中,因為它是一個不可序列化的對象,因此必須將其維護在本地內存中。 我希望避免這種情況,因為如果服務器重啟或不想進行負載平衡,我都不會丟失數據。
如何做到這一點?
如果不進行大量工作,您將無法存儲任意的,不可serializable
對象。
但是,如果您知道已經存儲了哪種對象,那么您當然可以編寫自己的序列化器。 沒有什么可以說數據必須是二進制的。 您可以使用XML,JSON或某些組合存儲系統。
您可以限制您的應用程序,使其僅存儲某些類型的對象嗎? 例如,如果您僅存儲基元(以及其裝箱的樣式)和集合或這些內容,則只需很少的代碼即可完成此操作。 如果沒有,請准備編寫更多代碼。
將會話對象的代碼更改為可Serializable
,然后僅使用Java序列化來完成工作可能會更容易。
請注意,Java序列化的未來是不確定的。 歸檔了一個非常老的JEP來刪除序列化,但是它被撤回了 。 最近的安全問題促使一些人支持從將來的Java版本中刪除序列化 。 第二篇文章特別提到“實現序列化是一個長期目標,並且是Project Amber的一部分”,但我在Project Amber中看不到任何涉及序列化的內容 。
另外,某些現有的Java規范(包括Servlet規范在內的Java EE的一部分)幾乎需要對序列化的支持,因此...即使不贊成使用它,我也看不到它會在任何地方出現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.