Я пытаюсь получить доступ к заголовкам HTTP (из исходного запроса на обновление https) в весенней службе веб-сокетов.
Насколько я понимаю, я должен иметь возможность сделать это с помощью HandshakeInterceptor.У меня есть перехватчик вроде:
public class WebsocketHandshakeInterceptor implements HandshakeInterceptor {
public WebsocketHandshakeInterceptor() {
}
@Override
public boolean beforeHandshake(
final ServerHttpRequest request,
final ServerHttpResponse response,
final WebSocketHandler wsHandler,
final Map<String, Object> attributes) throws Exception {
if (request instanceof ServletServerHttpRequest) {
ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request;
}
return true;
}
@Override
public void afterHandshake(
final ServerHttpRequest request,
final ServerHttpResponse response,
final WebSocketHandler wsHandler,
final Exception exception) {
}
}
Но оба объекта request
и servletRequest
имеют нулевые заголовки.Обратите внимание, что я получаю не cookie-файл сеанса, как в большинстве примеров, а другие заголовки.
У меня есть тестовый клиент, который делает запрос, подобный следующему:
WebSocketClient client = new StandardWebSocketClient();
WebSocketStompClient stompClient = new WebSocketStompClient(client);
StompSessionHandler sessionHandler = new TestClientStompSessionHandler(getObjectMapper());
final WebSocketHttpHeaders headers = new WebSocketHttpHeaders();
if (StringUtils.isNotBlank(token)) {
LOGGER.error("Adding header Authorization: Bearer " + token);
headers.add("Authorization", "Bearer " + token);
}
headers.add("X-Foo", "bar");
stompClient.connect(url, headers, sessionHandler);
Я уверен, что этодобавляет заголовки, потому что, если я запускаю через свой API-шлюз, для которого требуется токен-носитель, он работает (с действительным токеном)