我正在尝试从HttpServlet
访问WebSocketServlet
中设置的会话属性
我有两个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
的{{1}}的{{1}}的第一行检查请求是否为WebSocket升级请求,如果是,则立即返回(在这种情况下,该请求已移交给{ {1}代表ServletContextHandler
)。
我有一个简单的HttpHandler
端点,该端点设置了会话属性,但是我无法在ServletContextHandler
中检索此会话属性:
WebSocketServlet
欢迎任何建议。
编辑:在调用POST
之后,我已经从GET请求和WebSocket请求中包含了一些调试信息:
WebSocketServlet
答案 0 :(得分:1)
首先,摆脱2 ServletContextHandler
,使用一个。无论如何,您不能在同一个contextPath上有两个处理程序。
此外,您还可以使用两种主要方法来实现Jetty Server WebSocket,即使用WebSocketServlet
或使用WebSocketUpgradeFilter
。最大的区别在于,使用WebSocketUpgradeFilter
可以使用Servlet url-pattern表示法,URI模板表示法甚至是regex表示法来指向多个WebSocket端点的多个映射。
如果在执行此操作后问题仍然存在,则听起来客户端没有发送Jetty所需的Cookie
标头,或者发送了错误的标头(例如:指向以下内容的Cookie
标头)一个不同的/新的HttpSession
参考)。
捕获客户端和服务器之间的流量,注意客户端的Cookie
值以及服务器响应中看到的任何Set-Cookie
值。
您也可以选择一个过滤器,该过滤器仅转储每个请求的有效HttpSession
详细信息。确保它显示HttpSession.getId()
,HttpSession.isNew()
并转储所有属性(通过.getAttributeNames()
和getAttribute(String name)
调用的组合)。