Как включить файл cookie в первоначальный запрос клиента WebSocket с помощью Java-клиента Tyrus?

Я использую клиентский пакет Tyrus для использования из моего Java-приложения конечной точки веб-сокета, для которой требуется заголовок cookie в исходном клиентском запросе. Просмотр документов API клиента Tyrus и поиск в Google не зашли слишком далеко. Есть идеи, как можно это сделать?


person Balthorium    schedule 26.01.2015    source источник


Ответы (2)


Нашел решение своего вопроса, поэтому решил поделиться. Решение состоит в том, чтобы установить собственный конфигуратор в 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();

Затем используйте этот объект ClientEndpointConfig в последующем вызове ClientManager.connectToServer или ClientManager.asyncConnectToServer.

person Balthorium    schedule 26.01.2015
comment
Это не работает с несколькими файлами cookie для меня, потому что файлы cookie будут разделены запятыми. Но это должно быть разделено через точку с запятой. - person Horcrux7; 08.03.2018

Чтобы справиться с ошибкой с несколькими файлами cookie в библиотеке tyrus, мое решение выглядит так:

        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() ) );
            }
        };
person Horcrux7    schedule 08.03.2018