前后端分離項目主流的跨域解決方案

三種主流的跨域解決方案(vue-cli3 package.json中配置跨域)
最近學習nodejs的express框架生蚁,對CORS(跨域資源共享Cross-origin resource sharing)比較感興趣泪幌,看過上面的文章后在本地測試發(fā)現(xiàn)很多容易忽略的問題導致無法實現(xiàn)跨域八千,現(xiàn)將解決方案記錄如下:

跨域的解決方案:

1.CORS跨域資源共享(后端設置)

弊端:
如果Access-Control-Allow-Origin 設置單一源不能同時設置多個
如果 Access-Control-Allow-Origin 設置為 * 不允許攜帶 cookie

1.1 使用cors插件處理
1.2 使用自定義中間件設置響應頭處理
1.3 使用app.use('*',callback)全局攔截處理響應頭

具體實現(xiàn)如下(三個方法選擇其一即可):

后端代碼實現(xiàn)
服務端node.jssrc/app.js啟動文件配置如下:

const express = require('express')
const bodyParser = require('body-parser')//用于解析請求體的中間件,否則無法獲取req.body
const app = express()
const models = require('./db/models/index.js')
const baseUrl = '/todo_api'
const cors = require('cors')

//1.cors插件處理跨域
app.use(cors())

//2.自定義中間件處理跨域
/* let allowCrossDomain = function(req, res, next) {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.header('Access-Control-Allow-Headers', 'Content-Type, token');
    res.header('Access-Control-Allow-Credentials','true');
    console.log('zqf123')
    next();
};
app.use(allowCrossDomain); */

//3.app.all('*')全局攔截處理跨域
/* app.all('*', (req, res, next)=>{
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.header('Access-Control-Allow-Headers', 'Content-Type, token');
    res.header('Access-Control-Allow-Credentials',true);
    console.log('res', res)
    next();
}) */

前端代碼實現(xiàn):
在封裝的全局攔截請求http.js里設置絕對路徑的的baseURL前綴地址哄辣,一般為server地址,同時可以根據需要設置header的值挖藏。

import axios from 'axios'
// 全局請求頭設置
axios.defaults.headers = {
    'Content-Type': 'application/json',
    'token': 'zqf666',
}
//統(tǒng)一設置請求前綴
axios.defaults.baseURL = "http://127.0.0.1:3030/todo_api"

最后將http.js引入到前端項目的入口文件里

//react項目的src/index.js文件
import './http/http.js'

//vue項目的src/main.js文件
import './http/http.js'

容易出現(xiàn)的問題:
由于全局設置了請求頭Content-Typetoken,而在node.js里最開始處理CORS時設置為res.header('Access-Control-Allow-Headers', 'Content-Type');導致瀏覽器控制臺報錯無法跨域,在postman工具上測試又可以拿到返回的數據,最后用firefox瀏覽器打開測試了一下雖然還是跨域但是瀏覽器給出了具體的原因意狠,終于解決。

image.png

2.Http Proxy 代理

弊端:
只能在本地開發(fā)使用疮胖,線上部署需要搭配Nginx等代理服務器

2.1 在vue項目中使用代理
2.1.1根目錄下創(chuàng)建配置文件vue.config.js

module.exports = {
  "lintOnSave": false,//忽略eslint代碼檢查
    "devServer": {
      "proxy": {
        "/api": {
          "target": "http://127.0.0.1:3030/",//代理的地址
          "changeOrigin": true,
          "ws": true,
          "pathRewrite": {
            "^/api": ""
          }
        }
      }
    }
}

2.1.2不使用vue.config.js配置文件
vue-cli3 中取消了配置文件 vue.config.js环戈,網上的跨域處理多為新建配置文件 vue.config.js,如果不想增加配置文件澎灸,則可以在package.json增加配置:

  • package.json 中加入 vue 字段(下面的代碼段)
  • 如果請求的地址不是 /api院塞,借助 pathRewrite/api 替換
  • axios 進行網絡請求,在封裝 axios 時設置 baseURL: '/api'而非絕對路徑
