Я пытаюсь отправить сообщения определенным c пользователям. Я не могу использовать аннотацию @SendToUser, потому что в моем приложении сообщение, которое будет отправлено через сокет, будет приходить из другой службы, а не из пользовательского интерфейса. Поэтому я управляю отображением сеанса и пользователя. Я перепробовал все возможные комбинации URL, которые я нашел в inte rnet. Я не могу найти проблему. Код показан ниже.
WebSocketConfig. java
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/user/queue/specific-user");
config.setApplicationDestinationPrefixes("/app");
config.setUserDestinationPrefix("/user");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/gs-guide-websocket").withSockJS()
.setInterceptors(new HttpHandshakeInterceptor(this.socketStore()));
}
HttpHandshakeInterceptor. java
public class HttpHandshakeInterceptor implements HandshakeInterceptor{
private SocketStore socketStore;
public HttpHandshakeInterceptor(SocketStore socketStore) {
this.socketStore = socketStore;
}
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
Map<String, Object> attributes) throws Exception {
if(request instanceof ServletServerHttpRequest)
{
ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request;
String abc = servletRequest.getServletRequest().getHeader("token");
HttpSession session = servletRequest.getServletRequest().getSession();
}
return true;
}
@Override
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
Exception exception) {
// TODO Auto-generated method stub
}
}
GreetingController. java
@Controller
public class GreetingController {
@Autowired
private SocketStore socketStore;
@Autowired
private SimpMessageSendingOperations messagingTemplate;
@MessageMapping("/hello")
public void processMessageFromClient(HelloMessage message, SimpMessageHeaderAccessor headerAccessor,
@Header("simpSessionId") String sessionId2) throws Exception {
String sessionId = headerAccessor.getSessionAttributes().get("sessionId").toString();
messagingTemplate.convertAndSendToUser(sessionId, "/queue/specific-user",new Greeting("Hello, " + HtmlUtils.htmlEscape(message.getName()) + "!"), createHeaders(sessionId));
private MessageHeaders createHeaders(String sessionId) {
SimpMessageHeaderAccessor headerAccessor = SimpMessageHeaderAccessor.create(SimpMessageType.MESSAGE);
headerAccessor.setSessionId(sessionId);
headerAccessor.setLeaveMutable(true);
return headerAccessor.getMessageHeaders();
}
}
приложение. js
var stompClient = null;
function setConnected(connected) {
$("#connect").prop("disabled", connected);
$("#disconnect").prop("disabled", !connected);
if (connected) {
$("#conversation").show();
}
else {
$("#conversation").hide();
}
$("#greetings").html("");
}
function connect() {
var socket = new SockJS('/gs-guide-websocket');
stompClient = Stomp.over(socket);
var random = Math.floor(Math.random() * 11);
stompClient.connect({'token':random}, function (frame) {
setConnected(true);
console.log('Connected: ' + frame);
stompClient.subscribe('/user/queue/specific-user', function (greeting) {
showGreeting(JSON.parse(greeting.body).content);
});
});
}
function disconnect() {
if (stompClient !== null) {
stompClient.disconnect();
}
setConnected(false);
console.log("Disconnected");
}
function sendName() {
stompClient.send("/app/hello", {}, JSON.stringify({'name': $("#name").val()}));
}
function showGreeting(message) {
$("#greetings").append("<tr><td>" + message + "</td></tr>");
}
$(function () {
$("form").on('submit', function (e) {
e.preventDefault();
});
$( "#connect" ).click(function() { connect(); });
$( "#disconnect" ).click(function() { disconnect(); });
$( "#send" ).click(function() { sendName(); });
});