我正在使用spring和spring消息传递(Version4.2.2.RELEASE)来使用功能齐全的代理(Apache 5.10.0)实现websocket上的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>发布于 2016-03-05 20:36:28
您可以编写入站拦截器并向客户端发送适当的错误消息。
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将直接发送到客户端。
https://stackoverflow.com/questions/35804677
复制相似问题