WebSocketServlet(突堤WebSocketを)中、aのHttpServletに設定されたセッション属性へのアクセス

ほろ酔い:

私がアクセスセッションにしようとしているがにセット属性HttpServletからWebSocketServlet

私は2つの持っているServletContextHandlerオブジェクト、両方でSESSIONS有効になって:

val httpHandler = object : ServletContextHandler(nullParent, contextPath, SESSIONS).apply {
    addServlet(ServletHolder(httpServlet), "/*")
}

val webSocketHandler = ServletContextHandler(nullParent, contextPath, SESSIONS).apply {
    addServlet(ServletHolder(wsServlet), "/*")
}

これらは次のように接続されているHandlerList(httpHandler, webSocketHandler)私の桟橋へServer最初の行doHandleServletContextHandlerためのHttpHandlerチェックそれは(それが引き渡さいた場合であれば、要求は直ちにのWebSocketアップグレード要求、およびリターンである場合ServletContextHandlerのためにWebSocketServlet)。

私はシンプル持っPOSTセッション属性を設定したエンドポイントを、私はこのセッション属性を取得できませんよWebSocketServlet

class MyWsServlet : WebSocketServlet() {

    override fun configure(factory: WebSocketServletFactory) {
        factory.creator = WebSocketCreator { req, res ->
            // session exists here, but req.session.getAttribute("any-attr") is always null
        }
    }

    override fun service(req: HttpServletRequest, res: HttpServletResponse) {
        // session also exists here, but req.session.getAttribute("any-attr") is always null
    }

}

何かアドバイスや提案を歓迎します。

編集:私は、後のWebSocket要求対GETリクエストからいくつかのデバッグ情報が含まましreq.session.setAttribute("test", "tast")呼ばれていました:

Path: /
Cookies:{JSESSIONID=node01cxyhb0addjwikyb2lgtnlxlw0.node0}
Session: Session@24b04e4{id=node01cxyhb0addjwikyb2lgtnlxlw0,x=node01cxyhb0addjwikyb2lgtnlxlw0.node0,req=1,res=true}
Session id: node01cxyhb0addjwikyb2lgtnlxlw0
Session isNew: false
Session attributes: {test=tast}
---------------------------
Path: /websocket
Cookies:{JSESSIONID=node01cxyhb0addjwikyb2lgtnlxlw0.node0}
Session: Session@5989f3d1{id=node01cxyhb0addjwikyb2lgtnlxlw0,x=node01cxyhb0addjwikyb2lgtnlxlw0.node0,req=1,res=true}
Session id: node01cxyhb0addjwikyb2lgtnlxlw0
Session isNew: false
Session attributes: {}
ヨアキムErdfelt:

まず、あなたの2を取り除くServletContextHandler、使用する1。あなたは同じのcontextPathをとにかく上の2つのハンドラを持つことができません。

また、あなたが使用して、あなたは桟橋サーバーのWebSocketを実装することができます2つの主要な方法を持っているWebSocketServlet、または使用しましたWebSocketUpgradeFilter最大の違いは、使用していることであるWebSocketUpgradeFilterあなたは、サーブレットのurl-pattern表記、またはURIテンプレート表記、あるいは正規表現の表記を使用して、WebSocketのエンドポイントの任意の数を指す複数のマッピングを持つことができます。

問題解決しない場合は、あなたがそれを行った後、あなたのクライアントは、どちらか送信しないように、それが聞こえるCookie桟橋が必要とするヘッダを、または間違った1送信(例:Cookie異なる/新しいにヘッダーポインティングをHttpSession参照)。

クライアントとサーバー間のトラフィック、クライアントへの注意を払うキャプチャCookie値、ならびに任意Set-Cookieのサーバーからの応答で見られた値を。

あなたは、代わりにだけアクティブダンプをフィルタすることができHttpSession、すべての要求の詳細を。ことを確認してくださいそれが示しHttpSession.getId()HttpSession.isNew()かつ(の組み合わせによって属性のすべてをダンプ.getAttributeNames()し、getAttribute(String name)通話)。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=339612&siteId=1