問題一:react 在跨域下,使用 axios,獲取 headers 中的 Authorization。問題二:Request header field Authorization is not...

這篇主要記錄2個(gè)由于跨域引起的問題

  1. react 在跨域下,使用axios,獲取headers中的Authorization
  2. 在能獲取到headers中的Authorization后,產(chǎn)生新的問題Request header field Authorization is not allowed by Access-Control-Allow-Headers in preflight response.

實(shí)際問題

在跨域的時(shí),客戶端能夠訪問到一些默認(rèn)響應(yīng)的headers:

  • Cache-Control
  • Content-Language
  • Content-Type
  • Expires
  • Last-Modified
  • Pragma

那么默認(rèn)情況下,客戶端只能訪問到以上headers...這是絕對(duì)不行的,因?yàn)槲覀円L問的是headers中的Authorization,axios的配置代碼如下(部分),

axios.interceptors.response.use((res) => {
    // do something
    // 默認(rèn)情況下 res.headers.authorization 的值是undefined,headers中沒有authorization
    if (res.headers.authorization) {
        sessionStorage.setItem('authorization', res.headers.authorization);
    }
    // do something
}

解決問題一辦法

在服務(wù)端添加addHeader,請(qǐng)看這篇,服務(wù)端添加header。

response.addHeader("Access-Control-Expose-Headers", "Authorization");

這個(gè)Access-Control-Expose-Headers的作用是:
Access-Control-Expose-Headers相當(dāng)于一個(gè)服務(wù)器的headers白名單,可以讓客戶端進(jìn)行訪問例如:

Access-Control-Expose-Headers: X-My-Custom-Header, X-Another-Custom-Header

這樣設(shè)置完后 X-My-Custom-Header and X-Another-Custom-Header 就能被客戶端所訪問。

解決完獲取res.headers.authorization 的值為undefined的問題,又有個(gè)新的問題。就是Request header field Authorization is not allowed by Access-Control-Allow-Headers in preflight response.

解決問題二辦法

在服務(wù)端的Access-Control-Allow-Headers中添加 Authorization,完美解決,例如:

String allowHeaders = "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With, Authorization";
response.addHeader("Access-Control-Allow-Headers", allowHeaders);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 前端程序使用ExtJS的寫,在本地測(cè)試,發(fā)送請(qǐng)求到服務(wù)器時(shí),發(fā)現(xiàn)存在跨域的問題,餅干也沒有一套成功,于是乎在這里整...
    南濱月亮閱讀 1,523評(píng)論 0 1
  • XMLHttpRequest的跨域請(qǐng)求 動(dòng)態(tài)添加一個(gè)標(biāo)簽,而script標(biāo)簽的src屬性是沒有跨域的限制的。這樣說...
    葛高召閱讀 22,545評(píng)論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,886評(píng)論 18 139
  • 1、vue中axios不支持vue.use()方式聲明使用。 所以有兩種方法可以解決這點(diǎn): 第一種: 在main....
    你好陌生人丶閱讀 3,619評(píng)論 0 7
  • 引用自HTTP訪問控制(CORS) 當(dāng) Web 資源請(qǐng)求由其它域名或端口提供的資源時(shí),會(huì)發(fā)起跨域 HTTP 請(qǐng)求(...
    有涯逐無涯閱讀 2,604評(píng)論 0 4