Как отправить сообщение ERROR клиентам STOMP с помощью Spring WebSocket?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Гость
 Как отправить сообщение ERROR клиентам STOMP с помощью Spring WebSocket?

Сообщение Гость »

Я использую реализацию Spring STOMP поверх WebSocket с полнофункциональным брокером ActiveMQ. Когда пользователи ПОДПИСЫВАЮТСЯ на тему, существует определенная логика разрешений, через которые они должны пройти, прежде чем успешно подписаться. Я использую ChannelInterceptor для применения логики разрешений, как настроено ниже:

WebSocketConfig.java:

Код: Выделить всё

@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/stomp")
.setAllowedOrigins("*")
.withSockJS();
}

@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableStompBrokerRelay("/topic", "/queue")
.setRelayHost("relayhost.mydomain.com")
.setRelayPort(61613);
}

@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
registration.setInterceptors(new MySubscriptionInterceptor());
}

}
WebSocketSecurityConfig.java:

Код: Выделить всё

public class WebSocketSecurityConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer {

@Override
protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) {
messages
.simpSubscribeDestMatchers("/stomp/**").authenticated()
.simpSubscribeDestMatchers("/user/queue/errors").authenticated()
.anyMessage().denyAll();
}

}
MySubscriptionInterceptor.java:

Код: Выделить всё

public class MySubscriptionInterceptor extends ChannelInterceptorAdapter {

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

StompHeaderAccessor headerAccessor= StompHeaderAccessor.wrap(message);
Principal principal = headerAccessor.getUser();

if (StompCommand.SUBSCRIBE.equals(headerAccessor.getCommand())) {
checkPermissions(principal);
}

return message;
}

private void checkPermissions(Principal principal) {
// apply permissions logic
// throw Exception permissions not sufficient
}
}
Когда клиенты, не имеющие соответствующих разрешений, пытаются подписаться на тему с ограниченным доступом, они фактически никогда не получают никаких сообщений из этой темы, НО также не уведомляются об исключении, которое было брошенный, который отклонил их подписку. Вместо этого клиенту возвращается неработающая подписка, о которой брокер ActiveMQ ничего не знает. (Обычное взаимодействие клиента с соответствующими разрешениями с конечной точкой STOMP и темами работает так, как ожидалось.)

Я пробовал подписаться на пользователей/{subscribeingUsername}/queue/errors< /code> и просто пользователи/очередь/ошибки с моим тестовым клиентом Java после его успешного подключения, но до сих пор мне не удалось получить сообщение об ошибке об исключении подписки с сервера, доставленное клиенту. . Это явно не идеально, поскольку клиенты никогда не уведомляются о том, что им отказано в доступе.

Источник: https://stackoverflow.com/questions/337 ... -websocket
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»