Spring Websocket с SockJS потерял соединение - PullRequest
0 голосов
/ 16 марта 2019

Я разрабатываю веб-приложение, используя пружинную загрузку, angular cli и sockjs.

Реализация WebSocket:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer {

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

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/info", "/user", "/notif");
        registry.setApplicationDestinationPrefixes("/app");
    }
}

Реализация утилиты angular websocket:

Примечание. Этот класс используется для подключения веб-сокета и подписки.

@Injectable()
export class WebSocketUtil {

  stompClient = null;

  constructor() {
  }

  connect(subscribers: Subscriber[] = null) {
    let _this = this;
    let socket = new SockJS("https://localhost/ws");
    if (socket != null) {
      this.stompClient = Stomp.over(socket);
      if (this.stompClient != null) {
        console.log("Stomp client is connected!");

        let headers = {};
        headers["X-CSRF-TOKEN"] = ...;// csrf code

        this.stompClient.connect(headers, (frame) => {
          subscribers.forEach((subscriber) => {
            _this.stompClient.subscribe(subscriber.URL, subscriber.CALLBACK);
          });
        }, () => {
          console.log(_this.stompClient);
        });
      } else {
        throw {
          name: "StompClientNotRegistered",
          message: "Stomp client is not registered!"
        };
      }
    } else {
      throw {
        name: "SocketEstablishFailed",
        message: "Socket cannot be established!"
      };
    }
  }

  send(message) {
    this.stompClient.send(message.url, JSON.stringify(message.params));
  }
}

Реализация углового класса подписчика:

Примечание. Этот класс используется для привязки подписки.Подпрограммы для перенаправления клиента!

export class Subscriber {
  constructor(private url: string = "", private callback: any) {
  }

  get URL() {
    return this.url;
  }

  get CALLBACK() {
    return this.callback;
  }
}

Использование WebsocketUtil:

Примечание. Этот фрагмент кода вызывается после этапа инициализации просмотра.

this.webSocketUtil.connect([
      new Subscriber("/notif", function (data) {
        console.log(data);
      }),
      new Subscriber("/user", function (data) {
        console.log(data);
      })
    ]);

Приведенный выше код вызывает следующую ошибку в консоли веб-браузера (FF и Chrome):

Browser error!

Примечание: https://localhost/ws доступен и возвращает "Добро пожаловать в SockJS!"сообщение.

1 Ответ

0 голосов
/ 17 марта 2019

Наконец, я решил проблему с пунктами ниже:

  1. Добавление соответствующей конфигурации перезаписи в конфигурацию Apache2 - я проигнорировал ее: (

    ...
    
    RewriteEngine On
    RewriteCond %{HTTP:Upgrade} =websocket [NC]
    RewriteRule ^/ws/(.*)       ws://localhost:8080/ws/$1 [P,L]    
    
    ...
    
  2. Добавление разрешения на все запросы для / ws запросов в классе конфигурации безопасности:

    @ Configuration @EnableWebSecurity: открытый класс WebSecurityConfig extends WebSecurityConfigurerAdapter {

    ...
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        ...
        http.authorizeRequests().antMatchers("/ws/**").permitAll();
        ...
    }
    

    }

  3. Добавление разрешающих всех разрешений для SimpTypes в классе конфигурации websocket:

    @ Configuration @EnableWebSocketMessageBroker открытый класс WebSocketConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer {...

    1024

    }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...