访问WebSocketServlet(Jetty WebSockets)的HttpServlet中设置的会话属性

时间:2020-03-19 08:46:10

标签: java kotlin servlets jetty embedded-jetty

我正在尝试从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

1 个答案:

答案 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)调用的组合)。

相关问题