CORS在Spring中的實現

CORS:

一般狀況下瀏覽器禁止AJAX從外部獲取資源,所以就衍生了CORS這一標準體系,來實現跨域請求。java

CORS是一個W3C標準,全稱是"跨域資源共享"(Cross-origin resource sharing)。它容許瀏覽器向跨源(協議 + 域名 + 端口)服務器,發出XMLHttpRequest請求,從而克服了AJAX只能同源使用的限制.web

跨域請求在java spring MVC中的實現:

Spring MVC HandlerMapping 接口對CORS提供了一個內部支持,在成功的映射到一個處理器的請求以後,HanderMapping接口檢查CORS的請求配置文件,而後採起下一步行動,預檢(Preflight)請求可以被直接的處理,而簡單和直接的CORS請求將會被攔截和通過驗證,同時還須要CORS請求頭的進一步設置。所以,爲了確保可以實現跨域請求,在請求頭中會加入Origin這一字段,來實現跨域請求,同時對於不一樣的主機而言請求頭是不同的。你必須有一些明確的聲明的配置文件,若是相應的CORS的配置文件沒有找到的話,預檢請求將會被拒絕,同時請求頭也不會加到相應的響應當中。每個HandlerMapping可以被獨立的配置帶着基於CorsConfiguration映射的url模式。一般狀況下應用使用MVC Java的配置文件或者XML命名空間來聲明這樣的映射。一般狀況下可以使每個單一的map映射經過全部的HandlerMapping實例。spring

 

@CrossOrigin:

這個註解可以使跨域請求實如今註解控制器裏面:主要的實現方法以下:api

@RestController
@RequestMapping("/account")
public class AccountController {
    @CrossOrigin
    @GetMapping("/{id}")
    public Account retrieve(@PathVariable Long id) {
        // ...
    }
    @DeleteMapping("/{id}")
    public void remove(@PathVariable Long id) {
        // ...
    }
}
 

默認狀況下上述註解還實現瞭如下功能:跨域

1 :全部的origin請求字段。瀏覽器

2:全部的請求頭。服務器

3: 全部的被映射的HTTP方法。mvc

同時@Crossorigin繼承全部的類和方法,相關的示例以下:app

@CrossOrigin(origins = "https://domain2.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {
cors

    @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);
相關文章
相關標籤/搜索