CORS在Spring中的實現


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:

這個注解能夠使跨域請求實現在注解控制器里面:主要的實現方法如下:

@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方法。

同時@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);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM