programing

Spring Cloud - Zuul Proxy가 'Access-Control-Allow-Origin' Ajax 응답을 생성하지 않습니다.

randomtip 2023. 7. 20. 23:32
반응형

Spring Cloud - Zuul Proxy가 'Access-Control-Allow-Origin' Ajax 응답을 생성하지 않습니다.

시작 응용 프로그램:

@SpringBootApplication
@EnableZuulProxy
public class ZuulServer {

     public static void main(String[] args) {
         new SpringApplicationBuilder(ZuulServer.class).web(true).run(args);
     }
 }

내 YAML 파일은 다음과 같습니다.

server:
   port:8080

spring:
   application:
      name: zuul

eureka:
client:
  enabled: true
    serviceUrl:
       defaultZone: http://localhost:8761/eureka/



zuul:
    proxy:
       route:
         springapp: /springapp

저는 springapp이라는 마이크로 서비스 애플리케이션(포트 8081)을 가지고 있으며 약간의 휴식 서비스를 가지고 있습니다.다음은 클라이언트 UI 앱입니다.

    <html>
    <head>
        <title>TODO supply a title</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <script type="text/javascript" src="js/libs/jquery/jquery.min.js" ></script>
    </head>
    <body>
        <script type="text/javascript">
            $.ajax({
                url: 'http://localhost:8080/zuul/springapp/departments',
                type: 'GET'
            }).done(function (data) {
                consoe.log(data);
                document.write(data);
            });
        </script>        

    </body>
</html>

하지만 난...

XMLHttpRequest cannot load http://localhost:8080/zuul/springapp/departments. No
    'Access-Control-Allow-Origin' header is present on the requested
    resource. Origin 'http://localhost:8383' is therefore not allowed access.

이 UI HTML5 은 http://localhost:8383/SimpleAPP/index.html. CORS, CORS, CORS...제발 도와주세요.BTW http://localhost:8080/zuul/springapp/departments는 브라우저 주소 표시줄에 있을 때 json 목록을 반환합니다.여기 spring.io 블로그에서는 zuulproxy가 처리해주기 때문에 필터가 필요 없다고 하는데, 왜 저는 그것이 저에게 효과가 없는지 모르겠습니다.

@EnableZuulProxy로 주석이 달린 이 코드 조각을 클래스에 추가하면 효과가 있습니다.

@Bean
public CorsFilter corsFilter() {
    final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    final CorsConfiguration config = new CorsConfiguration();
    config.setAllowCredentials(true);
    config.addAllowedOrigin("*");
    config.addAllowedHeader("*");
    config.addAllowedMethod("OPTIONS");
    config.addAllowedMethod("HEAD");
    config.addAllowedMethod("GET");
    config.addAllowedMethod("PUT");
    config.addAllowedMethod("POST");
    config.addAllowedMethod("DELETE");
    config.addAllowedMethod("PATCH");
    source.registerCorsConfiguration("/**", config);
    return new CorsFilter(source);
}

저도 비슷한 문제를 겪었는데, Angular Web app이 Zuul과 Spring Security와 함께 Spring Boot에 의해 구현된 RESTful 서비스를 소비하고 있습니다.

위의 해결책이 작동하지 않았습니다.문제는 주울이 아니라 스프링 시큐리티에 있다는 것을 깨달았습니다.

공식 문서(CORS with Spring Security)에 명시된 것처럼 Spring Security를 사용할 때는 Spring Security 이전에 CORS를 구성해야 합니다.

마침내, 저는 Grinish 네팔의 솔루션(사전 답변 참조)을 효과적인 솔루션에 통합할 수 있었습니다.

