ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

rabbitmq websocket stomp 错误payload=Access refused for user 'guest'

2021-08-20 11:01:38  阅读:441  来源: 互联网

标签:websocket guest stomp public Override Message MessageChannel message channel


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'

标签:websocket,guest,stomp,public,Override,Message,MessageChannel,message,channel
来源: https://www.cnblogs.com/dunkbird/p/15165501.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有