CORS:
通常情況下瀏覽器禁止AJAX從外部獲取資源,因此就衍生了CORS這一標准體系,來實現跨域請求。
CORS是一個W3C標准,全稱是"跨域資源共享"(Cross-origin resource sharing)。它允許瀏覽器向跨源(協議 + 域名 + 端口)服務器,發出XMLHttpRequest請求,從而克服了AJAX只能同源使用的限制.
跨域請求在java spring MVC中的實現:
Spring MVC HandlerMapping 接口對CORS提供了一個內部支持,在成功的映射到一個處理器的請求之后,HanderMapping接口檢查CORS的請求配置文件,然后采取下一步行動,預檢(Preflight)請求能夠被直接的處理,而簡單和直接的CORS請求將會被攔截和經過驗證,同時還需要CORS請求頭的進一步設置。
因此,為了確保能夠實現跨域請求,在請求頭中會加入Origin這一字段,來實現跨域請求,同時對於不同的主機而言請求頭是不一樣的。你必須有一些明確的聲明的配置文件,如果相應的CORS的配置文件沒有找到的話,預檢請求將會被拒絕,同時請求頭也不會加到相應的響應當中。每一個
HandlerMapping能夠被獨立的配置帶着基於
CorsConfiguration
映射的url模式。通常情況下應用使用MVC Java的配置文件或者XML命名空間來聲明這樣的映射。通常情況下能夠使每一個單一的map映射通過所有的HandlerMapping實例。
@CrossOrigin:
這個注解能夠使跨域請求實現在注解控制器里面:主要的實現方法如下:
@RequestMapping("/account")
public class AccountController {
@GetMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
public void remove(@PathVariable Long id) {
// ...
}
}
默認情況下上述注解還實現了以下功能:
1 :所有的origin請求字段。
2:所有的請求頭。
3: 所有的被映射的HTTP方法。
同時@Crossorigin繼承所有的類和方法,相關的示例如下:
@CrossOrigin(origins = "https://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) {
// ...
}
}
全局配置:
默認情況下,全局配置需要能夠滿足以下幾點:
1 :所有的:Ogrigin字段
2:所有的請求頭。
3 :GET HEAD 和POST 方法。
為了能夠使CORS(跨域請求)在MVC 的Java 的配置文件里面配置,你需要使用CorsRegistry回調接口,具體的實現例子如下:
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("https://domain2.com")
.allowedMethods("PUT", "DELETE")
.allowedHeaders("header1", "header2", "header3")
.exposedHeaders("header1", "header2")
.allowCredentials(true).maxAge(3600);
// Add more mappings...
}
}
XML配置:
為了能夠使CORS(跨域請求)實現在XML的命名空間需要使用<mvc:cors>組件元素,具體的實現例子如下:
<mvc:cors>
<mvc:mapping path="/api/**"
allowed-origins="https://domain1.com, https://domain2.com"
allowed-methods="GET, PUT"
allowed-headers="header1, header2, header3"
exposed-headers="header1, header2" allow-credentials="true"
max-age="123" />
<mvc:mapping path="/resources/**"
allowed-origins="https://domain1.com" />
</mvc:cors>
CORS Fliter:
你可以使跨域請求內置在CorsFliter類當中(即跨域過濾器)。實現配置這個過濾器,CorsConfigurationSource及其構造函數。相關的示例如下:
CorsConfiguration config = new CorsConfiguration();
// Possibly...
// config.applyPermitDefaultValues()
config.setAllowCredentials(true);
config.addAllowedOrigin("https://domain1.com");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
CorsFilter filter = new CorsFilter(source);
默認情況下上述注解還實現了以下功能:
1 :所有的origin請求字段。
2:所有的請求頭。
3: 所有的被映射的HTTP方法。
同時@Crossorigin繼承所有的類和方法,相關的示例如下:
@CrossOrigin(origins = "https://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) { // ...
} }
全局配置:
默認情況下,全局配置需要能夠滿足以下幾點:
1 :所有的:Ogrigin字段
2:所有的請求頭。
3 :GET HEAD 和POST 方法。
為了能夠使CORS(跨域請求)在MVC 的Java 的配置文件里面配置,你需要使用CorsRegistry回調接口,具體的實現例子如下:
@Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/api/**") .allowedOrigins("https://domain2.com") .allowedMethods("PUT", "DELETE") .allowedHeaders("header1", "header2", "header3") .exposedHeaders("header1", "header2") .allowCredentials(true).maxAge(3600); // Add more mappings...
} }
XML配置:
為了能夠使CORS(跨域請求)實現在XML的命名空間需要使用<mvc:cors>組件元素,具體的實現例子如下:
<mvc:cors>
<mvc:mapping path="/api/**" allowed-origins="https://domain1.com, https://domain2.com" allowed-methods="GET, PUT" allowed-headers="header1, header2, header3" exposed-headers="header1, header2" allow-credentials="true" max-age="123" />
<mvc:mapping path="/resources/**" allowed-origins="https://domain1.com" />
</mvc:cors>
CORS Fliter:
你可以使跨域請求內置在CorsFliter類當中(即跨域過濾器)。實現配置這個過濾器,CorsConfigurationSource及其構造函數。相關的示例如下:
CorsConfiguration config = new CorsConfiguration(); // Possibly... // config.applyPermitDefaultValues()
config.setAllowCredentials(true); config.addAllowedOrigin("https://domain1.com"); config.addAllowedHeader("*"); config.addAllowedMethod("*"); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", config); CorsFilter filter = new CorsFilter(source);