參考文章:https://www.cnblogs.com/nuccch/p/7875189.html
前后端完全分離的項目,前端使用Vue + axios,
使用CORS協議解決跨域訪問數據限制的問題,但是發現客戶端的Ajax請求不會自動帶上服務器返回的Cookie:SESSIONID
導致每一個Ajax請求在服務端看來都是一個新的請求,都會在服務端創建新的Session(在響應消息頭中設置Set-Cookie:JSESSIONID=xxx)。
實際上,這是瀏覽器的同源策略導致的問題:不允許JS訪問跨域的Cookie。
舉個例子,現有網站A使用域名a.example.com,網站B使用域名b.example.com,如果希望在2個網站之間共享Cookie(瀏覽器可以將Cookie發送給服務器),那么在設置的Cookie的時候,必須設置domain為example.com。
參考地址:https://blog.csdn.net/qq_39611230/article/details/108090828
按照上面老兄弟的文章設置一翻,發現本人的項目還是運行不起來,真是折騰人!
下面說一下解決方案:
對於前后端分離的項目,為了能夠解決跨域的問題,大家可能需要設置在前端和后端分別做一些設置。
-
前端:
import Vue from 'vue' import VueRouter from 'vue-router' import routes from './router/router' import store from './store/' import { routerMode } from './config/env' import './config/rem' import ViewUI from 'view-design';// gougou ViewUI import 'view-design/dist/styles/iview.css';// gougou ViewUI import axios from 'axios'; /* 引入axios進行地址訪問*/ Vue.prototype.$axios = axios; axios.defaults.withCredentials = true;//這行代碼是必須的
-
后端:
header('Access-Control-Allow-Origin:' 這里你的前端項目域名,不能為 *); header('Access-Control-Allow-Credentials:true'); header('Access-Control-Allow-Methods:GET,POST,OPTIONS'); header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');//P3P協議是為了cookie可以實現單點登錄
以上兩項大多數人都明白。
但本人設置過,愣是不起作用,幾經周折,發現根本獲取不到后端的session,而且在開發者工具中跟蹤發現每個接口返回的PHPSESSIONID都不一樣,而且一直在變化。
最后百度半天,才發現是Mock的問題。最后將require('../src/mock');注釋掉,一切正常了!這個坑還是有點大,希望大家不要掉里。
另外一個問題:
前后端分離項目,從服務端加載歷史記錄有時會出現以下錯誤:
Access to XMLHttpRequest at 'http://logistics.cn2de.com/admin/v2/inwarehouses?lang=&product_sn=&stock_in_sn=&production_batch=&product_name=&start_time=2021-04-13&end_time=2021-05-13&warehouse_sn=&per_page=20&page=1' from origin 'http://znwl.cn2de.com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
服務端為Laravel,而且已經在在app\Http\Kernel.php中設置過了CORS跨域,如下:
// 全局跨域 \Barryvdh\Cors\HandleCors::class,
那為什么還會出現No 'Access-Control-Allow-Origin' header is present on the requested resource錯誤提示呢,原因在於服務端加載速度慢,或者資源加載失敗,導致瀏覽器認為服務端沒有設置過跨域
所以還是應該從服務端數據或者頁面的加載問題入手。