Spring CORS 跨域使用與原理(@CrossOrigin注解,Java配置類(lèi)方式,xml方式)
出于安全原因,瀏覽器禁止AJAX調(diào)用當(dāng)前源之外的資源。
跨域資源共享(CORS)是由大多數(shù)瀏覽器實(shí)現(xiàn)的W3C規(guī)范,它允許您以一種靈活的方式指定授權(quán)哪種跨域請(qǐng)求,而不是使用一些不太安全、功能不太強(qiáng)大的hack(如IFrame或JSONP)。
Spring Framework 4.2 GA為CORS提供了一流的開(kāi)箱即用支持,為我們提供了一種比典型的基于過(guò)濾器的解決方案更簡(jiǎn)單、更強(qiáng)大的配置方式。
一、注解方式使用
1.方法上添加@CrossOrigin注解
@RestController
@RequestMapping("/account")
public class AccountController {
@CrossOrigin
@GetMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
@DeleteMapping("/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}
使用此種方式只會(huì)對(duì)當(dāng)前方法生效。
2.Controller上添加@CrossOrigin注解
@CrossOrigin
@RestController
@RequestMapping("/account")
public class AccountController {
@GetMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
@DeleteMapping("/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}
使用此種方式會(huì)對(duì)整個(gè)Controller生效。
3.@CrossOrigin的兩個(gè)參數(shù)使用
- origins: 允許可訪問(wèn)的域列表
- maxAge:準(zhǔn)備響應(yīng)前的緩存持續(xù)的最大時(shí)間(以秒為單位)
@CrossOrigin(origins = "http://domain2.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {
@GetMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
@DeleteMapping("/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}
這兩個(gè)參數(shù)也可以分開(kāi)單獨(dú)使用,如下所示:
@CrossOrigin(maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {
@CrossOrigin(origins = "http://domain2.com")
@GetMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
@DeleteMapping("/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}
4.注意事項(xiàng)
如果有正在使用Spring Security,需要在Spring Security中啟用CORS,以允許它利用Spring MVC定義的配置。如下所示:
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors().and()...
}
}
二、CORS全局配置使用
除了細(xì)粒度的、基于注釋的配置之外,我們還可以自定義一些全局CORS配置。類(lèi)似于使用過(guò)濾器,但可以在Spring MVC中聲明,并結(jié)合細(xì)粒度的@CrossOrigin配置。默認(rèn)情況下,所有的origin和GET、HEAD和POST方法都可以使用。
1.Java配置類(lèi)方式
使用非常簡(jiǎn)單,如下所示:
@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**");
}
}
如果是使用的Spring Boot,建議只聲明一個(gè)WebMvcConfigurer bean,如下所示:
@Configuration
public class MyConfiguration {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**");
}
};
}
}
除此之外,我們還可以自定義更多的其他屬性,比如將CORS配置應(yīng)用于特定的路徑模式:
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("http://domain2.com")
.allowedMethods("PUT", "DELETE")
.allowedHeaders("header1", "header2", "header3")
.exposedHeaders("header1", "header2")
.allowCredentials(false).maxAge(3600);
}
同樣,此處我們要注意Spring Security使用的情況,具體實(shí)現(xiàn)參考注解使用中的實(shí)現(xiàn)。
2.XML配置文件方式
當(dāng)然,我們也可以使用xml配置文件的方式來(lái)進(jìn)行全局配置,如下所示:
<mvc:cors>
<mvc:mapping path="/**" />
</mvc:cors>
同樣也可以在xml中自定義CORS映射,如下所示:
<mvc:cors>
<mvc:mapping path="/api/**"
allowed-origins="http://domain1.com, http://domain2.com"
allowed-methods="GET, PUT"
allowed-headers="header1, header2, header3"
exposed-headers="header1, header2" allow-credentials="false"
max-age="123" />
<mvc:mapping path="/resources/**"
allowed-origins="http://domain1.com" />
</mvc:cors>
如果正在使用Spring Security,同樣要在Spring Security啟用CORS:
<http>
<!-- Default to Spring MVC's CORS configuration -->
<cors />
...
</http>
三、原理解釋
CORS請(qǐng)求(包括帶有OPTIONS方法的飛行前請(qǐng)求)被自動(dòng)分派給已注冊(cè)的各種HandlerMappings。它們處理CORS預(yù)飛行請(qǐng)求,并通過(guò)CorsProcessor實(shí)現(xiàn)(默認(rèn)為DefaultCorsProcessor)攔截CORS簡(jiǎn)單和實(shí)際請(qǐng)求,以便添加相關(guān)的CORS響應(yīng)頭(如Access-Control-Allow-Origin)。CorsConfiguration允許您指定應(yīng)該如何處理CORS請(qǐng)求:allowed origins, headers, methods, etc等。
可以通過(guò)多種方式提供,如:
- AbstractHandlerMapping#setCorsConfiguration()允許在路徑模式(如/api/)上指定多個(gè)CorsConfiguration映射的Map
- 子類(lèi)可以通過(guò)重寫(xiě)AbstractHandlerMapping#getCorsConfiguration(Object, HttpServletRequest)方法來(lái)提供他們自己的CorsConfiguration
- 處理程序可以實(shí)現(xiàn)CorsConfigurationSource接口(就像ResourceHttpRequestHandler現(xiàn)在做的那樣),以便為每個(gè)請(qǐng)求提供CorsConfiguration。
除此之外,還可以使用基于CORS的過(guò)濾器支持,作為上述其他方法的替代方案,Spring Framework還提供了CorsFilter。在這種情況下,不使用@CrossOrigin或WebMvcConfigurer# addcorsmapping (CorsRegistry),我們可以像下面這樣在Spring Boot中聲明過(guò)濾器:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-712616.html
@Configuration
public class MyConfiguration {
@Bean
public FilterRegistrationBean corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("http://domain1.com");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
source.registerCorsConfiguration("/**", config);
FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
bean.setOrder(0);
return bean;
}
}
以上內(nèi)容參考自Spring官方文檔:https://spring.io/blog/2015/06/08/cors-support-in-spring-framework
同時(shí)歡迎各位來(lái)我的個(gè)人博客:http://bravegougou.cn/文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-712616.html
到了這里,關(guān)于Spring CORS 跨域使用與原理(@CrossOrigin注解,Java配置類(lèi)方式,xml方式)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!