簡體   English   中英

在Redis中存儲Web套接字會話

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM