在Spring WebSocket Service中访问Http标头

时间:2019-06-12 10:59:38

标签: websocket spring-websocket

我正在尝试在春季websocket服务中访问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) {
  }
}

但是requestservletRequest对象都具有空标题。请注意,与大多数示例一样,我不是在会话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网关运行,那么它将起作用(带有有效令牌)

1 个答案:

答案 0 :(得分:0)

对不起,我不好。标头已填充,只是Eclipse中的调试器未显示标头。或者我是盲人。或两者兼有。

HttpHeaders headers = request.getHeaders();

给我我需要的东西。