J'essaie d'appeler une demande GET de mon application frontale Angular 2 vers un microservice Spring Boot REST, mais lorsque j'appelle, j'obtiens une erreur comme:

Aucun en-tête Access-Control-Allow-Origin n'est présent sur la ressource demandée

Voici mes actions de contrôleur:

@RequestMapping(value = "/checkUsers", method = RequestMethod.POST)
public String checkLogin(@RequestBody Users user) throws Exception{

    ObjectMapper mapper = new ObjectMapper();
    List<Users> useObj = (List<Users>) userRepo.findAll();
    return(mapper.writeValueAsString(useObj));
}

Et lorsque j'exécute mon Angular, j'obtiens l'erreur ci-dessus. J'ai ajouté sa capture d'écran

enter image description here

S'agit-il d'un problème angulaire ou d'un problème de réponse de microservice Spring Boot?

0
Jacob 16 nov. 2017 à 16:43

4 réponses

Meilleure réponse

Comme ils s'exécutent sur des ports différents, vous devez autoriser le partage de ressources cross-origin (CORS) côté serveur. Dans Spring Boot, vous pouvez le faire en ajoutant l'annotation @CrossOrigin à la méthode du gestionnaire:

@CrossOrigin(origins = "http://localhost:4200")

Il est également possible d'ajouter cette annotation au niveau de la classe du contrôleur, afin d'activer CORS sur toutes les méthodes de gestion de cette classe.

2
Pavle Eftimovski 16 nov. 2017 à 13:59

La création d'une classe Spring Boot Component qui implémente l'interface javax.servlet.Filter et l'ajout de l'en-tête requis ont résolu un problème similaire.

@Component
public class YourAppCorsFilter implements Filter{

@Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;

        response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With, remember-me");

        chain.doFilter(req, res);
    }
}

Faites-moi savoir si vous rencontrez toujours des problèmes après avoir ajouté ceci à votre micro-service.

0
brax7 7 sept. 2018 à 21:37

Dans votre Application.java, ajoutez un 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));
    return bean;
  }

Il est global et fonctionnera pour chaque contrôleur de votre projet.

0
Satish Kr 16 nov. 2017 à 15:39

La réponse acceptée est bonne car elle fournit une solution fonctionnelle, mais elle vous oblige également à coder en dur l'URL du client côté serveur dans chaque contrôleur. Vous pouvez configurer une configuration CORS globale à la place. Si votre configuration Web étend la classe WebMvcConfigurereAdapter, vous pouvez simplement remplacer la méthode addCorsMappings. L'exemple suivant active CORS pour l'ensemble de l'application:

@Configuration
public class WebConfig extends WebMvcConfigurereAdapter {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**");
    }
}

En savoir plus sur la prise en charge de CORS au printemps ici

0
hiper2d 16 nov. 2017 à 15:00
47331267