Существует ли реализация Java STOMP WebSocket на Java поверх существующего экземпляра Java HttpClient?Я управляю своим сеансом через Apache HttpClient и хотел бы повторно использовать его для подключения к WebSocket.У меня есть сервер Spring MVC 4, слушающий STOMP SockJS, и из браузера все работает отлично, через http, https, все хорошо.Но когда я ставлю Android или другие клиенты, у меня возникает проблема, потому что мой сеанс HttpClient для обычных запросов не используется для моего соединения WebSocket, поэтому я не могу поделиться сессией.
Кто-нибудь знает, какзаставить его работать?Я уже попробовал com.github.forresthopkinsa: StompProtocolAndroid, добавив идентификатор сессии и запомнив мне токен на заголовках, но ничего не работает, мои запросы не поступают на мой контроллер и выдают ошибку (ниже).Позвольте вам код:
Конфигурация сервера Spring MVC 4 (dispatcher-servlet.xml)
...
<websocket:message-broker application-destination-prefix="/auction">
<websocket:stomp-endpoint path="/auction" allowed-origins="*">
<websocket:sockjs />
</websocket:stomp-endpoint>
<websocket:simple-broker prefix="" />
</websocket:message-broker>
...
Сервер AuctionWebSocketController
@Controller
@RequestMapping(value = "/auction")
public class AuctionWebSocketController {
...
@MessageMapping(value = "/{id}/bid/{value}")
@SendTo("/auction/{id}")
public ResponseEntity<Bid> bid(
@DestinationVariable(value = "id") Long adId,
@DestinationVariable(value = "value") Double value,
Principal principal){
// my logic, but never reaches from Android client!
return result;
}
}
Android-клиент
mStompClient = Stomp.over(
Stomp.ConnectionProvider.OKHTTP,
"/auction",
HttpHelper.getCookiesMap()); // these are the cookies/headers from HttpClient
mStompClient.topic("/auction/1").subscribe(topicMessage -> {
// parse messages and do my things
});
mStompClient.connect(mCookieMap); // mCookieMap are HttpClient cookies again
List<StompHeader> stompHeaders = new ArrayList<>();
// here I add my HttpClient headers again
stompHeaders.add(new StompHeader(StompHeader.DESTINATION, '/auction/1/bid/50'));
StompMessage msg = new StompMessage(StompCommand.SEND, stompHeaders, "");
mStompClient.send(msg).subscribe(
() -> Log.d(TAG, "Sent data!"),
error -> Log.e(TAG, "Encountered error while sending data!", error)
);
Все отлично работает, но когда я звоню mStompClient.send , на стороне сервера я получаю ошибку:
[2018-10-18 16:27:29,783] [ERROR] org.springframework.web.socket.messaging.WebSocketAnnotationMethodMessageHandler | Unhandled exception from message handler method
org.springframework.messaging.simp.annotation.support.MissingSessionUserException: No "user" header in message, failedMessage=GenericMessage [payload=byte[21], headers={simpMessageType=MESSAGE, stompCommand=SEND, nativeHeaders={JSESSIONID=[38E2085A76A2F1447A9CC0C472052C62], remember-me=[M2pZT2swOXhTZjB6REJzOFRoMFJzdz09OnlzUnZNbHgwcGRCclVrUDAvSmQ3Qmc9PQ, NkdtVWxvY25LWmFkVytOQ3V6b3hvUT09OjBYNTMvajJvYW9hN3RaWjlSMkZpaFE9PQ], destination=[/auction/174/bid/66.0], heart-beat=[10000]}, DestinationVariableMethodArgumentResolver.templateVariables={id=174, value=66.0}, simpSessionAttributes={}, simpHeartbeat=[J@416ef33f, lookupDestination=/174/bid/66.0, simpSessionId=1, simpDestination=/auction/174/bid/66.0}]
at org.springframework.messaging.simp.annotation.support.PrincipalMethodArgumentResolver.resolveArgument(PrincipalMethodArgumentResolver.java:42)
at org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:112)
at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:135)
at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:107)
at org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMatch(AbstractMethodMessageHandler.java:502)
at org.springframework.messaging.simp.annotation.support.SimpAnnotationMethodMessageHandler.handleMatch(SimpAnnotationMethodMessageHandler.java:497)
at org.springframework.messaging.simp.annotation.support.SimpAnnotationMethodMessageHandler.handleMatch(SimpAnnotationMethodMessageHandler.java:87)
at org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMessageInternal(AbstractMethodMessageHandler.java:461)
at org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMessage(AbstractMethodMessageHandler.java:399)
at org.springframework.messaging.support.ExecutorSubscribableChannel$SendTask.run(ExecutorSubscribableChannel.java:135)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Любая помощь?Мне интересно, кто и приложение, интегрированное с чатом / функцией реального времени, работает с аутентификацией.