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.
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);
}
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.
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 {
...
}
}
`` `
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 ).
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