https://*.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'