Vue axios與Go Frame后端框架的Options請求跨域問題

跨域問題可從前后兩端分開排查:

前端:Vue + axios

axios 請求頭使用 'Content-Type': 'application/json'桅锄,
并且在Header中設置了 Authorization 字段用于傳遞 Token,
參數(shù)未經(jīng) Qs 轉碼铁蹈,
使用以下代碼測試登錄接口:

// 為方便操作泄私,已將 axios 實例掛載到 this.$axios 上
this.$axios.post('/signin', {account: '', password: ''})
  .then(res => {
    console.log('成功:', res)
  })
  .catch(err => {
    console.log('失敗: ', err)
  })

出現(xiàn)如下錯誤:

Access to XMLHttpRequest at 'http://127.0.0.1:8080/api/v1/signin' from origin 'http://localhost:8081' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.

同時 POST 請求變成了 OPTIONS 請求粥烁,并且返回404棚瘟,如下圖:


2.png

這里有兩個問題拄丰,一個是為什么 POST 變成了 OPTIONS府树?URL 路徑?jīng)]錯,為什么又會返回 404料按?
POST 變 OPTIONS 問題涉及復雜跨域請求奄侠,符合以下任意一個條件的請求就算復雜請求:

  1. 使用了除 HEAD、GET载矿、POST之外的請求方法垄潮;
  2. 頭部字段不超出 Accept、Accept-Language闷盔、Content-Language弯洗、Last-Event-ID、Content-Type逢勾,并且 Content-Type 的值只限于 application/x-www-form-urlencoded牡整、multipart/form-data、text/plain溺拱;

由于設置的 Authorization 字段逃贝,Content-Type 也設置為了 application/json谣辞,因此這個請求算復雜跨域請求,會在正式通信前增加一次 OPTIONS 查詢請求沐扳,稱為"預檢"請求(preflight request)潦闲,用于向服務器請求權限等信息,預檢請求被成功響應后迫皱,才會發(fā)出真實的 POST 請求歉闰。

可為什么 OPTIONS 請求返回 404 呢?
通過上面的錯誤說明及分析卓起,答案應該很清晰了和敬,就是服務端路由未對 OPTIONS 類型請求做出響應,導致 404 的情況戏阅。

后端:GoFrame

GoFrame 的路由代碼如下:

func init() {
  s := g.Server()
  // 綁定 CORS 中間件
  s.BindMiddleware("/api/*", middleware.CORS)
  s.Group("/api", func(group *ghttp.RouterGroup) {
    ...
    // 重點:此路由僅支持 POST
    group.POST("/signin", userController, "SignIn")
  }
}

/signin 的路由指定了請求方式為 POST昼弟,自然無法響應其他類型的請求,使用如下方式定義倒是可響應所有類型的請求:

group.ALL("/signin", userController, "SignIn") 

這樣就使該路由支持所有的請求方法奕筐,但需要在控制器的 SignIn 方法中做判斷需要響應哪些類型的請求舱痘,很繁瑣,不推薦此方式离赫。

其實只要在 CORS 中間件中對 OPTIONS 請求做統(tǒng)一響應即可芭逝,上代碼:

// CORS 允許接口跨域請求
func CORS(r *ghttp.Request) {
  // 使用框架默認的 CORS 設置
  r.Response.CORSDefault()
  if r.Method == "OPTIONS" {
    r.Response.WriteStatusExit(http.StatusOK)
  } else {
    r.Middleware.Next()
  }
}

另外需要注意的是,使用 GoFrame 框架渊胸,CORS 中間件要在全局添加旬盯,如果在路由組中添加,同樣會出現(xiàn) OPTIONS 請求 404 的情況翎猛,而且中間件的代碼在請求過程中未執(zhí)行胖翰,原因暫不清楚,還需要多了解下框架切厘。

本文描述的跨域問題是在網(wǎng)頁上使用 Vue + axios 時出現(xiàn)的萨咳,使用 Postman 工具調(diào)試則一切正常,這里記錄下排查過程和解決方法疫稿,希望能幫到有需要的童鞋培他,有任何問題可以在評論里一起討論下。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末而克,一起剝皮案震驚了整個濱河市靶壮,隨后出現(xiàn)的幾起案子怔毛,更是在濱河造成了極大的恐慌员萍,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拣度,死亡現(xiàn)場離奇詭異碎绎,居然都是意外死亡螃壤,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門筋帖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奸晴,“玉大人,你說我怎么就攤上這事日麸〖奶洌” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵代箭,是天一觀的道長墩划。 經(jīng)常有香客問我,道長嗡综,這世上最難降的妖魔是什么乙帮? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮极景,結果婚禮上察净,老公的妹妹穿的比我還像新娘。我一直安慰自己盼樟,他們只是感情好氢卡,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著晨缴,像睡著了一般异吻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上喜庞,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天诀浪,我揣著相機與錄音,去河邊找鬼延都。 笑死雷猪,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的晰房。 我是一名探鬼主播求摇,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼殊者!你這毒婦竟也來了与境?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤猖吴,失蹤者是張志新(化名)和其女友劉穎摔刁,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體海蔽,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡共屈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年绑谣,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拗引。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡借宵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出矾削,到底是詐尸還是另有隱情壤玫,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布哼凯,位于F島的核電站垦细,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏挡逼。R本人自食惡果不足惜括改,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望家坎。 院中可真熱鬧嘱能,春花似錦、人聲如沸虱疏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽做瞪。三九已至对粪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間装蓬,已是汗流浹背著拭。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留牍帚,地道東北人儡遮。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像暗赶,于是被迫代替她去往敵國和親鄙币。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

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