当前位置: 首页 > 面试题库 >

Spring WebSocket发送给特定的人

长孙鸿波
2023-03-14
问题内容

我为spring-web应用程序添加了基于自定义令牌的身份验证,并将其扩展到spring websocket,如下所示

public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic", "/queue");
        config.setApplicationDestinationPrefixes("/app");
        config.setUserDestinationPrefix("/user");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/gs-guide-websocket").setAllowedOrigins("*").withSockJS();
    }

    @Override
      public void configureClientInboundChannel(ChannelRegistration registration) {
        registration.setInterceptors(new ChannelInterceptorAdapter() {

            @Override
            public Message<?> preSend(Message<?> message, MessageChannel channel) {

                StompHeaderAccessor accessor =
                    MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);

                if (StompCommand.CONNECT.equals(accessor.getCommand())) {
                    String jwtToken = accessor.getFirstNativeHeader("Auth-Token");
                        if (!StringUtils.isEmpty(jwtToken)) {
                            Authentication auth = tokenService.retrieveUserAuthToken(jwtToken);
                            SecurityContextHolder.getContext().setAuthentication(auth);
                            accessor.setUser(auth);
                            //for Auth-Token '12345token' the user name is 'user1' as auth.getName() returns 'user1'
                        }
                }

                return message;
            }
        });
      }
}

连接到套接字的客户端代码是

var socket = new SockJS('http://localhost:8080/gs-guide-websocket');
    stompClient = Stomp.over(socket);
    stompClient.connect({'Auth-Token': '12345token'}, function (frame) {
        stompClient.subscribe('/user/queue/greetings', function (greeting) {
            alert(greeting.body);
        });
    });

从我的控制器发送消息为

messagingTemplate.convertAndSendToUser("user1", "/queue/greetings", "Hi User1");

对于auth令牌12345token,用户名是user1。但是,当我向发送消息时user1,它在客户端未收到。我有什么想念的吗?


问题答案:

在您的Websocket控制器中,您应该执行以下操作:

@Controller
public class GreetingController {

    @Autowired
    private SimpMessagingTemplate messagingTemplate;

    @MessageMapping("/hello")
    public void greeting(Principal principal, HelloMessage message) throws  Exception {
        Greeting greeting = new Greeting();
        greeting.setContent("Hello!");
        messagingTemplate.convertAndSendToUser(message.getToUser(), "/queue/reply", greeting);
    }
}

在客户端,您的用户应订阅主题/ user / queue / reply。

您还必须添加一些目标前缀:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic", "/queue" ,"/user");
        config.setApplicationDestinationPrefixes("/app");
        config.setUserDestinationPrefix("/user");
    }
/*...*/
}

当服务器在/ app / hello队列上收到消息时,它应该向dto中的用户发送消息。用户必须等于用户的主体。

我认为您代码中的唯一问题是您的“ /用户”不在目标前缀中。您的问候语消息被阻止,因为您将其发送到以/ user开头的队列中,并且未注册此前缀。

您可以在git repo上查看源代码:https : //github.com/simvetanylen/test-spring-
websocket

希望它能起作用!



 类似资料:
  • 我相信,当当前用户访问经过身份验证的URL时,可以获取他们的信息,但是为每个登录用户存储所有接收器的方法是什么呢? 我很感激。

  • 我正在尝试使用我在这里找到的方法在Spring框架上设置基本的MessageBroker 作者声称它工作得很好,但我无法在客户端接收消息,尽管没有发现可见的错误。 目标: 我尝试做的基本上是相同的-客户端连接到服务器并请求一些异步操作。操作完成后,客户端应收到一个事件。重要提示:客户机未通过Spring的身份验证,但来自MessageBroker异步后端部分的事件包含他的登录名,因此我假设它足以存

  • 我是新手。NET(C#)和WebSocket。。。我已经安装了VS2012和Windows Server 2012,并且已经启动并运行了WebSocket。我似乎无法从一个套接字接收消息并将其发送到另一个特定的套接字。唯一的选择似乎是向所有套接字广播消息。有没有一种方法可以将消息只发送给特定的用户?我希望聊天室主持人有机会拒绝不适当的帖子。

  • 好的,我对网络服务完全陌生,对于我正在做的一个项目,我试图了解整个SOAP。我想我对正在发生的事情有一个模糊的理解,但是我缺少一些具体的信息,我在谷歌上找不到任何有用的东西。 我已经阅读了其他人提出的问题,例如使用java向Web服务发出的SOAP请求,但我仍然无法完全弄清楚发生了什么。 具体来说,我尝试使用这里提供的服务http://ec.europa.eu/taxation_customs/v

  • 我使用Spring的STOMP over WebSocket实现与一个全功能的ActiveMQ代理。当用户向主题订阅时,在成功订阅之前必须通过一些权限逻辑。我使用ChannelInterceptor应用权限逻辑,如下所示: WebSocketConfig。爪哇: WebSocketSecurityConfig.java: MySubscriptionInterceptor。爪哇: 当没有足够权限的

  • 我环顾四周,了解了工作流程,并在内容编辑方面实施了步骤,但没有看到我如何将角色限制为步骤。简而言之,我希望我的大部分用户能够编辑,然后提交审批,但不能发布(保存)。然后我需要几个“全球/超级”用户成为唯一能够批准并实时发布内容的人。这将适用于新页面,编辑现有页面,基本上一切。可以编辑和保存以供批准的用户。如果他们批准,可以发布的超级用户。