#angular #spring-boot #stompjs
#angular #весенняя загрузка #stompjs
Вопрос:
У меня есть приложения, которые StompJS подписывают сообщение с сервера ниже:
Клиент:
this.stompClient = this.createStormClient();
this.stompClient.connect(this.socket.header, frame => {
console.log(frame);
if (this.stompClient) {
this.stompClient.subscribe(`topic/hello`,(data:any) => {
console.log('subscribe hello finish.')
console.log(data);
});
}
});
createStormClient():any {
let ws = new SockJS('http://127.0.0.1:8084/api/websocket');
let stompClient = Stomp.over(ws);
return stompClient;
}
Сервер:
@Configuration
public class WebSocketAuthorizationSecurityConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer {
@Override
protected void configureInbound(final MessageSecurityMetadataSourceRegistry messages) {
// You can customize your authorization mapping here.
messages
.simpSubscribeDestMatchers("topic/hello").authenticated()
.anyMessage().authenticated();
}
// TODO: For test purpose (and simplicity) i disabled CSRF, but you should re-enable this and provide a CRSF endpoint.
@Override
protected boolean sameOriginDisabled() {
return true;
}
}
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer, ChannelInterceptor {
@Autowired
private JwtTokenUtil jwtTokenUtil;
@Autowired
private JwtUserDetailsService userSerive;
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic","/queue");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/api/websocket").setAllowedOrigins("*").withSockJS();
}
@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
registration.interceptors(new ChannelInterceptor() {
@Override
public Message<?> preSend(Message<?> message, MessageChannel channel) {
StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
if (StompCommand.CONNECT.equals(accessor.getCommand())) {
List<String> authorization = accessor.getNativeHeader("X-Authorization");
String accessToken = authorization.get(0);
if (accessToken != null amp;amp; accessToken.startsWith("Bearer ")) {
String jwtToken = accessToken.substring(7);
String userUrl = jwtTokenUtil.getUsernameFromToken(jwtToken);
if (!StringUtil.isEmpty(userUrl)) {
UserDetails userDetails = userSerive.loadUserByUsername(userUrl);
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(
userDetails, "", userDetails.getAuthorities());
accessor.setUser(authentication);
}
}
}
return message;
}
});
}
}
Контроллер отправляет сообщение
public class Controller {
@Autowired
private SimpMessagingTemplate template;
@RequestMapping(value = "/api/hello", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<?> newBook(@RequestBody Long id) {
try {
template.convertAndSend("topic/hello", "hello broker message");
return new ResponseEntity<Boolean>(true,HttpStatus.OK);
} catch(Exception ex) {
log.error("new quick book error" ex.getMessage());
return new ResponseEntity<>(HttpStatus.NOT_ACCEPTABLE);
}
}
}
консоль отображает фрейм:
[Журнал] Фрейм {команда: «ПОДКЛЮЧЕНО», заголовки: {имя пользователя: «7», частота сердечных сокращений: «0,0», версия: «1.1»}, тело: «», Строка: функция} (tabs-home-home-module.js , строка 293)
И подписаться:
>>> SUBSCRIBE
id:sub-0
destination:topic/hello
Сеть
a[«CONNECTED nversion: 1.1 nheart-beat: 0,0nuser-name: 7 n n u0000»]
[«SUBSCRIBE nid: sub-0ndestination:тема / привет n n u0000»]
Консоль не имеет моего ожидаемого значения внутри подписки
console.log('subscribe hello finish.')
console.log(data);
Ответ №1:
Это работа на
config.enableSimpleBroker(«тема»,»очередь»);
Ответ №2:
Возможно, ваш исходный код сработал. Я почти уверен, что ваша ошибка заключалась в названии темы:
this.stompClient.subscribe(`topic/hello`,(data:any) => {...
Вы должны были добавить fwd-косую черту к названию темы:
this.stompClient.subscribe(`/topic/hello`,(data:any) => {...