https://stackoverflow.com/questions/45281024/non-loopback-access-denied-error-while-configuring-spring-websocket-with-rabbitm

 

content-length=[26]} session=_system_ text/plain payload=non-loopback access denied


​ 第一:​

 

配置rabbitmq的配置文件: cat /etc/rabbitmq/conf.d/10-default-guest-user.conf 

追加:

loopback_users = none

另外追加用户,以及设定权限:

rabbitmqctl set_permissions dunkbird ".*" ".*" ".*"

rabbitmqctl add_user dunkbird 123456

rabbitmqctl set_user_tags dunkbird administrator

设定了tag可以进行登陆页面管理。

 

websocke 配置



@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

@Value("${application.stomp-broker-relay.host:localhost}")
private String stompBrokerRelayHost;

@Value("${application.stomp-broker-relay.port:61613}")
private Integer stompBrokerRelayPort;

@Value("${application.stomp-broker-relay.login}")
private String stompBrokerRelayLogin;

@Value("${application.stomp-broker-relay.passcode}")
private String stompBrokerRelayPasscode;

/**
* 注册 STOMP 协议端点。
* STOMP:Simple/Streaming Text Orientated Messaging Protocol。
*/
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
// 客户端连接端点
registry.addEndpoint("/stomp").withSockJS();
}

/**
* 设置 Message Broker 配置对象。
*/
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry
// 设置应用于所有 @MessageMapping 的前缀
.setApplicationDestinationPrefixes("/v1")
// 分隔符设置为句点
.setPathMatcher(new AntPathMatcher("."));

// 启用基于内存的 Message Broker
//registry.enableSimpleBroker("/topic");

// 启用基于 RabbitMQ 的 Message Broker
registry
.enableStompBrokerRelay("/topic")
.setRelayHost(stompBrokerRelayHost)
.setRelayPort(stompBrokerRelayPort)
.setClientLogin(stompBrokerRelayLogin)
.setClientPasscode(stompBrokerRelayPasscode)
.setSystemLogin(stompBrokerRelayLogin)
.setSystemPasscode(stompBrokerRelayPasscode);
}

/* 调试代码
@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
registration.interceptors(new ChannelInterceptor() {
@Override
public Message<?> preSend(Message<?> message, MessageChannel channel) {
log("I", "S", "PRE", message, channel);
return message;
}
@Override
public void postSend(Message<?> message, MessageChannel channel, boolean sent) {
Object destination = message.getHeaders().get("simpDestination");
if (sent && !ObjectUtils.isEmpty(destination)) {
redisTemplate.convertAndSend((String) destination, new String((byte[]) message.getPayload()));
}
log("I", "S", "PST", message, channel);
}
@Override
public boolean preReceive(MessageChannel channel) {
log("I", "R", "PRE", null, channel);
return true;
}
@Override
public Message<?> postReceive(Message<?> message, MessageChannel channel) {
log("I", "R", "PST", message, channel);
return message;
}
});
}

@Override
public void configureClientOutboundChannel(ChannelRegistration registration) {
registration.interceptors(new ChannelInterceptor() {
@Override
public Message<?> preSend(Message<?> message, MessageChannel channel) {
log("O", "S", "PRE", message, channel);
return message;
}
@Override
public void postSend(Message<?> message, MessageChannel channel, boolean sent) {
log("O", "S", "PST", message, channel);
}
@Override
public boolean preReceive(MessageChannel channel) {
log("O", "R", "PRE", null, channel);
return true;
}
@Override
public Message<?> postReceive(Message<?> message, MessageChannel channel) {
log("O", "R", "PST", message, channel);
return message;
}
});
}

private void log(String io, String when, String method, Message<?> message, MessageChannel channel) {
System.out.printf(
"[%s][%s][%s] TYPE: \u001B[96m%s\u001B[0m; COMMAND: \u001B[93m%s\u001B[0m; TOPIC: \u001B[92m%s\u001B[0m; MESSAGE: \u001B[94m%s\u001B[0m%n",
io, when, method,
message == null ? "<NULL>" : message.getHeaders().get("simpMessageType"),
message == null ? "<NULL>" : message.getHeaders().get("stompCommand"),
message == null ? "<NULL>" : message.getHeaders().get("simpDestination"),
message == null ? "<NULL>" : new String((byte[]) message.getPayload())
);
}
*/
}


  一定注意要设定下面的配置:

.setSystemLogin(stompBrokerRelayLogin)

.setSystemPasscode(stompBrokerRelayPasscode);

否则会报下面的错误!

Received ERROR {message=[Bad CONNECT], content-type=[text/plain], version=[1.0,1.1,1.2], content-length=[32]} session=_system_ text/plain payload=Access refused for user 'guest'