跨域是指:瀏覽器A從服務器B獲取的靜態資源,包括Html、Css、Js,而後在Js中經過Ajax訪問C服務器的靜態資源或請求。即:瀏覽器A從B服務器拿的資源,資源中想訪問服務器C的資源。前端
同源策略是指:瀏覽器A從服務器B獲取的靜態資源,包括Html、Css、Js,爲了用戶安全,瀏覽器加了限制,其中的Js經過Ajax只能訪問B服務器的靜態資源或請求。即:瀏覽器A從哪拿的資源,那資源中就只能訪問哪。java
同源是指:同一個請求協議(如:Http或Https)、同一個Ip、同一個端口,3個所有相同,即爲同源。後端
跨域的這種需求仍是有的,所以,W3C組織制定了一個Cross-Origin Resource Sharing規範,簡寫爲Cors
,如今這個規範已經被大多數瀏覽器支持,從而,處理跨域的需求。api
Cors須要在後端應用進行配置,所以,是一種跨域的後端處理方式,這麼作也容易理解,一個你不認識的源來訪問你的應用,天然須要應用進行受權。除了後端處理方式,也有前端的解決方案,如:JSONP,因這裏咱們主要講解SpringBoot2.x對Cors的配置,暫不對前端解決方案進行詳細說明。跨域
跨域分爲如下3種數組
名稱 | 英文名 | 說明 |
---|---|---|
簡單請求 | Simple Request | 發起的Http請求符合: 1.無自定義請求頭, 2.請求動詞爲GET、HEAD或POST之一, 3.動詞爲POST時,Content-Type是application/x-www-form-urlencoded, multipart/form-data或text/plain之一 |
預檢請求 | Preflighted Request | 發起的Http請求符合其中之一: 1.包含了自定義請求頭, 2.請求動詞不是GET、HEAD或POST, 3.動詞是POST時, Content-Type不是application/x-www-form-urlencoded, multipart/form-data或text/plain。 即:簡單請求的相反 |
憑證請求 | Requests with Credential | 發起的Http請求中帶有憑證 |
@RestController @RequestMapping(value = "/api/users") @CrossOrigin public class UsersController{ @Autowired private UsersService usersService; @PostMapping @CrossOrigin public User create(@RequestBody User user) { return userService.save(user); } }
其中,@CrossOrigin註解能夠使用如下參數瀏覽器
名稱 | 類型 | 範圍 | 必填 | 請求頭字段 |
---|---|---|---|---|
value | String數組 | 類或方法 | 是 | Access-Control-Allow-Origin |
origins | String數組 | 類或方法 | 是,同value,能夠二選一 | Access-Control-Allow-Origin |
methods | String數組 | 類或接口 | 是 | Access-Control-Allow-Methods |
maxAge | long | 類或接口 | 否 | Access-Control-Max-Age |
allowCredentials | String | 類或接口 | 否 | Access-Control-Allow-Credentials |
allowedHeaders | String數組 | 類或接口 | 否 | Access-Control-Request-Headers |
exposedHeaders | String數組 | 類或接口 | 否 | Access-Control-Expose-Headers |
*
表示容許所有的域名@Configuration public class MyConfiguration { @Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurer() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/api/**") .allowedOrigins("*") .allowCredentials(true) .allowedMethods("GET", "POST", "DELETE", "PUT","PATCH") .maxAge(3600); } }; } }
或者這個方式:安全
@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE") .maxAge(3600) .allowCredentials(true); } }
其中,經過相應的方法實現跨域請求的配置服務器
方法類 | 方法名稱 | 必填 | 請求頭字段 | 說明 |
---|---|---|---|---|
CorsRegistry | addMapping | 是 | 無, 非Cors屬性, 屬於SpringBoot配置 |
配置支持跨域的路徑 |
CorsRegistration | allowedOrigins | 是 | Access-Control-Allow-Origin | 配置容許的源 |
CorsRegistration | allowedMethods | 是 | Access-Control-Allow-Methods | 配置支持跨域請求的方法, 如:GET、POST,一次性返回 |
CorsRegistration | maxAge | 否 | Access-Control-Max-Age | 配置預檢請求的有效時間 |
CorsRegistration | allowCredentials | 否 | Access-Control-Allow-Credentials | 配置是否容許發送Cookie, 用於 憑證請求 |
CorsRegistration | allowedHeaders | 否 | Access-Control-Request-Headers | 配置容許的自定義請求頭, 用於 預檢請求 |
CorsRegistration | exposedHeaders | 否 | Access-Control-Expose-Headers | 配置響應的頭信息, 在其中能夠設置其餘的頭信息 |