Блокирован перекрестный запрос: одна и та же политика происхождения запрещает чтение проблемы с удаленным ресурсом - PullRequest
0 голосов
/ 26 марта 2020

Я застрял в реализации websocket в моем приложении. Я использую Spring Boot + angular 8

Это моя конфигурация веб-сокета

Конфигурация безопасности

@Override
    protected void configure(HttpSecurity http) throws Exception {
        System.out.println("****");

        http.cors().and().csrf().disable()
                .authorizeRequests()
                .antMatchers("/oauth/token/**").permitAll()
                .antMatchers("/websocket/**").permitAll()
                .antMatchers("/ws/**").authenticated()
                .anyRequest().permitAll().and()
                .addFilter(new JwtAuthenticationFilter(authenticationManager(),getApplicationContext()))
                .addFilter(new JwtAuthorizationFilter(authenticationManager(),getApplicationContext()))
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);

        http.headers().frameOptions().sameOrigin();
    }


    @Bean
    CorsConfigurationSource corsConfigurationSource() {
        final CorsConfiguration configuration = new CorsConfiguration();

        configuration.setAllowedOrigins(Arrays.asList("*","http://localhost:4200"));
        configuration.setAllowCredentials(false);
        configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "OPTION", "DELETE"));
       configuration.setAllowedHeaders(Arrays.asList("Content-Type", "Access-Control-Allow-Headers","Origin", "x-requested-with", "Authorization"));
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }

Конфигурация веб-сокета

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

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

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

Ниже мой контроллер

import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class ClientForwardController {


 //Below controller is used to forward all my un mapped request to index.html
 // Because of this websocket /info request forwarding to index.html

  @GetMapping(value = "/**/{path:[^\\.]*}")
  public String forward() {
    return "forward:/";
  }

  @MessageMapping("/test")
  @SendTo("/topic/testing")
  public String test() throws Exception {
    Thread.sleep(3000); // simulated delay 3s
    return "success";
  }

} 

Ниже мой Angular код для подключения к веб-сокету.

import * as Stomp from 'stompjs';
import * as SockJS from 'sockjs-client';

export class WebSocketAPI {
    webSocketEndPoint: string = 'http://localhost:8080/websocket';
    topic: string = "/topic/testing";
    stompClient: any;
    displayProductComponent: TodaysMarketListComponent;
    constructor(displayProductComponent: TodaysMarketListComponent){
        this.displayProductComponent = displayProductComponent;
    }
    _connect() {
        console.log("Initialize WebSocket Connection");
        let ws = new SockJS(this.webSocketEndPoint);
        this.stompClient = Stomp.over(ws);
        const _this = this;

        _this.stompClient.connect({}, function (frame: any) {
            _this.stompClient.subscribe(_this.topic, function (sdkEvent) {
                _this.onMessageReceived(sdkEvent);
            });
        }, this.errorCallBack);
    };


}

Но я не могу подключиться к серверу.

Пожалуйста, предложите исправить эту проблему.

Ошибка

Запрос перекрестного источника заблокирован: Политика одинакового происхождения запрещает чтение удаленного ресурса в 'http://localhost: 8080 / websocket / Информация о? т = 1585208056284 ». (Причина: учетные данные не поддерживаются, если заголовок CORS 'Access-Control-Allow-Origin' равен '*').

К сожалению! Потерянное соединение с http://localhost: 8080 / websocket

Спасибо, Венкатарамана

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