2016-07-29 93 views
0

我需要在我的彈簧啓動數據休息API中啓用全局CORS,以防止在我從瀏覽器調用我的api時出現以下錯誤: http://localhost:8090/posts?user-id=1。請求的資源上沒有「Access-Control-Allow-Origin」標題。因此不允許訪問'Origin'http://localhost'。'。無法在彈簧啓動數據休息時啓用CORS

我可以在瀏覽器中輸入url並獲得該資源的正確獲取響應,但我無法通過網頁中的ajax調用進行相同的調用。

任何想法,我即將失蹤?

我的代碼和配置低於:

@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

您好,請檢查這個項目https://github.com/MFaisalHyder/REST_API 它使用Spring MVC4與Spring啓動完全由。在您的文章中,您缺少爲響應標題設置過濾器,並且必須允許從應用程序使用GET,POST等原始方法。如果不瞭解,我會通過項目來完成一個完整的答案。 –

+0

非常感謝。生病嘗試這個 – gezinspace

+0

你有沒有得到它,或者你想我發表詳細的答案,但你也需要發佈你的項目結構,因爲它需要改變。 –

回答

1

在評論中我發現了什麼,你可以在你addCorsMappings試試這個方法經過討論所以

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

,不幸的是這沒有幫助,但是謝謝你的建議。我發現很難相信如果Pivotal Spring不能用於交叉源請求,那麼Pivotal Spring的人會爲創建spring-data-rest而煩惱。必須有這樣的做法 – gezinspace

+0

https://spring.io/blog/2015/06/08/cors-support-in-spring-framework這將幫助你 –

+0

謝謝。有一個看起來很有希望的部分 - 肯定是關於彈簧啓動項目的另一種基於過濾器的方法,目前不支持本地cors(例如... data-rest lol)!我必須執行一項差事,但是當我回來時,我生病了。生病讓你知道它是怎麼回事。謝謝! – gezinspace

-1

嘗試在全局配置添加此:

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

+0

這似乎很有希望,所以我在我的WebMvcConfigurer bean聲明中修改了這一行。不幸的是,這並沒有什麼不同。 – gezinspace

+0

奇怪的是,這對於常規休息終點來說是完美無瑕的。我不認爲你需要@crossorigin註釋與全局配置 – Ulises

+0

奇怪。我已經嘗試過沒有註釋了。 – gezinspace

0

好加入這個bean幫助

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

滑稽足夠春天不允許CORS支持使用以下bean的spring引導數據休息端點。但是,它可以像開發人員創建的其他自定義端點那樣正常工作。

@Bean 
public WebMvcConfigurer corsConfigurer() { 

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