私がアクセスセッションにしようとしているがにセット属性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
。最初の行doHandle
のServletContextHandler
ための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: {}
まず、あなたの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)
通話)。