如何使用 Tyrus java 客户端在初始 WebSocket 客户端请求中包含 cookie?

Posted

技术标签:

【中文标题】如何使用 Tyrus java 客户端在初始 WebSocket 客户端请求中包含 cookie?【英文标题】:How to include a cookie in the initial WebSocket client request using Tyrus java client? 【发布时间】:2015-01-26 00:31:00 【问题描述】:

我正在使用 Tyrus 客户端包从我的 Java 应用程序中使用一个 websocket 端点,该端点在初始客户端请求中需要一个 cookie 标头。浏览 Tyrus 客户端 API 文档和 Google 并没有让我走得太远。有什么想法可以做到这一点吗?

【问题讨论】:

【参考方案1】:

找到了解决我自己问题的方法,所以想分享一下。解决方案是在 ClientEndpointConfig 上设置一个自定义配置器,并覆盖该配置器中的 beforeRequest 方法以添加 cookie 标头。

例如:

ClientEndpointConfig cec = ClientEndpointConfig.Builder.create()
    .configurator(new ClientEndpointConfig.Configurator() 
        @Override
        public void beforeRequest(Map<String, List<String>> headers) 
            super.beforeRequest(headers);
            List<String> cookieList = headers.get("Cookie");
            if (null == cookieList) 
                cookieList = new ArrayList<>();
            
            cookieList.add("foo=\"bar\"");     // set your cookie value here
            headers.put("Cookie", cookieList);
        
    ).build();

然后在您对ClientManager.connectToServerClientManager.asyncConnectToServer 的后续调用中使用此ClientEndpointConfig 对象。

【讨论】:

这对我来说不适用于多个 cookie,因为 cookie 将用逗号分隔。但必须用分号隔开。【参考方案2】:

为了处理 tyrus 库中多个 cookie 的错误,我的解决方案如下:

        ClientEndpointConfig.Configurator configurator = new ClientEndpointConfig.Configurator() 
            @Override
            public void beforeRequest( Map<String, List<String>> headers ) 
                // A bug in the tyrus library let concat multiple headers with a comma. This is wrong for cookies which needs to concat via semicolon
                List<String> cookies = getMyCookies();
                StringBuilder builder = new StringBuilder();
                for( String cookie : cookies ) 
                    if( builder.length() > 0 ) 
                        builder.append( "; " ); // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cookie
                    
                    builder.append( cookie );
                
                headers.put( "Cookie", Arrays.asList( builder.toString() ) );
            
        ;

【讨论】:

以上是关于如何使用 Tyrus java 客户端在初始 WebSocket 客户端请求中包含 cookie?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Tyrus javax.websocket 的 Java Websocket 客户端?

Tyrus - 存储客户端收到的消息

tyrus websocket connectToServer - 如何清理守护线程

无法将传入缓冲区大小设置为 Tyrus 客户端

如何使Websocket同步

Tyrus 端点阻止 Glassfish (Payara) 中的线程