SpringBoot允許跨域訪問

該文章轉(zhuǎn)至SpringBoot官網(wǎng) http://spring.io/blog/2015/06/08/cors-support-in-spring-framework

現(xiàn)在開發(fā)的項目一般都是前后端分離的項目,所以跨域訪問會經(jīng)常使用。

出于安全原因,瀏覽器禁止對駐留在當(dāng)前源之外的資源進(jìn)行AJAX調(diào)用。例如,當(dāng)您在一個標(biāo)簽中檢查您的銀行帳戶時,您可以將evil.com網(wǎng)站放在另一個標(biāo)簽中。來自evil.com的腳本不能使用您的憑據(jù)向您的銀行API(從您的帳戶中提取資金?。┌l(fā)出AJAX請求。

跨源資源共享(CORS)是大多數(shù)瀏覽器實現(xiàn)的W3C規(guī)范,允許您以靈活的方式指定授權(quán)的跨域請求類型,而不是使用IFrame或JSONP等安全性較低且功能較弱的黑客。

Spring Framework 4.2 GA為開箱即用的CORS提供了一流的支持,為您提供了比典型的基于過濾器的解決方案更簡單,更強(qiáng)大的配置方式。

Spring MVC提供了高級配置工具,如下所述。

控制器方法CORS配置

您可以在@RequestMapping注釋的處理程序方法中添加@CrossOrigin注釋,以便在其上啟用CORS(默認(rèn)情況下@CrossOrigin允許@RequestMapping注釋中指定的所有源和HTTP方法):

@RestController
@RequestMapping("/account")
public class AccountController {

    @CrossOrigin
    @GetMapping("/{id}")
    public Account retrieve(@PathVariable Long id) {
        // ...
    }

    @DeleteMapping("/{id}")
    public void remove(@PathVariable Long id) {
        // ...
    }
}

也可以為整個控制器啟用CORS:

@CrossOrigin(origins = "http://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) {
        // ...
    }
}

在此示例中,為兩個retrieve()remove()處理程序方法啟用了CORS支持,您還可以了解如何使用@CrossOrigin屬性自定義CORS配置。

您甚至可以使用控制器和方法級別的CORS配置,然后Spring將組合兩個注釋屬性以創(chuàng)建合并的CORS配置。

@CrossOrigin(maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {

    @CrossOrigin(origins = "http://domain2.com")
    @GetMapping("/{id}")
    public Account retrieve(@PathVariable Long id) {
        // ...
    }

    @DeleteMapping("/{id}")
    public void remove(@PathVariable Long id) {
        // ...
    }
}

如果您使用的是Spring Security,請確保在Spring Security級別啟用CORS,以允許它利用Spring MVC級別定義的配置。

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors().and()...
    }
}

全局CORS配置

除了細(xì)粒度的基于注釋的配置之外,您可能還需要定義一些全局CORS配置。這類似于使用過濾器,但可以使用Spring MVC聲明并結(jié)合細(xì)粒度@CrossOrigin配置。默認(rèn)情況下GET,允許所有原點HEADPOST方法。

JavaConfig

為整個應(yīng)用程序啟用CORS非常簡單:

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**");
    }
}

如果您使用的是Spring Boot,建議您將WebMvcConfigurerbean 聲明如下:

@Configuration
public class MyConfiguration {

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**");
            }
        };
    }
}

您可以輕松更改任何屬性,并僅將此CORS配置應(yīng)用于特定路徑模式:

@Override
public void addCorsMappings(CorsRegistry registry) {
    registry.addMapping("/api/**")
        .allowedOrigins("http://domain2.com")
        .allowedMethods("PUT", "DELETE")
            .allowedHeaders("header1", "header2", "header3")
        .exposedHeaders("header1", "header2")
        .allowCredentials(false).maxAge(3600);
}

如果您使用的是Spring Security,請確保在Spring Security級別啟用CORS,以允許它利用Spring MVC級別定義的配置。

XML命名空間

也可以使用mvc XML名稱空間配置CORS 。

這種最小的XML配置在/**路徑模式上啟用CORS ,其默認(rèn)屬性與JavaConfig相同:

<mvc:cors>
    <mvc:mapping path="/**" />
</mvc:cors>

也可以使用自定義屬性聲明多個CORS映射:

<mvc:cors>

    <mvc:mapping path="/api/**"
        allowed-origins="http://domain1.com, http://domain2.com"
        allowed-methods="GET, PUT"
        allowed-headers="header1, header2, header3"
        exposed-headers="header1, header2" allow-credentials="false"
        max-age="123" />

    <mvc:mapping path="/resources/**"
        allowed-origins="http://domain1.com" />

</mvc:cors>

如果您使用的是Spring Security,請不要忘記在Spring Security級別啟用CORS

<http>
    <!-- Default to Spring MVC's CORS configuration -->
    <cors />
    ...
</http>

它是如何工作的?

CORS請求(包括帶有OPTIONS方法的預(yù)檢)會自動發(fā)送到各個HandlerMapping已注冊的請求。由于CorsProcessor實現(xiàn)(默認(rèn)情況下為DefaultCorsProcessor),它們處理CORS預(yù)檢請求并攔截CORS簡單和實際請求,以便添加相關(guān)的CORS響應(yīng)頭(如Access-Control-Allow-Origin)。CorsConfiguration允許您指定如何處理CORS請求:允許的起源,標(biāo)題,方法等。它可以以各種方式提供:

基于過濾器的CORS支持

作為上述其他方法的替代方案,Spring Framework還提供了CorsFilter。在這種情況下,您可以在Spring Boot應(yīng)用程序中聲明過濾器,而不是使用@CrossOriginWebMvcConfigurer#addCorsMappings(CorsRegistry)

@Configuration
public class MyConfiguration {

    @Bean
    public FilterRegistrationBean corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        config.addAllowedOrigin("http://domain1.com");
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        source.registerCorsConfiguration("/**", config);
        FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
        bean.setOrder(0);
        return bean;
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,612評論 19 139
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong閱讀 22,943評論 1 92
  • 要加“m”說明是MB,否則就是KB了. -Xms:初始值 -Xmx:最大值 -Xmn:最小值 java -Xms1...
    阿B和阿C閱讀 7,535評論 0 7
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,275評論 6 342
  • 準(zhǔn)備材料: 韓國辣白菜,洗米水(約500毫升),土豆,洋蔥,黃豆芽,金針菇,豆腐,五花肉/牛肉 調(diào)料:大蔥,辣椒粉...
    柒子如期閱讀 230評論 0 0

友情鏈接更多精彩內(nèi)容