다음은 스프링 보안 및 Zuul과 함께 CORS를 활성화하는 코드입니다.


    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
        //irrelevant for this problem
        @Autowired
        private MyBasicAuthenticationEntryPoint authenticationEntryPoint;

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                    //configure CORS -- uses a Bean by the name of     corsConfigurationSource (see method below)
                    //CORS must be configured prior to Spring Security
                    .cors().and()
                    //configuring security - irrelevant for this problem
                    .authorizeRequests()
                        .anyRequest().authenticated()
                        .and()
                    .httpBasic()
                    .authenticationEntryPoint(authenticationEntryPoint);

            //irrelevant for this problem
            http.addFilterAfter(new CustomFilter(),
                    BasicAuthenticationFilter.class);
        }

        //The CORS filter bean - Configures allowed CORS any (source) to any 
        //(api route and method) endpoint
        @Bean
        CorsConfigurationSource corsConfigurationSource() {
            final UrlBasedCorsConfigurationSource source = new     UrlBasedCorsConfigurationSource();
            final CorsConfiguration config = new CorsConfiguration();
            config.setAllowCredentials(true);
            config.addAllowedOrigin(CorsConfiguration.ALL);
            config.addAllowedHeaders(Collections.singletonList(CorsConfiguration.ALL));
            config.addAllowedMethod("OPTIONS");
            config.addAllowedMethod("HEAD");
            config.addAllowedMethod("GET");
            config.addAllowedMethod("PUT");
            config.addAllowedMethod("POST");
            config.addAllowedMethod("DELETE");
            config.addAllowedMethod("PATCH");
            source.registerCorsConfiguration("/**", config);
            return source;
        }

        //configuring BA usernames and passwords - irrelevant for this problem
        @Autowired
        public void configureGlobal(AuthenticationManagerBuilder auth) throws     Exception {
           ...
        }
    }

응용 프로그램이 실행될 때http://localhost:8383그러면 AJAX-통화만 할 수 있습니다.http://localhost:8383Zuul은 그것을 바꾸지 않고 바꿀 수 없습니다.

Zuul이 할 수 있는 것은 예를 들어 요청을 매핑하는 것입니다.http://localhost:8383/zuul/로.http://localhost:8080/zuul/하지만 당신의 브라우저는 전화를 해야 할 것입니다.http://localhost:8383/zuul/springapp/departments매핑을 구성해야 합니다.

구성에 다음을 추가하는 것만으로도 효과가 있었습니다.

zuul:
    ignoredHeaders: Access-Control-Allow-Credentials, Access-Control-Allow-Origin

저도 같은 문제가 있었고, CorsFilter bean을 추가하여 수정했습니다.

  @Bean
  public FilterRegistrationBean corsFilter() {
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    CorsConfiguration config = new CorsConfiguration();
    config.setAllowCredentials(true);
    config.addAllowedOrigin("*");
    config.addAllowedHeader("*");
    config.addAllowedMethod("*");
    source.registerCorsConfiguration("/**", config);
    FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
    bean.setOrder(0);
    return bean;
  }

그리고 이 코드에 zuul의 속성을 추가합니다.

zuul:
  sensitiveHeaders:
  ignored-headers: Access-Control-Allow-Credentials, Access-Control-Allow-Origin

문제에 대한 자세한 내용은 여기에서 확인할 수 있습니다.

그것은 브라우저가 사용자가 공통 출처 정책을 위반했다고 알려주는 것일 뿐입니다(위키백과 항목 및 인터넷에 있는 방대한 양의 자료를 참조하십시오. 이 중 어느 것도 추가한 태그와 실제로 관련이 없습니다.)CORS 비행 전 점검을 서비스하여 다른 주소에서 리소스를 로드해도 괜찮다는 것을 브라우저에 알려줄 수 있습니다(예:Filter하기 쉽습니다 또는 프록시를 통해 HTML을 로드합니다(힌트: 후자가 훨씬 쉽고 오류가 발생하기 쉽습니다).

다음과 같은 경우에도 여전히 문제가 있는 사람들을 위해.@Bean CorsFilter에 "되었습다니추"라는 합니다. 컨트롤러에 주석이 달렸는지 확인하십시오.@CrossOrigin컨트롤러 레벨과 Zuul 프록시에서 이러한 CORS 복제가 문제의 원인일 수 있습니다.

언급URL : https://stackoverflow.com/questions/28670640/spring-cloud-zuul-proxy-is-producing-a-no-access-control-allow-origin-ajax-r

반응형