我在Spring4中使用内置的MessageBroker开发了一个实时通知系统,并在WebSocket上运行。
我想能够发送消息给一个特定的用户,根据他的用户名。为了实现这个目标,我使用了org的
类,如下所示:convertandtouser
方法。springframework。信息。辛普。SimpMessageTemplate
private final MessagingTemplate messagingTemplate;
@Autowired
public LRTStatusListener(SimpMessagingTemplate messagingTemplate) {
this.messagingTemplate = messagingTemplate;
}
@Scheduled(fixedDelay=5000)
public void sendMessages(Principal principal)
messagingTemplate
.convertAndSendToUser(principal.getName(), "/horray", "Horray, " + principal.getName() + "!");
}
作为配置:
@Configuration
@EnableScheduling
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/notifications").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic", "/queue", "/user");
}
}
客户端(通过JavaScript),我应该通过指定用户名订阅一个频道(根据另一个非常类似的问题:在SpringWebSocket上向特定用户发送消息)。
stompClient.subscribe('/user/' + username + '/horray, ...)
最后一点听起来很奇怪...
假设我在我的网络应用程序上以w.white的身份登录,通过订阅:
stompClient.subscribe('/user/w.white/horray, ...)
... 我将能够看到发送给w.white的消息,这太棒了。。。但订阅:
stompClient.subscribe('/user/j.pinkman/horray, ...)
... 我将能够看到发送给j.pinkman的消息,尽管我目前以w.white的身份登录。
这是克服这个问题的一种方法吗?
下面是关于WebSocket连接的日志:
Opening Web Socket...
Web Socket Opened...
>>> CONNECT
accept-version:1.1,1.0
heart-beat:10000,10000
<<< CONNECTED
user-name:w.white
heart-beat:0,0
version:1.1
connected to server undefined
Connected: CONNECTED
version:1.1
heart-beat:0,0
user-name:w.white
>>> SUBSCRIBE
id:sub-0
destination:/topic/lrt
>>> SUBSCRIBE
id:sub-1
destination:/user/lrt
由于我的应用程序上的用户没有经过身份验证,我只是使用会话Id来区分不同的主题
在服务器上:
template.convertAndSend("/topic/warnings/" + sessionId, ...)
客户非常直截了当
stompClient.subscribe('/topic/warnings/${pageContext.session.id}', ...
也许不是最干净的方式,但它可以工作,没有身份验证,我无法使用/user通道
我找到了解决办法。
首先,重要的是要知道,/user
频道已经由Spring STOMP管理,顺便说一句,不需要注册。
因此:
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic", "/queue");
}
然后,我将目标频道设置为/queue/horray
:
@Scheduled(fixedDelay=5000)
public void sendMessages(Principal principal)
messagingTemplate
.convertAndSendToUser(principal.getName(), "/queue/horray", "Horray, " + principal.getName() + "!");
}
最后,在客户端:
stompClient.subscribe('/user/queue/horray', '...');
现在,它工作得很好!根据安全上下文获取的主体
,消息仅发送给指定的收件人。
我使用本教程中描述的spring设置了一个WebSocket:https://spring.io/guides/gs/messaging-stomp-websocket/。我需要的是我的服务器每5秒向特定用户发出一条消息。所以我首先做了这个: 而且起作用了。现在,为了只向特定用户发送消息,我更改了以下内容: 在WebSocketConfig.java中添加队列: 更改GreetingControl
问题内容: 如何仅从服务器向特定用户发送websocket消息? 我的webapp具有spring安全设置,并使用websocket。我在尝试仅从服务器向特定用户发送消息时遇到棘手的问题。 通过阅读手册,我的理解是来自我们可以做的服务器 在客户端: 但是我永远无法调用订阅回调。我尝试了许多不同的方法,但是没有运气。 如果我将其发送到/ topic / reply,它可以工作,但所有其他已连接用户也
如何仅将websocket消息从服务器发送给特定用户? 我的webapp具有Spring Security设置,并使用websocket。我在尝试只从服务器向特定用户发送消息时遇到了一个棘手的问题。 从阅读手册中我的理解是从服务器上我们可以做到的 在客户端: 但是我永远无法调用订阅回调。我尝试了许多不同的道路,但没有运气。 如果我将它发送到/topic/reply,它会工作,但所有其他连接的用户也
我是新手。NET(C#)和WebSocket。。。我已经安装了VS2012和Windows Server 2012,并且已经启动并运行了WebSocket。我似乎无法从一个套接字接收消息并将其发送到另一个特定的套接字。唯一的选择似乎是向所有套接字广播消息。有没有一种方法可以将消息只发送给特定的用户?我希望聊天室主持人有机会拒绝不适当的帖子。
我正在尝试使用SpringWebSocket和stomp创建一个聊天应用程序 我正在使用Spring 4.1.1,Stomp。js,ActiveMQ 5.9 在此用户可以通过登录应用程序向他/她的每个朋友发送消息,这些朋友也已登录。为了向特定用户发送消息,我采取以下步骤: 1)用户登录 2)用户订阅“/user/queue/messaging”目的地 这将用于相互发送用户的私人消息 3)当用户想要
我正在阅读《Spring in Action4》一书,以使用WebSocket上的STOMP消息传递。 假设,如下所示: 然后客户端使用以下JavaScript代码订阅目标: 则该消息将发送到目的地,如下所示: 那么,两个目的地和看起来是不同的,消息怎么可能到达客户端呢?