"eslintConfig": {
//eslint代碼檢查規(guī)則性昭,代替.eslintrc.js配置文件
},
"vue": {
//代替vue.config.js配置文件
    "lintOnSave": false,//忽略eslint代碼檢查
    "devServer": {
      "proxy": {
        "/api": {
          "target": "http://127.0.0.1:3030/",//代理的地址
          "changeOrigin": true,
          "ws": true,
          "pathRewrite": {
            "^/api": ""
          }
        }
      }
    }
  }

容易出現(xiàn)的問題:
1.該方法必須在vue-cli3腳手架生成的項目(目錄下沒有vue.config.js文件)里使用拦止;

  1. package.json的vue字段里設置代理,則vue.config.js文件不能存在,否則package.json的配置會被忽略汹族,如下圖:
    image.png

vue-cli3官方文檔說明

image.png

2.2 在react項目中使用代理
2.2.1在 package.json 中加入 proxy字段并設置相關代理
image.png

react官方文檔說明

官方文檔說明

2.2.2在 在config配置文件里設置相關代理
通過create-react-app腳手架安裝的react項目只有node_modules萧求、publicsrc文件夾顶瞒,很多配置文件都沒有了夸政,那是因為webpack,babel等都是被creat-react-app封裝到了react-scripts這個項目當中搁拙,包括基本啟動命令都是通過調用react-scripts這個依賴下面的命令進行啟動秒梳。通過npm run eject將原本creat react appwebpack,babel等相關配置的封裝彈射出來箕速,然后就可以在項目的目錄下config配置文件酪碘,修改代理即可。
image.png

3.使用插件代理

后端實現(xiàn):
1.安裝中間件http-proxy-middleware:
npm i http-proxy-middleware -d
2.在src/app.js中引入中間件并添加配置

// 引用依賴
var express = require('express');
var createProxyMiddleware = require('http-proxy-middleware');
var app = express();
// 創(chuàng)建代理設置中間件選項
var exampleProxy = createProxyMiddleware ( {
        target: 'http://127.0.0.1:3030', // 目標服務器 host
        changeOrigin: true,               // 默認false盐茎,是否需要改變原始主機頭為目標URL
        ws: true,                         // 是否代理websockets
        pathRewrite: {
            '^/api' : '',     // 重寫請求
        },
    };);

// 使用代理
    app.use('/api', exampleProxy);
    app.listen(3000);

請求地址示例:
axios.get(/api/xxx)
前端實現(xiàn):
axios前綴設置
axios.header.baseURL='/api'

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末兴垦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子字柠,更是在濱河造成了極大的恐慌探越,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窑业,死亡現(xiàn)場離奇詭異钦幔,居然都是意外死亡,警方通過查閱死者的電腦和手機常柄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門鲤氢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人西潘,你說我怎么就攤上這事卷玉。” “怎么了喷市?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵相种,是天一觀的道長。 經常有香客問我品姓,道長寝并,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任腹备,我火速辦了婚禮食茎,結果婚禮上,老公的妹妹穿的比我還像新娘馏谨。我一直安慰自己别渔,他們只是感情好,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著哎媚,像睡著了一般喇伯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拨与,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天稻据,我揣著相機與錄音,去河邊找鬼买喧。 笑死捻悯,一個胖子當著我的面吹牛,可吹牛的內容都是我干的淤毛。 我是一名探鬼主播今缚,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼低淡!你這毒婦竟也來了姓言?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤蔗蹋,失蹤者是張志新(化名)和其女友劉穎何荚,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體猪杭,經...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡餐塘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了皂吮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片戒傻。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖涮较,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情冈止,我是刑警寧澤狂票,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站熙暴,受9級特大地震影響闺属,放射性物質發(fā)生泄漏。R本人自食惡果不足惜周霉,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一掂器、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧俱箱,春花似錦国瓮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽禁漓。三九已至,卻和暖如春孵睬,著一層夾襖步出監(jiān)牢的瞬間播歼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工掰读, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留秘狞,地道東北人。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓蹈集,卻偏偏與公主長得像烁试,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子雾狈,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349