【发布时间】:2015-08-30 02:04:24
【问题描述】:
有没有办法在Spring中拦截STOMPCONNECT框架,在某些情况下拒绝呢?
拦截本身可以使用SessionConnectEvent 完成,但我想根据标头允许或拒绝连接。我不能在SessionConnectEvent 监听器中做到这一点。
【问题讨论】:
标签: spring stomp spring-websocket
有没有办法在Spring中拦截STOMPCONNECT框架,在某些情况下拒绝呢?
拦截本身可以使用SessionConnectEvent 完成,但我想根据标头允许或拒绝连接。我不能在SessionConnectEvent 监听器中做到这一点。
【问题讨论】:
标签: spring stomp spring-websocket
如果我们查看StompSubProtocolHandler 代码,我们会看到:
try {
SimpAttributesContextHolder.setAttributesFromMessage(message);
if (this.eventPublisher != null) {
if (StompCommand.CONNECT.equals(headerAccessor.getCommand())) {
publishEvent(new SessionConnectEvent(this, message, user));
}
........
outputChannel.send(message);
}
因此,CONNECT 帧不仅作为SessionConnectEvent 发出,而且还发送到clientInboundChannel。
因此,您需要满足您的要求,只需提供一个自定义 ChannelInterceptor 和 preSend 实现并将其注册为覆盖 WebSocketMessageBrokerConfigurer.configureClientInboundChannel。
【讨论】:
ChannelInterceptor,但看起来CONNECT 帧没有被截获......可能我做错了什么。阅读您的答案后,我再次尝试并成功了。谢谢你。我不喜欢ChannelInterceptor 的唯一原因是它在每一帧上都被调用,而我只需要拦截CONNECT 帧。无论如何,该解决方案符合我的要求。