gpt4 book ai didi

java - Spring websocket发送给特定的人

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:04:41 24 4
gpt4 key购买 nike

我已经为我的 spring-web 应用程序添加了基于自定义 token 的身份验证,并为 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);
});
});

我从我的 Controller 发送消息

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

对于身份验证 token 12345token,用户名为 user1。但是当我向 user1 发送消息时,客户端没有收到消息。我对此有什么遗漏吗?

最佳答案

在你的 Websocket Controller 中你应该做这样的事情:

@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”不在您的目标前缀中。您的问候消息被阻止,因为您在以/user 开头的队列中发送它们,并且此前缀未注册。

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

希望它有用!

关于java - Spring websocket发送给特定的人,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43198292/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com