Java 使用rabbitmq配置Spring websocket时出现拒绝非环回访问错误
我正在构建一个SpringWebSocket应用程序,该应用程序使用RabbitMQ作为消息代理 下面提供了配置文件Java 使用rabbitmq配置Spring websocket时出现拒绝非环回访问错误,java,spring-websocket,Java,Spring Websocket,我正在构建一个SpringWebSocket应用程序,该应用程序使用RabbitMQ作为消息代理 下面提供了配置文件 @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistr
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableStompBrokerRelay("/topic")
.setRelayHost("192.168.1.8")
.setRelayPort(61613)
.setClientLogin("user")
.setClientPasscode("user");
//config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/gs-guide-websocket").setAllowedOrigins("*").withSockJS();
}
}
但是当我运行应用程序时,它会给我以下错误
Received ERROR {message=[Bad CONNECT], content-type=[text/plain], version=[1.0,1.1,1.2],
content-length=[26]} session=_system_ text/plain payload=non-loopback access denied
我已尝试在rabbitmq中授予所需的权限
sudo rabbitmqctl set_permissions -p / user ".*" ".*" ".*"
但问题还是出现了。但是如果我用“localhost”或“127.0.0.1”替换“setRelayHost(..)”中的ipaddress,应用程序就可以正常工作 RabbitMQ允许您将用户配置为只能通过环回接口(localhost)进行连接,这也是默认用户的情况。检查您的用户是否在配置文件中的
环回\u users
属性下配置,或者这是否是默认用户
请同时检查我遇到了这个问题,经过两个小时的搜索,我可以解决它。 首先,我应该从
StompBrokerRelayMessageHandler
这里带来一些代码:
@Override
protected void startInternal() {
if (this.tcpClient == null) {
StompDecoder decoder = new StompDecoder();
decoder.setHeaderInitializer(getHeaderInitializer());
Reactor2StompCodec codec = new Reactor2StompCodec(new StompEncoder(), decoder);
this.tcpClient = new StompTcpClientFactory().create(this.relayHost, this.relayPort, codec);
}
if (logger.isInfoEnabled()) {
logger.info("Connecting \"system\" session to " + this.relayHost + ":" + this.relayPort);
}
StompHeaderAccessor accessor = StompHeaderAccessor.create(StompCommand.CONNECT);
accessor.setAcceptVersion("1.1,1.2");
accessor.setLogin(this.systemLogin);
accessor.setPasscode(this.systemPasscode);
accessor.setHeartbeat(this.systemHeartbeatSendInterval, this.systemHeartbeatReceiveInterval);
accessor.setHost(getVirtualHost());
accessor.setSessionId(SYSTEM_SESSION_ID);
if (logger.isDebugEnabled()) {
logger.debug("Forwarding " + accessor.getShortLogMessage(EMPTY_PAYLOAD));
}
SystemStompConnectionHandler handler = new SystemStompConnectionHandler(accessor);
this.connectionHandlers.put(handler.getSessionId(), handler);
this.stats.incrementConnectCount();
this.tcpClient.connect(handler, new FixedIntervalReconnectStrategy(5000));
}
因此,正如您在这些行中看到的:
accessor.setLogin(this.systemLogin);
accessor.setPasscode(this.systemPasscode);
它使用systemLogin
和systemPasscode
登录rabbitmq服务器。
这些参数的默认值为“guest”,在类的顶部定义:
private String systemLogin = "guest";
private String systemPasscode = "guest";
使用“来宾”用户,您可以在localhost中登录系统
因此,您应该在配置中设置这些参数:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableStompBrokerRelay("/topic")
.setRelayHost("192.168.1.8")
.setRelayPort(61613)
.setClientLogin("user")
.setClientPasscode("user")
.setSystemLogin("user")
.setSystemPasscode("user");
//config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/gs-guide-websocket").setAllowedOrigins("*").withSockJS();
}
}
在此配置之后,如果运行此命令:
sudo rabbitmqctl set_permissions -p / user ".*" ".*" ".*"
一切都很顺利。这个问题解决了吗?我也有同样的问题