2016-07-29 28 views
0

Ich muss globale CORS in meinem Frühjahr Boot Daten Rest API, um zu verhindern, dass die folgenden Fehler immer wenn ich meine API von einem Browser aufrufen: http://localhost:8090/posts?user-id=1. Kein 'Access-Control-Allow-Origin'-Header ist auf der angeforderten Ressource vorhanden. Ursprung 'http://localhost' ist daher nicht erlaubt. '.cant aktivieren CORS im Frühjahr Boot Daten Rest

Ich kann die URL in den Browser eingeben und erhalten die richtige Get-Antwort für diese Ressource, aber ich kann nicht den gleichen Aufruf von einem Ajax-Aufruf in einer Webseite.

Irgendwelche Ideen, was fehlt?

Mein Code und Konfiguration ist unten:

@SpringBootApplication 
@EnableAutoConfiguration 
@EnableJpaRepositories 
@EnableWebMvc 
public class Application { 

public static void main(String[] args) { 
    SpringApplication.run(Application.class, args); 

} 

@Bean 
public WebMvcConfigurer corsConfigurer() { 

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

@Bean 
public CommandLineRunner demo(UserRepository userRepository, PostRepository postRepository, 
           CommentRepository commentRepository, EventRepository eventRepository, VenueRepository venueRepository) { 
    return (args) -> { 

     User user = new User("fsdsdfsd","sdsdsds","121212"); 
     userRepository.save(user); 

     Venue venue = new Venue("dsaesrdfddgd","aerttyhyyty","yyyyyyyyyyyyyy"); 
     venueRepository.save(venue); 

     Event event = new Event("dsaesrdfddgd","aerttyhyyty","yyyyyyyyyyyyyy",venue,user); 
     eventRepository.save(event); 

     Post post = new Post("some posts are funny. Some are not.",user, event); 
     postRepository.save(post); 

     Comment comment = new Comment("commmentntnrnejfnerfdgdfgdfdt", user, post); 
     commentRepository.save(comment); 
    }; 
} 

}

@RepositoryRestResource 
public interface PostRepository extends PagingAndSortingRepository<Post, Long> { 


Page<Post> readBydeletedIsFalseOrderByCreated(Pageable pageRequest); 

@CrossOrigin 
Post readByIdAndDeletedIsFalse(Long postId); 

}

buildscript { 
repositories { 
    mavenCentral() 
} 
dependencies { 
    classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.6.RELEASE") 
} 
} 

apply plugin: 'java' 
apply plugin: 'war' 
apply plugin: 'eclipse' 
apply plugin: 'idea' 
apply plugin: 'spring-boot' 

jar { 
    baseName = 'project' 
    version = '0.1.0' 
} 

war { 
    baseName = 'project' 
    version = '0.1.0' 
} 


repositories { 
    mavenCentral() 
} 

sourceCompatibility = 1.8 
targetCompatibility = 1.8 

dependencies { 
    compile("org.springframework.boot:spring-boot-starter-data-rest") 
    compile("org.springframework.boot:spring-boot-starter-data-jpa") 
    compile("com.h2database:h2") 
} 

task wrapper(type: Wrapper) { 
    gradleVersion = '2.3' 
} 
+0

Hallo, freundlich, dieses Projekt überprüfen https://github.com/MFaisalHyder/REST_API es ist komplett aus mit Spring MVC4 mit Frühlings-Stiefel. In Ihrer Post fehlt es Ihnen an der Einrichtung von Filtern für Ihre Antwortheader und Sie müssen auch zulassen, dass Herkunftsmethoden wie GET, POST ... aus der Anwendung verwendet werden. Projekt durchlaufen, wenn nicht verstanden, ich werde in einer vollständigen Antwort beschreiben. –

+0

vielen Dank. krank versuchen Sie dies – gezinspace

+0

haben Sie es bekommen oder Sie wollen mich detaillierte Antwort, aber Sie müssen auch Ihre Projektstruktur, wie es erforderlich sein, um Änderung sein. –

Antwort

1

So nach Diskussion in den Kommentaren, was ich gefunden, können Sie dies in Ihrem addCorsMappings Methode versuchen

registry.addMapping("/**").allowedOrigins("http://localhost:8090") 
          .allowedMethods("PUT", "DELETE", "GET", "POST"); 
+0

bevölkert leider hilft dieses nicht, aber danke für den Vorschlag. Es fällt mir schwer zu glauben, dass die Leute von Pivotal Spring es sich zur Aufgabe gemacht hätten, den Quelldaten-Rest zu erstellen, wenn er nicht in der Ursprungsfrage verwendet werden könnte. es muss ome wway, dies zu tun – gezinspace

+0

https://spring.io/blog/2015/06/08/cors-support-in-spring-framework dies wird Ihnen helfen –

+0

danke. es gibt einen Abschnitt, der hoffnungsvoll aussieht - sicherlich ist es der alternative Filter-basierte Ansatz für Spring-Boot-Projekte, die derzeit nicht native Cors unterstützen (zum Beispiel ... Daten-Rest lol)! Ich muss eine Besorgung machen, aber ich versuche es, wenn ich zurückkomme. krank lass dich wissen, wie es geht. Vielen Dank! – gezinspace

-1

Versuchen Sie, diese auf die globale Konfiguration hinzu:

registry.addMapping("/**").allowedOrigins("*");

+0

Dies schien vielversprechend, also habe ich diese Zeile in meiner WebMvcConfigurer-Bean-Deklaration geändert. Leider machte dies keinen Unterschied. – gezinspace

+0

Komisch, das funktioniert einwandfrei für normale Ruhe-Endpunkte. Ich glaube nicht, dass Sie die Annotation @crossorigin mit der globalen Konfiguration – Ulises

+0

seltsam brauchen. Ich habe es auch ohne Annotation versucht. – gezinspace

0

diese Bohne Nun Zugabe hilft

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

Lustig genug, dass der Frühling nicht erlaubt CORS unterstützt bei Spring Boot-Daten Restpunkte mit folgender Bean. Es funktioniert jedoch wie vorgesehen mit anderen benutzerdefinierten Endpunkten, die vom Entwickler erstellt wurden.

@Bean 
public WebMvcConfigurer corsConfigurer() { 

    return new WebMvcConfigurerAdapter() { 
     @Override 
     public void addCorsMappings(CorsRegistry registry) { 
      registry.addMapping("/**").allowedOrigins("*").allowedMethods("GET"); 
     } 
    }; 
}