Java websocket在onOpen函数中获取自定义标头
Posted
技术标签:
【中文标题】Java websocket在onOpen函数中获取自定义标头【英文标题】:Java websocket get custom header in onOpen function 【发布时间】:2015-11-06 14:59:22 【问题描述】:在我的 websocket 服务器中,我正在检索一个自定义标头,我不想链接到它来自的会话。我已经得到了一个工作的ServerEndpointConfig.Configurator
,它看起来像这样:
public class WebSocketConfig extends ServerEndpointConfig.Configurator
private static final Logger LOG = LoggerFactory.getLogger(WebSocketConfig.class);
@Override
public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response)
Map<String, List<String>> headers = request.getHeaders();
if (headers != null)
if (headers.containsKey("key"))
List<String> header = headers.get("key");
if (header.size() > 0)
LOG.info(header.get(0));
我的ServerEndpoint
看起来像这样:
@ServerEndpoint(value = "/websocket", configurator = WebSocketConfig.class)
public class WebSocket
private static final Logger LOG = LoggerFactory.getLogger(WebSocket.class);
public WebSocket()
@OnOpen
public void onOpen(Session session)
LOG.info("OnOpen");
@OnClose
public void onClose(Session session)
LOG.info("OnClose");
@OnMessage
public void onMessage(String message, Session session)
LOG.info("OnMessage: " + message);
在函数onOpen
中,我想将会话链接保存到标头值。但是我怎样才能访问它呢?
问候。
【问题讨论】:
【参考方案1】:我找到了解决我的问题的方法,我必须将路径参数放入路径。
不确定这是否是最佳解决方案。
@ServerEndpoint(value = "/websocket/key", configurator = WebSocketConfig.class)
public class WebSocket
private static final Logger LOG = LoggerFactory.getLogger(WebSocket.class);
public WebSocket()
@OnOpen
public void onOpen(Session session, @PathParam("key") String key)
LOG.info("OnOpen");
@OnClose
public void onClose(Session session)
LOG.info("OnClose");
@OnMessage
public void onMessage(String message, Session session)
LOG.info("OnMessage: " + message);
【讨论】:
【参考方案2】:根据 Oracle 文档https://docs.oracle.com/javaee/7/tutorial/websocket010.htm
您需要在自定义配置器中更新端点配置属性
conf.getUserProperties().put("key", value);
然后您可以稍后在 Endpoint 中访问它 公共类 MyEndpoint
@OnOpen
public void open(Session s, EndpointConfig conf)
String value = conf.getUserProperties().get("key");
..
【讨论】:
以上是关于Java websocket在onOpen函数中获取自定义标头的主要内容,如果未能解决你的问题,请参考以下文章
Java EE7 websocket 初始化 - 在第一个 @OnOpen 之前实现逻辑
Websocket 服务器问题:onOpen 命中客户端,但服务器 websocket 处理程序 OnOpen 和其他事件从未命中
javascript 在 onopen 事件中获取 websocket 错误