web-dev-qa-db-fra.com

Spring Cloud - Le proxy Zuul produit une réponse ajax Non

Application de démarrage:

@SpringBootApplication
@EnableZuulProxy
public class ZuulServer {

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

Mon fichier YAML est comme ceci:

server:
   port:8080

spring:
   application:
      name: zuul

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



zuul:
    proxy:
       route:
         springapp: /springapp

J'ai une application de microservice (sur le port 8081) appelée springapp et quelques services de repos. Ci-dessous, mon interface utilisateur client:

    <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>

Mais je reçois un 

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.

Cette application UI HTML5 est située sur http: // localhost: 8383/SimpleAPp/index.html . CORS, CORS, CORS ... S'il vous plaît aider. BTW le http: // localhost: 8080/zuul/springapp/department renvoie une liste JSON comme supposé se trouver dans la barre d’adresse du navigateur. Le blog spring.io ici indique qu’il n’ya pas besoin de filtre car le zuulproxy s’occupe de cela, mais je ne sais pas pourquoi il ne fonctionne pas pour moi.

11
Given Nyauyanga

Ajouter ce morceau de code à votre classe annotée avec @EnableZuulProxy devrait faire l'affaire.

@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);
}
30
Grinish Nepal

Lorsque votre application s'exécute sur http://localhost:8383, vous pouvez uniquement effectuer des appels AJAX vers http://localhost:8383. Zuul ne le fait pas et ne peut rien y changer.

Ce que Zuul peut faire est de mapper des demandes pour, par exemple, http://localhost:8383/zuul/ à http://localhost:8080/zuul/. Mais votre navigateur devra appeler http://localhost:8383/zuul/springapp/departments et vous devrez configurer ce mappage.

5
a better oliver

Je rencontrais un problème similaire avec Angular Web consommant des services RESTful implémentés par Spring Boot avec Zuul et Spring Security. 

Aucune des solutions ci-dessus n'a fonctionné. J'ai réalisé que le problème n'était PAS à Zuul, mais à Spring Security.

Comme indiqué dans la documentation officielle ( CORS avec Spring Security ), lorsque vous utilisez Spring Security, CORS doit être configuré avant Spring Security.

Enfin, j'ai pu intégrer la solution de Grinish Nepal (voir réponses précédentes) dans une solution qui fonctionne.

Sans plus tarder, voici le code qui active CORS avec Spring Security et Zuul: `` ``

@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("*");
        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 source;
    }

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

`` `

1
Mate Šimović

C’est tout simplement le navigateur qui vous dit que vous avez enfreint sa politique d’origine (voir entrée Wikipedia et une énorme quantité de contenu sur Internet, dont aucun n’est vraiment pertinent pour les tags que vous avez ajoutés). Vous pouvez apprendre au navigateur qu'il est correct de charger des ressources à partir d'une adresse différente en effectuant des vérifications avant le vol dans le CORS (par exemple, dans une Filter) ou en chargeant le code HTML via le proxy (conseil: ce dernier est beaucoup plus facile et moins sujet aux erreurs ).

1
Dave Syer

J'ai eu le même problème, et j'ai résolu en ajoutant CorsFilter haricot

  @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;
  }

Et en ajoutant les propriétés de zuul ce code 

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

Vous pouvez trouver plus de détails sur le problème ici

0
Mounir Messaoudi