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)前源之外的資源進行AJAX調(diào)用廊勃。例如较店,當(dāng)您在一個標(biāo)簽中檢查您的銀行帳戶時释树,您可以將evil.com網(wǎng)站放在另一個標(biāo)簽中杂穷。來自evil.com的腳本不能使用您的憑據(jù)向您的銀行API(從您的帳戶中提取資金W茵)發(fā)出AJAX請求拾碌。

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

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

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)系作者
  • 序言:七十年代末计技,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子睡雇,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件毁嗦,死亡現(xiàn)場離奇詭異芯急,居然都是意外死亡饼酿,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門喻犁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碌廓,“玉大人,你說我怎么就攤上這事跟匆∠肚幔” “怎么了垢揩?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵玖绿,是天一觀的道長。 經(jīng)常有香客問我叁巨,道長斑匪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任锋勺,我火速辦了婚禮蚀瘸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘庶橱。我一直安慰自己贮勃,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布苏章。 她就那樣靜靜地躺著寂嘉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪枫绅。 梳的紋絲不亂的頭發(fā)上泉孩,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機與錄音并淋,去河邊找鬼寓搬。 笑死,一個胖子當(dāng)著我的面吹牛县耽,可吹牛的內(nèi)容都是我干的句喷。 我是一名探鬼主播镣典,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼脏嚷!你這毒婦竟也來了骆撇?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤父叙,失蹤者是張志新(化名)和其女友劉穎神郊,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體趾唱,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡涌乳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了甜癞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片夕晓。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖悠咱,靈堂內(nèi)的尸體忽然破棺而出蒸辆,到底是詐尸還是另有隱情,我是刑警寧澤析既,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布躬贡,位于F島的核電站,受9級特大地震影響眼坏,放射性物質(zhì)發(fā)生泄漏拂玻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一宰译、第九天 我趴在偏房一處隱蔽的房頂上張望檐蚜。 院中可真熱鬧,春花似錦沿侈、人聲如沸闯第。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乡括。三九已至,卻和暖如春智厌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盲赊。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工铣鹏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人哀蘑。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓诚卸,卻偏偏與公主長得像葵第,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子合溺,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容

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