J'ai une application Spring Boot qui expose certains points de terminaison. À partir d'une application React, je souhaite envoyer des requêtes à ces points de terminaison, mais cela me pose toujours un problème CORS:
accès à XMLHttpRequest à 'localhost: 9090 / helios-admin / api / dashboard / clients? page = 0 & size = 30' de l'origine « http: // localhost: 3000 » a été bloqué par la stratégie CORS: Les demandes d'origine croisée ne sont prises en charge que pour les schémas de protocole: http données, chrome, extension chrome, https.
J'ai donc essayé d'utiliser l'annotation @CrossOrigin
pour toutes mes méthodes et aussi pour la classe Controller, mais l'erreur est la même.
La demande d'obtention dans mon application React ressemble à ceci:
@Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(securedEnabled = true, jsr250Enabled = true, prePostEnabled = true) public class SecurityConfiguration extends WebSecurityConfigurerAdapter { @Autowired SysdataUserDetailsService sysdataUserDetailsService; @Autowired private JwtAuthEntryPoint jwtAuthEntryPoint; @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth .userDetailsService(sysdataUserDetailsService) .passwordEncoder(encoder()); } @Override protected void configure(HttpSecurity http) throws Exception { http.cors().and().csrf().disable().authorizeRequests() .antMatchers(PathConstants.USER_AUTH +"/**", PathConstants.HELIOS+"/dashboard/**").permitAll() .antMatchers(HttpMethod.GET, "/"+PathConstants.PROCESS_DEFINITION+"/**").permitAll() .antMatchers(HttpMethod.POST, "/"+PathConstants.PROCESS_DEFINITION+"/**").permitAll() .antMatchers(HttpMethod.GET, "/"+PathConstants.PROCESS_INSTANCE+"/**").permitAll() //.anyRequest().authenticated() .anyRequest().permitAll() .and() .exceptionHandling().authenticationEntryPoint(jwtAuthEntryPoint).and() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); // custom jwt filter. http.addFilterBefore(jwtAuthFilter(), UsernamePasswordAuthenticationFilter.class); } }
Que manque-t-il?
MODIFIER Dans mon application Spring Boot, je n'ai que cette classe pour configurer la sécurité:
constructor() { this.url = 'localhost:9090/helios-admin/api/dashboard/clients?page=0&size=30'; } getProjectStatusById(projectId) { Axios.get(this.url).then(res=>{ console.log(res.data); }) }
3 Réponses :
Vous pouvez créer une classe de configuration CORS distincte comme suit. Cette classe gérera les configurations CORS pour toutes les requêtes de votre application et vous n'avez pas besoin d'annoter chaque contrôleur séparément avec @CrossOrigin
.
@Configuration public class CorsConfig { @Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration config = new CorsConfiguration(); config.setAllowCredentials(true); config.addAllowedOrigin("*"); //'*' allows all endpoints, Provide your URL/endpoint, if any. config.addAllowedHeader("*"); config.addAllowedMethod("POST"); //add the methods you want to allow like 'GET', 'PUT',etc. using similar statements. config.addAllowedMethod("GET"); source.registerCorsConfiguration("/**", config); return new CorsFilter(source); } }
Dois-je appeler la méthode quelque part ou va-t-elle tout faire d'elle-même puisque c'est @Configuration? Parce que j'ai ajouté la classe mais cela ne fonctionne pas: \
@Dseaster Vous n'avez besoin d'appeler la méthode nulle part. Il fera tout par lui-même.
Ok, mais ça ne marche pas ... Continue de me donner l'erreur. J'ai copié votre code et ajouté toutes les méthodes dont j'ai besoin
@Dseaster Chaque type de méthode va dans une instruction distincte. J'ai modifié l'extrait de code dans ma réponse.
Oui, je les ai ajoutés comme ça
Vous pouvez l'ajouter en remplaçant addCorsMappings
de WebMvcConfigurerAdapter
, donc créez une classe qui étend WebMvcConfigurerAdapter
ou définissez un bean dans votre classe de configuration comme ceci:
@Configuration @EnableWebMvc public class MyWebMvcConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/api/**") .allowedOrigins("http://domain1.com", "http://domain2.com") .allowedMethods("GET", "OPTIONS") .allowedHeaders("header1", "header2", "header3") .exposedHeaders("header1", "header2") .allowCredentials(false).maxAge(3600); } }
Edit
À partir de 5.0 WebMvcConfigurerAdapter
est obsolète et vous pouvez donc réaliser la même chose en implémentant l'interface WebMvcConfigurer
(ajout de méthodes par défaut, merci java 8! et peut être implémenté directement sans avoir besoin de cet adaptateur)
@Bean public WebMvcConfigurer corsConfigurer () { return new WebMvcConfigurerAdapter() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/api/**") .allowedOrigins("http://domain1.com", "http://domain2.com") .allowedMethods("GET", "OPTIONS") .allowedHeaders("header1", "header2", "header3") .exposedHeaders("header1", "header2") .allowCredentials(false).maxAge(3600); } } }
WebMvcConfigurerAdapter est obsolète
@Dseaster merci pour votre réponse, vous pouvez voir ma modification
Bonjour, j'ai essayé votre nouvelle solution mais cela ne fonctionne pas. Est-il nécessaire de spécifier les allowHeader et ExhibisHeaders?
@Usr Avez-vous réussi à le faire fonctionner? J'ai le même problème dans aucune solution partout dans Stack Overflow ni dans les documents Spring ne fonctionnaient pour moi.
Vous pouvez ajouter une configuration globale comme
@Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurerAdapter() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/greeting-javaconfig").allowedOrigins("http://localhost:9000"); } }; }
Utilisez simplement ceci pour ajouter une configuration corrs globale qui affectera tous les points de terminaison. Essayez ceci si l'annotation ne fonctionne pas. p >
Avez-vous String Security?