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 之前实现逻辑

Java EE Websockets

Websocket 服务器问题:onOpen 命中客户端,但服务器 websocket 处理程序 OnOpen 和其他事件从未命中

javascript 在 onopen 事件中获取 websocket 错误

Rails WebSocket 客户端永远不会触发 OnOpen

Javascript Websocket onopen未被调用