web-dev-qa-db-fra.com

WebSocket Handshake - Code de réponse inattendu 200 - AngularJs et Spring Boot

Lorsque j'ai essayé d'établir une communication Websocket entre l'application AngularJS et Spring Boot, j'obtiens l'erreur: Erreur lors de la prise de contact Websocket - Code de réponse inattendu: 2.

Voici mon code 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!');
    });
}

Et voici mon 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();
}

Quelqu'un at-il une idée de comment résoudre ce problème?
Merci d'avance!

7
Heril Muratovic

J'ai eu un problème similaire, je testais ma connexion Websocket à l'aide d'un plug-in chrome (Simple WebSocket Client) et essayais de me connecter à ws: // localhost: 8080/handler/qui est défini dans mon code en tant que registry.addEndpoint("/handler").setAllowedOrigins("*").withSockJS(); mais une erreur inattendue s'est produite 200. J'ai corrigé cela en ajoutant/websocket à ma chaîne de demande client sur l'extension chrome chrome, donc ce que vous pourriez essayer est de changer dans votre fichier JS la ligne suivante:

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

à

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

Je ne connais pas la raison pour laquelle cela a été corrigé dans mon cas, je suis juste tombé au hasard, si certains pouvaient le clarifier davantage, ce serait vraiment sympa :)

19
Luka Špoljarić

Pouvez-vous essayer cette configuration WebsocketConfiguration:

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

vous avez donc les configurations websocket et SockJS?

1
Josef Veselý

Spring Boot, WebSocket et Angular J'ai rencontré le même problème et c'est ainsi que je l'ai résolu et exécuté websocket avec des opérations de crud de données en temps réel dans mon angular buvards

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

classe 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 Voici les URL à utiliser dans votre service sont celles-ci

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

J'espère que cela vous aidera

0
DiaMaBo