首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何关闭spring服务器中的

如何关闭spring服务器中的
EN

Stack Overflow用户
提问于 2016-03-04 19:37:33
回答 1查看 5K关注 0票数 8

我正在使用spring和spring消息传递(Version4.2.2.RELEASE)来使用功能齐全的代理(Apache 5.10.0)实现websocket上的STOMP。

我的客户只打算订阅目的地-也就是说,他们不应该能够发送消息。此外,我希望对我的客户可以订阅的目的地实施更严格的控制。在任何一种情况下(即当客户端试图发送消息或订阅无效的目的地时),我希望能够

  1. 发送适当的错误,和/或
  2. 关闭websocket

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

代码语言:javascript
复制
<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>
EN

回答 1

Stack Overflow用户

发布于 2016-03-05 20:36:28

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

代码语言:javascript
复制
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头和发送它的工作(我将尝试测试这一点并更新答案)。

代码语言:javascript
复制
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并返回框架。

代码语言:javascript
复制
@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将直接发送到客户端。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35804677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档