java - Spring WebSocket convertAndSendToUser 不起作用
问题描述
我正在尝试向特定用户发送消息。我不能使用 @SendToUser 注释,因为在我的应用程序中,将通过套接字发送的消息将来自另一个服务而不是 ui。因此,我正在管理会话用户映射。我尝试了在互联网上找到的所有可能的 url 组合。我找不到问题。代码如下所示。
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(); });
});
解决方案
推荐阅读
- reactjs - 使用 react redux axios 在 FormData 上创建具有更改输入表单或条件的新状态对象
- macos - VMware Fusion 11 macOS monterey:来宾操作系统上无法访问互联网
- oracle - 使用 TO_CHAR 或 TO_NUMBER 时,实体框架生成的查询抛出 ORA-12704
- python - python plotly - 悬停有时会显示多个值
- python - 响应正文始终为空,但响应代码为 200,同时从网络服务器获取 JSON 响应
- jmeter - 如何在 JSR223 预处理器中修改 json
- spring-boot - Spring Boot 与外部 tomcat 设置上下文路径的战争
- php - 当我没有收到验证码时,如何验证我的 Gmail Oauth 流程?
- r - 使用 purrr 有效计算大型数据框中的正则表达式匹配
- c# - 为什么将 ViewModel 传递给 View 时会出现此错误?