[英]How to close a STOMP websocket in a spring server
我正在使用spring-websocket和spring-messaging(版本4.2.2.RELEASE)通过功能齐全的代理(Apache ActiveMQ 5.10.0)在websockets上实现STOMP。
我的客户只想订阅目的地 - 也就是说他们不应该发送消息。 此外,我想对客户可以订阅的目的地实施更严格的控制。 在任何一种情况下(即客户端尝试发送消息或订阅无效目的地)我希望能够
请注意,我的所有目的地都转发给ActiveMQ。 我认为我可以在入站通道上实现ChannelInterceptor ,但是看看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
标头和发送它应该工作(我将尝试测试这个并更新答案)。
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
将直接发送给客户。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.