1. 程式人生 > >SpringBoot下如何配置實現跨域請求?

SpringBoot下如何配置實現跨域請求?

最近在做的專案中,我們採用前後端分離式開發。後臺RequestController介面寫好後,通過另一臺電腦的前端介面用ajax訪問我電腦上的後臺服務介面時,http請求會返回500的錯誤。經過查閱資料得知,這個問題是由“跨域請求”所引起的。那麼這個“跨域”到底是什麼呢?

一、什麼是跨域請求?

跨域請求,就是說瀏覽器在執行指令碼檔案的ajax請求時,指令碼檔案所在的服務地址和請求的服務地址不一樣。說白了就是ip、網路協議、埠都一樣的時候,就是同一個域,否則就是跨域。這是由於Netscape提出一個著名的安全策略——同源策略造成的,這是瀏覽器對JavaScript施加的安全限制。是防止外網的指令碼惡意攻擊伺服器的一種措施。

二、SpringBoot工程如何解決跨域問題?

那麼如何在SpringBoot中處理跨域問題呢?方法有很多,這裡著重講一種——利用@Configuration配置跨域。
程式碼實現如下:

/**
 * Created by myz on 2017/7/10.
 *
 * 設定跨域請求
 */
@Configuration
public class CorsConfig {
    private CorsConfiguration buildConfig() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("*"
); // 1 設定訪問源地址 corsConfiguration.addAllowedHeader("*"); // 2 設定訪問源請求頭 corsConfiguration.addAllowedMethod("*"); // 3 設定訪問源請求方法 return corsConfiguration; } @Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**"
, buildConfig()); // 4 對介面配置跨域設定 return new CorsFilter(source); } }

這裡最重要程式碼是

corsConfiguration.addAllowedOrigin("*"); // 1 設定訪問源地址
corsConfiguration.addAllowedHeader("*"); // 2 設定訪問源請求頭
corsConfiguration.addAllowedMethod("*"); // 3 設定訪問源請求方法
source.registerCorsConfiguration("/**", buildConfig()); // 4 對介面配置跨域設定

“*”代表全部。”**”代表適配所有介面。
其中addAllowedOrigin(String origin)方法是追加訪問源地址。如果不使用”*”(即允許全部訪問源),則可以配置多條訪問源來做控制。
例如:

corsConfiguration.addAllowedOrigin("http://www.aimaonline.cn/"); 
corsConfiguration.addAllowedOrigin("http://test.aimaonline.cn/"); 

addAllowedOrigin是追加訪問源地址,而setAllowedOrigins是可以直接設定多條訪問源。
但是有一點請注意,我檢視setAllowedOrigins方法原始碼時發現,原始碼如下

public void setAllowedOrigins(List<String> allowedOrigins) {
        this.allowedOrigins = allowedOrigins != null?new ArrayList(allowedOrigins):null;
}

根據原始碼可以得知,setAllowedOrigins會覆蓋this.allowedOrigins。所以在配置訪問源地址時,
addAllowedOrigin方法要寫在setAllowedOrigins後面,當然了,一般情況下這兩個方法也不會混著用。

addAllowedHeader、addAllowedMethod、registerCorsConfiguration方法和addAllowedOrigin的原始碼差不太多,這裡就不一一介紹了。感興趣的朋友可以自行查閱。

三、其他實現跨域請求方法

例如在介面上使用@CrossOrgin註解:

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

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

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

對於上述程式碼,官方給出如下一段說明:

You can add to your @RequestMapping annotated handler method a @CrossOrigin annotation in order to enable CORS on it (by default @CrossOrigin allows all origins and the HTTP methods specified in the @RequestMapping annotation).

意思就是可以直接在@RequestMapping介面上使用@CrossOrigin實現跨域。@CrossOrigin預設允許所有訪問源和訪問方法。

還有一種方法是直接對整個Controller進行跨域設定:

@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) {
        // ...
    }
}

這裡,可以對@CrossOrigin設定特定的訪問源,而不是使用預設配置。

以上就是對SpringBoot下配實現跨域請求的介紹。

相關推薦

SpringBoot如何配置實現請求

最近在做的專案中,我們採用前後端分離式開發。後臺RequestController介面寫好後,通過另一臺電腦的前端介面用ajax訪問我電腦上的後臺服務介面時,http請求會返回500的錯誤。經過查閱資料得知,這個問題是由“跨域請求”所引起的。那麼這個“跨域”到底

Vue前端配置代理實現請求

跨域的解決方法:         *設定讓伺服器允許跨域         *前端配置代理實現跨域請求 本文介紹前端配置代理實現跨域請求:  在專案config資料

為 RESTful API 配置 CORS 實現請求

利用 Ruby on Rails 可以很方便地實現 RESTful API,但如果我們需要通過 AJAX 跨域呼叫的話,怎麼辦? 說到 AJAX 跨域,很多人最先想到的是 JSONP。的確,JSONP 我們已經十分熟悉,也使用了多年,從本質上講,JSONP 的原理是給頁

利用jsonp實現請求

