在 Spring WebSocket 服务中访问 Http headers
Access Http headers in Spring WebSocket Service
我正在尝试在 spring websocket 服务中访问 HTTP headers(来自原始 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
objects 都为空 headers。请注意,我不是在 session cookie 之后,就像大多数示例一样,而是其他 headers.
我有一个测试客户端发出这样的请求:
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);
很确定它正在添加 headers 因为如果我 运行 通过我的 API 网关需要承载令牌然后它工作(使用有效令牌)
对不起,我的错。 headers 已填充,只是 Eclipse 中的调试器没有显示它们。或者我是盲人。或者两者兼而有之。
HttpHeaders headers = request.getHeaders();
给了我我需要的。
我正在尝试在 spring websocket 服务中访问 HTTP headers(来自原始 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
objects 都为空 headers。请注意,我不是在 session cookie 之后,就像大多数示例一样,而是其他 headers.
我有一个测试客户端发出这样的请求:
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);
很确定它正在添加 headers 因为如果我 运行 通过我的 API 网关需要承载令牌然后它工作(使用有效令牌)
对不起,我的错。 headers 已填充,只是 Eclipse 中的调试器没有显示它们。或者我是盲人。或者两者兼而有之。
HttpHeaders headers = request.getHeaders();
给了我我需要的。