最近在做乙個前後端分離的專案,前台頁面是配置在公司cms系統上的,本來我沒有特別留意這類專案會有什麼特殊性,像往常一樣開發著介面,也用到session去做驗證碼的儲存和校驗。但是在實際聯調時,一開始就碰到了問題:跨域的ajax請求進了後台controller,**業務也走完了,前台卻沒有任何返回也不報錯。當時知道是跨域引起的,前台沒有任何返回應該瀏覽器因為安全性問題做了攔截;跨域的解決方案很多,可以自己寫過濾器做處理,但是我們一般使用前人留下的寶藏很少自己現挖,這類過濾器很多,甚至tomcat都自己帶了,都是大同小異的,其中以thetransactioncompany公司的開源包使用最多。
首先需要在pom中引入包:
com.thetransactioncompany
cors-filter
2.5
然後只需要在web.xml裡面配置上這個filter:
/cre/api/*上述配置都是什麼意思呢:
非跨域請求是否可以通過此過濾器,預設為true;如果設定為false,則只有跨域的請求被允許。
cors.alloworigin
設定可以http請求origin屬性訪問的白名單,用逗號分隔的方式來設定,* 號代表全部允許,預設為 * ,比如:
cors.allowsubdomains
是否允許來自alloworigin的子網域名稱的請求,預設不允許;子網域名稱的概念大家應該清楚,www.example.com是example.com的子網域名稱。
cors.allowed.methods
允許的http方法,可用逗號分隔,可選的列舉值為:get, post, head, options;
cors.supportedheaders
允許的請求頭,可用逗號分隔,*號代表全部允許,預設 *。比如:origin,accept. defaults: origin, accept, x-requested-with, content-type, access-control-request-method, access-control-request-headers;不被允許的請求頭將無法傳入,這些請求頭會在預飛相應頭中以access-control-allow-headers返回回去供呼叫者檢視。
cors.exposedheaders
除了上面的頭資訊,這邊可設定允許的自定義的複雜頭資訊,使用逗號分隔,不設定則預設為空。比如:x-custom-header-ping,x-custom-header-pong,這些請求頭會在預飛相應頭中以 access-control-expose-headers 返回回去供呼叫者檢視。
cors.supportscredentials
指示是否支援使用者憑據(如cookie、http身份驗證或客戶端證書)。cors系統的過濾器使用此值在構建訪問控制允許憑據頭。預設為true
cors.maxage
瀏覽器快取預飛請求的結果的最長時間,如果設為-1,則使用 access-control-max-age頭來傳遞。推薦設定為3600,即快取一小時
cors.tagrequests
是否將cors特有的屬性傳遞給下游處理器做處理,預設為false
看完上面的說明,大家應該了解了各個引數的含義,其實跨域的請求時很複雜的,攤開來講的話可以講很多。跨域的解決方案也很多,比如大家最愛用的jsonp。跨域不是所有瀏覽器都支援的,支援cors的瀏覽器有
cors的請求方式分兩種:簡單請求和非簡單請求。
簡單請求滿足下列兩點:
其他情況都屬於非簡單請求。
像目前比較常用的json-p來進行get方法的跨域,用的就是簡單請求。但是如果用json,那肯定就是非簡單請求了。
簡單請求已經可以解決我們的大多數問題,而非簡單請求則複雜的多,在真正的請求前會傳送一次prefightrequest 預飛請求,伺服器給他返回乙個prefightresponse預飛響應,通過這次預飛請求和響應,它就做好了所有的驗證的工作,驗證此請求是否能夠符合上述的一堆的限制條件,如果符合條件,則發起第二次請求,第二次請求才是真正的業務請求。
再回到上面的問題,我們在做乙個驗證碼校驗的功能,生成的驗證碼放在了session裡,提交ajax請求時再從session中獲取驗證碼與使用者輸入端的進行驗證。session需要cookie做支撐,如果需要跨域請求攜帶cookie,我們看完上面的配置講解應該很清楚了,只需要cors.supportscredentials設定為true即可。配置完後我們發現還是獲取不到正確的session,那是我們的ajax還有一處配置需要設定:
$.ajax(,
crossdomain: true,
//跨域支援 end
success:function(result),
error:function()
});
spring 5對cors提供了支援,也提供了更友好的api,具體可參考此部落格
官方文件》20-cors-支援/#more-33240
Springboot跨域請求配置
有多種方式 暫寫全域性配置的一種 加入配置 package com.a.a.common.config import org.springframework.boot.web.servlet.filterregistrationbean import org.springframework.cont...
beego跨域請求配置
不說廢話 在main函式前加入如下 func init beego.insertfilter beego.beforerouter,filtergateway 路由設定 ns beego.newnamespace v1 用於跨域請求 beego.nsrouter controllers.baseco...
ajax的跨域和非跨域請求
get請求 測試json資料 伺服器端 controller 中 responsebody public listshowdepart post請求 function fasongdata 傳入後台資料 success function data else error function 表單 con...