get p地址 doc ajax請求 -s tar 原理 安全策略 都是   同源策略,它是由Netscape提出的一個著名的安全策略。現在所有支持JavaScript 的瀏覽器都會使用這個策略。所謂同源是指,域名,協議,端口相同。當一個瀏覽器的兩個tab頁中分別打開來 百

ajax獲取json數據及實現請求

cgi size 域名 3.2 方便 nap 不清楚 anti dex 最近想練習一下ajax獲取json數據 , 首先上網找一些在線的可用來測試的接口. -----------------------------------------------------這裏是接口分

[轉] 利用CORS實現請求

src 流程圖 exp 否則 expose 前端 eof 目前 star [From] http://newhtml.net/using-cors/ 跨域請求一直是網頁編程中的一個難題,在過去,絕大多數人都傾向於使用JSONP來解決這一問題。不過現在,我們可以考慮一下

springMVC前後端分離開發模式支持請求

xtend pat OS ping ioe exc auth ava request 1、web.xml中添加cors規則支持(請修改包名) <filter> <filter-name>cors</filter-name>

vue-cli項目本地代理實現請求

con 跨域 請求 AR url 本地 dex ams gin   使用 Vue-cli 創建的項目,開發地址是 localhost:8080,需要訪問非本機上的接口http://10.1.0.34:8000/queryRole。不同域名之間的訪問,需要跨域才能正確請求。跨

django中配置允許請求

apps ons token middle red href clas cors nbsp 對於django 安裝django-cors-headers,詳情請看官方文檔 pip install django-cors-headers    配置settings.py

八種方式實現請求

防範 erro create ati brush col html5新特性 ole als 瀏覽器的同源策略 ? 提到跨域不能不先說一下”同源策略”。 ? 何為同源?只有當協議、端口、和域名都相同的頁面,則兩個頁面具有相同的源。只要網站的 協議名protocol、 主

WebAPI實現請求

一、跨域問題的由來     目前專案實現前後端分離,所以就會那麼此時前端和後端分別在不同的伺服器上,此時就會涉及到跨域問題。再具體說明一下。 1.前後端未分離:原來我們的積分系統採用MVC框架,整個系統的前端以及後端邏輯都在一個解決方案中,此時我們稱之為前後端沒有分離。

axios實現請求

在使用vue.js進行開發,我們會遇到跨域請求的情況,這裡記錄下自己所遇到的情況。 使用的是目前主流的axios進行請求,首先開啟config資料夾下的index檔案,在proxyTable裡面新增程式碼 proxyTable: { '/api': { t

vue2.0axios實現踩的坑

按踩坑順序敘述。本人對http瞭解太少,所以坑踩得較多。 1.開始進行跨域時,知道vue2.0官方推薦axios進行ajax請求,大致看一下https://www.npmjs.com/package/axios axios的用法,感覺挺好理解嘛,封裝的挺好,用時發現,不對啊。跨域設定在哪?最後找到

Vue前端服務代理實現請求資料。

開發中請求真實伺服器資料,配置伺服器代理實現跨域。 vue-cli + webpack 構建的專案 再 ./config/index.js 檔案中配置 proxyTable: { '/api':{ target: 'http://請求的伺服器地址',

Vue實現請求

實現跨域請求有兩種方式: 1、fetch (1)在App.vue中使用created方法建立fetch,將域名及方法等建立,如下圖 (2)在config配置檔案中的index.js中的跨域區域中寫入如下程式碼: (3)完善資訊,將介面相應的需求補充完整

Nginx:反向代理實現請求

如今,RestFul介面服務比較流行,應用通過一套Http的API,並用json或者xml作為互動的資料格式來提供服務。這麼做有效地實現了web專案,前後端的分離。從而使得架構更加開放,這套API可以同時給多套前端專案提供服務,包括web端和APP端。 什麼是跨域? 跨域

應用superagent實現請求

跨域: 瀏覽器對於javascript的同源策略的限制,例如a.cn下面的js不能呼叫b.cn中的js,物件或資料(因為a.cn和b.cn是不同域),所以跨域就出現了. 上面提到的,同域的概念又是什麼呢??? 簡單的解釋就是相同域名,埠相同,協議相同 同源策略:

使用JSONP實現請求

實現跨域請求的常用方式 1、跨域請求只針對瀏覽器,而不針對服務端,因此可以先請求同源的服務端,然後由該服務端發出跨域請求,得到資料後再返回給瀏覽器。 2、在服務端程式的響應頭資訊中新增Access-Control-Allow-Origin相關資訊。 3、使用&l

PHP AJAX JSONP實現請求

HTML頁面 $.ajax({ type : "post", url : "ajax.php", dataType : "jsonp", jsonp:

java伺服器端配置支援請求

前言:之前做好的登陸介面,剛剛拿去給前端呼叫。發現前端那邊報錯,無法調到介面。因為我們後端的介面是在一臺伺服器上,前端(使用的是nodejs)的程式碼在另一臺伺服器上,導致兩臺伺服器之間無法相互呼叫(伺服器我們使用的是tomcat 7)。所以為了解決這個問題,前端那邊在介面