91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

碰到一個ant design跨域問題

發布時間:2020-07-10 01:01:21 來源:網絡 閱讀:12449 作者:netbird_fly 欄目:開發技術

今天碰到了一個跨域問題,折騰了半天,終于解決了。


項目背景:采用前端模版框架ant design的腳手架antd-admin做開發時,在本地做開發時,發現即使設置成post方法,也會通過get發送請求。逐步查詢發現采用的都是JSONP格式請求。而JSONP的缺點則是:它只支持GET請求而不支持POST等其它類型的HTTP請求;它只支持跨域HTTP請求這種情況,不能解決不同域的兩個頁面之間如何進行JavaScript調用的問題。

于是查看util下面的request.js文件,發現代碼如下:

  export default function request (options) {
    if (options.url && options.url.indexOf('//') > -1) {
      const origin = `${options.url.split('//')[0]}//${options.url.split('//')[1].split('/')[0]}`
      if (window.location.origin !== origin) {
        if (CORS && CORS.indexOf(origin) > -1) {
          options.fetchType = 'CORS'
        } else if (YQL && YQL.indexOf(origin) > -1) {
          options.fetchType = 'YQL'
        } else {
          options.fetchType = 'JSONP'
        }
      }
    }

經測試發現本地都走的JSONP的類型, 在看下面的代碼。

  if (fetchType === 'JSONP') {
    return new Promise((resolve, reject) => {
      jsonp(url, {
        param: `${qs.stringify(data)}&callback`,
        name: `jsonp_${new Date().getTime()}`,
        timeout: 4000,
      }, (error, result) => {
        if (error) {
          reject(error)
        }
        resolve({ statusText: 'OK', status: 200, data: result })
      })
    })
  } 

將所有的參數,作為url的參數的后面追加。于是問了一下前端的大神,結合現實情況,總結修改方案如下:

  • 前端框架采用json格式請求,對于post的請求先發送method=OPTIONS的請求, 如果返回的是204狀態,則放過,然后在發送實際請求。
  • 后端api接口曾需要放過method=OPTIONS的請求,并且返回204的狀態。

具體解決方案:
(1) 注銷上面jsonp直接返回的代碼,所有請求都采用json格式。放過204的狀態。

    return fetch(options).then((response) => {
        if (response.status === 204) {
            return response.text()
        }
        ... ...

(2) server端放過method=OPTIONS的請求, 返回204。

if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    header('Access-Control-Allow-Origin: *');
    header('Content-Type:application/json; charset=utf-8');
    header('Access-Control-Allow-Methods: "GET, POST, OPTIONS, PUT, DELETE"');
    header('Access-Control-Allow-Headers: content-type');
    header('Access-Control-Max-Age: 1000');
    http_response_code('204');
    exit;
 }

(3) 對于json格式的請求,也要返回相應的頭部。

case 'JSON':
    // 返回JSON數據格式到客戶端 包含狀態信息
    header('Access-Control-Allow-Origin: *');
    header('Content-Type:application/json; charset=utf-8');
    header('Access-Control-Allow-Methods: "GET, POST, OPTIONS, PUT, DELETE"');
    header('Access-Control-Max-Age: 1000');
    exit(json_encode($data));

因為內部系統初期開發,暫時沒有細節優化。僅實現功能,解決問題為主。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

伊金霍洛旗| 民县| 东阿县| 宜宾县| 呼伦贝尔市| 景泰县| 汤原县| 乌兰察布市| 南投县| 新田县| 高碑店市| 庆云县| 扎兰屯市| 岫岩| 勐海县| 青冈县| 兴业县| 亚东县| 阜城县| 霍林郭勒市| 连州市| 洪江市| 丹巴县| 封开县| 略阳县| 屯门区| 华亭县| 札达县| 普兰县| 厦门市| 应城市| 临猗县| 白水县| 上林县| 河东区| 鹤山市| 岳普湖县| 原平市| 洛宁县| 平乡县| 樟树市|