gpt4 book ai didi

java - 如何在 spring 服务器中关闭 STOMP websocket

转载 作者:搜寻专家 更新时间:2023-11-01 00:55:13 25 4
gpt4 key购买 nike


我正在使用 spring-websocket 和 spring-messaging(版本 4.2.2.RELEASE)通过功能齐全的代理(Apache ActiveMQ 5.10.0)通过 websockets 实现 STOMP。
我的客户只能订阅目的地——也就是说,他们不应该能够发送消息。此外,我想对我的客户可以订阅的目的地实现更严格的控制。在任何一种情况下(即当客户端尝试发送消息或订阅无效目的地时)我都希望能够

  1. 发送适当的错误,和/或
  2. 关闭网络套接字

请注意,我所有的目的地都转发到 ActiveMQ。我以为我可以实现 ChannelInterceptor在入站 channel 上,但查看 API 我无法弄清楚如何实现我想要的。这可能吗?验证客户端请求的最佳方法是什么?我的 websocket 配置如下:

<websocket:message-broker
application-destination-prefix="/app">
<websocket:stomp-endpoint path="/pushchannel"/>
<websocket:stomp-broker-relay relay-host="localhost"
relay-port="61613" prefix="/topic"
heartbeat-receive-interval="300000" heartbeat-send-interval="300000" />
<websocket:client-inbound-channel>
<websocket:interceptors>
<bean class="MyClientMessageInterceptor"/>
</websocket:interceptors>
</websocket:client-inbound-channel>
</websocket:message-broker>

最佳答案

您可以编写入站拦截器并向客户端发送适当的错误消息。

public class ClientInboundChannelInterceptor extends ChannelInterceptorAdapter {

@Autowired
private SimpMessagingTemplate simpMessagingTemplate;

@Override
public Message<?> preSend(Message message, MessageChannel channel) throws IllegalArgumentException{
StompHeaderAccessor headerAccessor = StompHeaderAccessor.wrap(message);
logger.debug("logging command " + headerAccessor.getCommand());
try {
//write your logic here
} catch (Exception e){
throw new MyCustomException();
}
}

}

更新:

1) 当您从 ClientInboundChannelInterceptor 抛出任何异常时,它将作为 ERROR 帧发送,您无需执行任何特殊操作。

2) 我不确定是否要关闭连接,但是做一些像创建 DISCONNECT header 并发送它应该可以工作(我会尝试测试这个并更新答案)。

SimpMessageHeaderAccessor headerAccessor = SimpMessageHeaderAccessor.create(SimpMessageType.DISCONNECT);
headerAccessor.setSessionId(sessionId);
headerAccessor.setLeaveMutable(true);

template.convertAndSendToUser(destination,new HashMap<>(),headerAccessor.getMessageHeaders());

您可以选择以下选项之一在订阅时发送错误。

1) 从 ClientInboundChannelInterceptor 中抛出异常。

2) 在您的 Handler/Controller 中,添加 @SubscribeMapping 并返回框架。

@SubscribeMapping("your destination")
public ConnectMessage handleSubscriptions(@DestinationVariable String userID, org.springframework.messaging.Message message){
// this is my custom class
ConnectMessage frame= new ConnectMessage();
// write your logic here
return frame;
}

frame 将直接发送给客户端。

关于java - 如何在 spring 服务器中关闭 STOMP websocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35804677/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com