springboot 跨域配置cors

1 跨域的理解

跨域是指:瀏覽器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個所有相同,即爲同源。後端

2 跨域的處理

跨域的這種需求仍是有的,所以,W3C組織制定了一個Cross-Origin Resource Sharing規範,簡寫爲Cors,如今這個規範已經被大多數瀏覽器支持,從而,處理跨域的需求。api

Cors須要在後端應用進行配置,所以,是一種跨域的後端處理方式,這麼作也容易理解,一個你不認識的源來訪問你的應用,天然須要應用進行受權。除了後端處理方式,也有前端的解決方案,如:JSONP,因這裏咱們主要講解SpringBoot2.x對Cors的配置,暫不對前端解決方案進行詳細說明。跨域

3 跨域的分類

跨域分爲如下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請求中帶有憑證

4 SpringBoot2.x配置Cors

@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
  • 備註說明
  1. value、origins屬性:配置容許訪問的源,如: http://anxminise.cc,*表示容許所有的域名
  2. methods屬性:配置跨域請求支持的方式,如:GET、POST,且一次性返回所有支持的方式
  3. maxAge屬性:配置預檢請求的有效時間, 單位是秒,表示:在多長時間內,不須要發出第二次預檢請求
  4. allowCredentials屬性:配置是否容許發送Cookie,用於 憑證請求, 默認不發送cookie
  5. allowedHeaders屬性:配置容許的自定義請求頭,用於 預檢請求
  6. exposedHeaders屬性:配置響應的頭信息, 在其中能夠設置其餘的頭信息,不進行配置時, 默承認以獲取到Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma字段

 使用WebMvcConfigurer對象

@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 配置響應的頭信息,  在其中能夠設置其餘的頭信息
相關文章
相關標籤/搜索