web-dev-qa-db-ja.com

WebSocketハンドシェイク-予期しない応答コード200-AngularJsとSpring Boot

AngularJSアプリとSpring Bootの間にwebsocket通信を確立しようとすると、次のエラーが表示されます。websocketハンドシェイク中のエラー-予期しない応答コード:2

これが私のJSコードです。

function run(stateHandler, translationHandler, $websocket) {
    stateHandler.initialize();
    translationHandler.initialize();

    var ws = $websocket.$new('ws://localhost:8080/socket'); // instance of ngWebsocket, handled by $websocket service

    ws.$on('$open', function () {
        console.log('Oh my gosh, websocket is really open! Fukken awesome!');  
    });

    ws.$on('/topic/notification', function (data) {
        console.log('The websocket server has sent the following data:');
        console.log(data);

        ws.$close();
    });

    ws.$on('$close', function () {
        console.log('Noooooooooou, I want to have more fun with ngWebsocket, damn it!');
    });
}

そして、ここに私のJavaコード:

WebsocketConfiguration.Java

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

@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
    registry.enableSimpleBroker("/topic");
}

WebsocketSecurityConfiguration.Java

@Override
protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) {
    messages
        // message types other than MESSAGE and SUBSCRIBE
        .nullDestMatcher().authenticated()
        // matches any destination that starts with /rooms/
        .simpDestMatchers("/topic/tracker").hasAuthority(AuthoritiesConstants.ADMIN)
        .simpDestMatchers("/topic/**").permitAll()
        // (i.e. cannot send messages directly to /topic/, /queue/)
        // (i.e. cannot subscribe to /topic/messages/* to get messages sent to
        // /topic/messages-user<id>)
        .simpTypeMatchers(SimpMessageType.MESSAGE, SimpMessageType.SUBSCRIBE).denyAll()
        // catch all
        .anyMessage().denyAll();
}

誰もこの問題を修正する方法を知っていますか?
前もって感謝します!

7
Heril Muratovic

同様の問題があり、chromeプラグイン(シンプルなWebSocketクライアント)を使用してwebsocket接続をテストし、で定義されているws:// localhost:8080/handler /に接続しようとしましたregistry.addEndpoint("/handler").setAllowedOrigins("*").withSockJS();としてのコードですが、予期しないエラー200が発生しました。chrome拡張機能のクライアント要求文字列に/ websocketを追加して、これを修正しました。 JSファイルで次の行を変更します。

var ws = $websocket.$new('ws://localhost:8080/socket');

 var ws = $websocket.$new('ws://localhost:8080/socket/websocket');

私がこれを修正した理由を私は知らない、私はランダムにつまずいた、some1がそれをもっと明確にすることができれば、それは本当に素晴らしいだろう:)

19

これを試すことができますWebsocketConfiguration configuration:

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

あなたはwebsocketとSockJSの両方の構成を持っていますか?

1
Josef Veselý

Spring Boot、WebSocket、Angular私は同じ問題に直面しましたが、これはそれを解決し、my angular stockブロッター

antMatchers("/ws/myapp", "/http/myaap", "/topic/**", "/app/**").permitAll()

WebSecurityConfigurerAdapterクラス

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .cors()
                .and()
                .csrf()
                .disable()
                .authorizeRequests()
                .antMatchers("/", "/favicon.ico")                
                .antMatchers("/api/stocks/**")
                .permitAll()
                .antMatchers("/ws/myapp", "/http/myaap", "/topic/**", "/app/**" )
                .permitAll()
                .anyRequest()
                .authenticated()
                .and()
                .exceptionHandling()
                .authenticationEntryPoint(unauthorizedHandler)
                .and()
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        http.addFilterBefore(authenticationJwtTokenFilter(), UsernamePasswordAuthenticationFilter.class);
    }
}

Angularここで、サービスで使用するURLは次のとおりです。

http://localhost:8080/http/myapp'
ws://localhost:8080/ws/myapp 

これが役立つことを願っています

0
DiaMaBo