<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在做登入功能時,想把使用者的資訊通過Set-cookie在使用者端設定cookie資訊。
1.伺服器端通過cors中介軟體實現介面跨域存取、koa-session-minimal實現cookie的設定。
const session = require('koa-session-minimal') const cors = require('@koa/cors'); // app.js const app = new Koa() app.use(cors()) // 存放sessionId的cookie設定, 相關的一些欄位設定說明可以檢視http協定。 let cookie = { maxAge: 2 * 60 * 1000, // cookie有效時長 expires: new Date('2022-08-26'), // cookie失效時間 path: '/', // 寫cookie所在的路徑 domain: 'localhost', // 寫cookie所在的域名 httpOnly: false, // 是否只用於http請求中獲取 overwrite: false, // 是否允許重寫 // secure: '', sameSite: 'strict', // signed: '', } // 使用session中介軟體 app.use(session({ key: 'SESSION_ID', cookie: cookie }))
// login介面 // ... if (!err) { ctx.session = { user_id: adminId, count: 0 } ctx.response.status = 200; // ... } // ...
一切進展順利,介面響應成功,響應頭也有我們設定的cookie欄位。但是事情的背後往往沒有這麼簡單,當我去看Application中的Cookie資訊時,發現怎麼都找不到我想要的SESSION_ID欄位,百思不得姐。
1.通過查閱一些資料後,發現瀏覽器的同源策略是對跨域的cookie有做一些限制的。其中Access-Control-Allow-Credentials欄位就控制著對跨域cookie的設定。
Access-Control-Allow-Credentials
響應頭用於在請求要求包含 credentials(Request.credentials 的值為 include
)時,告知瀏覽器是否可以將對請求的響應暴露給前端 JavaScript 程式碼。
當請求的 credentials 模式為 include
時,瀏覽器僅在響應檔頭 Access-Control-Allow-Credentials
的值為 true
的情況下將響應暴露給前端的 JavaScript 程式碼。(這段文字是來自MDN檔案)。
我理解是隻有開啟後,瀏覽器在讀取到響應頭的Set-cookie欄位時,才能將cookie欄位設定於瀏覽器中。於是我根據cors使用檔案做出了程式碼上的調整:
const app = new Koa() const koaOptions = { origin: 'http://localhost:9529', credentials: true }; app.use(cors(koaOptions))
2.於是本人胸有成竹的開啟了新一遍的流程測試,想必這次是能成功的。經過了幾S的流程測試之後,我得到了一個結果:失敗是成功之母。
顯然我們這次又未在Application的cookie中找到我們想要的SESSION_ID欄位,我再次沉浸式的翻閱了MDN的cookie相關檔案。
3.發現檔案中其實是有寫到:Access-Control-Allow-Credentials 檔頭需要與 XMLHttpRequest.withCredentials 或 Fetch API 的 Request() 建構函式中的 credentials 選項結合使用。
Credentials 必須在前後端都被設定(即 Access-Control-Allow-Credentials header 和 XHR 或 Fetch request 中都要設定)才能使帶 credentials 的 CORS 請求成功。
XMLHttpRequest.withCredentials
屬性是一個布林型別,它指示了是否該使用類似 Cookies、Authorization Headers (頭部授權) 或者 TLS 使用者端證書這一類資格證書來建立一個跨站點存取控制(cross-site Access-Control
)請求。
在同一個站點下使用 withCredentials
屬性是無效的。此外也會被用做響應中
Cookies 被忽視的標示。預設值是 false。
如果在傳送來自其他域的 XMLHttpRequest 請求之前,未設定withCredentials
為 true,那麼就不能為它自己的域設定 Cookie 值。
而通過設定 withCredentials
為 true 獲得的第三方 Cookies,將會依舊享受同源策略,因此不能被通過document.cookie或者從頭部相應請求的指令碼等存取。(這段文字是來自MDN檔案)。
4.根據以上資訊,我調整了前端專案封裝的request模組程式碼,將withCredentiaols設定成了true:
const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url withCredentials: true, // send cookies when cross-domain requests timeout: 5000 // request timeout })
再一次的進行我們的流程測試,果然功夫不負有心人,終於是在Application中看到了心心念的SESSION_ID:
踏破鐵鞋無覓處,得來全不費工夫。我們在遇見問題的時候,應該儘量從問題的本質出發尋找突破口,試著從另一個角度切入。
其次就是對相關知識的掌握程度,我在這次的遇見問題和解決問題的過程中做出了反思,確實有尋找到突破口:瀏覽器的同源策略限制。
但是對其相關的策略掌握不夠深入,導致花費了比正常多幾倍的時間去解決問題,經過這次的檔案查閱,我對跨域設定cookie以及瀏覽器同源限制策略,有了更進一步的認知。
以上就是跨域設定Cookie失效問題解決方案原理分析的詳細內容,更多關於跨域設定Cookie失效解決的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45