【问题标题】:Java websocket get custom header in onOpen functionJava websocket在onOpen函数中获取自定义标头
【发布时间】: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 中,我想将会话链接保存到标头值。但是我怎样才能访问它呢?

问候。

【问题讨论】:

    标签: java websocket


    【解决方案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");
      ..
      }
      

      【讨论】:

        猜你喜欢
        • 2017-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-18
        • 1970-01-01
        • 2014-10-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多