最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React項目中fetch實現(xiàn)跨域接收傳遞session的解決方案

 更新時間:2022年04月20日 16:28:22   作者:飲盡冬雪涼  
這篇文章主要介紹了React項目中fetch實現(xiàn)跨域接收傳遞session的解決方案,本次項目使用了react框架,同時使用fetch取代ajax作為獲取接口數(shù)據(jù)的交互方法,下面就對這次問題的解決做個總結(jié),需要的朋友可以參考下

本次項目使用了react框架,同時使用fetch取代ajax作為獲取接口數(shù)據(jù)的交互方法。本以為過程中應該不會有什么磕絆,沒想到遇到了session丟失這個讓人甚是苦惱的問題。期間本想換種方法來對接接口,但轉(zhuǎn)念一想如果每次遇到問題都選擇逃避,那么以后的編碼之路只能越走越窄,所以還是決定堅持下去。好在經(jīng)過一整天的摸索,總算是成功攻克了這個難關,下面就對這次問題的解決做個總結(jié)。

首先,為什么會出現(xiàn)postman接口調(diào)試正常而程序里fetch調(diào)用卻出現(xiàn)session丟失的問題?

回顧fetch本身的特性——默認情況下, fetch在服務端不會發(fā)送或接收任何 cookies??!

再來看session——當客戶端第一次請求服務器的時候,服務器生成一份session保存在服務端,將該數(shù)據(jù)(session)的id以cookie的形式傳遞給客戶端;以后的每次請求,瀏覽器都會自動的攜帶cookie來訪問服務器(session數(shù)據(jù)id)。

這就意味著fetch這種方法如果想要攜帶cookie,需要經(jīng)過特殊的處理——credentials: "include",代碼如下:

fetch("https://ip:端口/api/Values/GetVerifyCode", {

            method: "GET",
            credentials: 'include',
            mode: 'cors',
            headers: {
                'Content-Type': 'application/json'
            }
        }).then(res => res.json())
            .then(res => {
                if (res.code == 200) {
                    //xxxxxxx
                }
            });

這里還涉及到前后臺分離時經(jīng)常遇到的跨域問題(mode: 'cors'),什么是跨域?瀏覽器從一個域名的網(wǎng)頁去請求另一個域名的資源時,域名、端口、協(xié)議任一不同,都是跨域。在前后端分離的模式下,前后端的域名是不一致的,此時就會發(fā)生跨域訪問問題。在請求的過程中我們要想回去數(shù)據(jù)一般都是post/get請求,所以..跨域問題就出現(xiàn)。這是出于瀏覽器的同源策略限制。(節(jié)選自https://zhuanlan.zhihu.com/p/425855609

后臺以.netcore webapi為例,需要在Startup.cs里配置好Cors,代碼如下:

ConfigureServices里:

services.AddCors(options =>

            {
                options.AddPolicy("any", builder =>
                {
                    builder.AllowAnyOrigin()
                    .AllowAnyMethod()
                    .AllowAnyHeader();
                });//跨域請求
            });

Configure里:

app.UseCors("any");//跨域請求

這里要注意的是如果你在服務器端的web.config里已經(jīng)配置過跨域相關參數(shù)了,這里在加的話程序運行時會報錯(”*,*”…意思就是重復配置跨域參數(shù)),要使用credentials: 'include',需要將上面的允許來自所有域的跨域請求訪問改為只允許特定域訪問,同時允許Credentials,如下:

services.AddCors(options =>

            {
                options.AddPolicy("any", builder =>
                {
                    builder.AllowAnyOrigin()
                    .AllowAnyMethod()
                    .AllowAnyHeader();
                });//跨域請求
            });

本來進行到這里我以為問題已經(jīng)解決了,在本地調(diào)試OK的情況下發(fā)布接口,然后調(diào)用發(fā)布好的服務器接口,卻還是沒有獲取到想要的cookie。以驗證碼為例:一個fetch1生成驗證碼,并把它通過響應標頭帶回來,之后另一個fetch2調(diào)接口時把之前帶回來的cookie再通過請求標頭傳到后臺進行校驗,打開控制臺發(fā)現(xiàn)fetch2的請求標頭并沒有cookie值,而fetch1的響應標頭里也沒有Set-Cookie。

點開末尾的cookie才發(fā)現(xiàn)問題的所在:

這個SameSite是何許人也?

SameSite是瀏覽器請求中Set-Cookie響應頭新增的一種屬性,它用來標明這個 cookie 是否是“同站 cookie”,同站 cookie 只能在本域名中使用的cookie,不能作為第三方 cookie。Chrome 51 開始,瀏覽器的 Cookie 新增加了一個SameSite屬性,用來防止 CSRF 攻擊和用戶追蹤。該屬性起初是由Google 起草的一份草案用來來改進 HTTP 協(xié)議的。Chrome 計劃將Lax變?yōu)槟J設置。這時,網(wǎng)站可以選擇顯式關閉SameSite屬性,將其設為None (對舊版瀏覽器無效,因為舊版瀏覽器沒有該值) 。不過,前提是必須同時設置Secure屬性(Cookie 只能通過 HTTPS 協(xié)議發(fā)送),否則無效。(節(jié)選自https://www.cnblogs.com/w821759016/p/14595832.html

了解了這個,便可以很快地對Startup.cs里的services.AddSession做出調(diào)整,如下:

services.AddSession(options =>

            {
                options.Cookie.Name = ".AdventureWorks.Session";
                options.IdleTimeout = TimeSpan.FromSeconds(1800);//設置session的過期時間
                options.Cookie.HttpOnly = true;//設置在瀏覽器不能通過js獲得該cookie的值
                options.Cookie.SameSite = SameSiteMode.None;
                options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest;
                options.Cookie.IsEssential = true;
            });

其中,SameSite設為None配合Secure設為SameAsRequest,但要注意這個只允許訪問的接口為https接口,另外將SameSite設置為了Unspecified瀏覽器則會使用默認值lax,是沒有效果的。

最后,將原先的http接口改為https,至于https認證所需的SSL證書怎么搞這里就不贅述了,將這些完成后再次嘗試調(diào)用發(fā)布好的接口,fetch1里的響應標頭以及fetch2里的請求標頭就都能在控制臺看見了,問題解決!

到此這篇關于React項目中fetch實現(xiàn)跨域接收傳遞session的解決方案的文章就介紹到這了,更多相關react fetch跨域接收傳遞session內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • React中使用TS完成父組件調(diào)用子組件的操作方法

    React中使用TS完成父組件調(diào)用子組件的操作方法

    由于在項目開發(fā)過程中,我們往往時需要調(diào)用子組件中的方法,這篇文章主要介紹了React中使用TS完成父組件調(diào)用子組件,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • 詳解關于react-redux中的connect用法介紹及原理解析

    詳解關于react-redux中的connect用法介紹及原理解析

    本篇文章主要介紹了詳解關于react-redux中的connect用法介紹及原理解析,非常具有實用價值,需要的朋友可以參考下
    2017-09-09
  • React Native 搭建開發(fā)環(huán)境的方法步驟

    React Native 搭建開發(fā)環(huán)境的方法步驟

    本篇文章主要介紹了React Native 搭建開發(fā)環(huán)境的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • React從插槽、路由、redux的詳細過程

    React從插槽、路由、redux的詳細過程

    React需要自己開發(fā)支持插槽功能,原理:父組件組件中寫入的HTML,可以傳入子組件的props中,這篇文章主要介紹了React從插槽、路由、redux的詳細過程,需要的朋友可以參考下
    2022-10-10
  • react中使用useEffect及踩坑記錄

    react中使用useEffect及踩坑記錄

    這篇文章主要介紹了react中使用useEffect及踩坑記錄,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 初識React及React開發(fā)依賴詳解

    初識React及React開發(fā)依賴詳解

    React由Facebook來更新和維護,它是大量優(yōu)秀程序員的思想結(jié)晶,React的流行不僅僅局限于普通開發(fā)工程師對它的認可,大量流行的其他框架借鑒React的思想,接下來通過本文介紹React基礎及React開發(fā)依賴介紹,需要的朋友可以參考下
    2022-10-10
  • ReactNative實現(xiàn)圖片上傳功能的示例代碼

    ReactNative實現(xiàn)圖片上傳功能的示例代碼

    本篇文章主要介紹了ReactNative實現(xiàn)圖片上傳功能的示例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-07-07
  • react:swr接口緩存案例代碼

    react:swr接口緩存案例代碼

    useSWR 是一個 React Hooks,是 HTTP 緩存庫 SWR 的核心方法之一,SWR 是一個輕量級的 React Hooks 庫,通過自動緩存數(shù)據(jù)來實現(xiàn) React 的數(shù)據(jù)獲取,本文給大家介紹react:swr接口緩存案例詳解,感興趣的朋友一起看看吧
    2023-11-11
  • React useEffect、useLayoutEffect底層機制及區(qū)別介紹

    React useEffect、useLayoutEffect底層機制及區(qū)別介紹

    useEffect 是 React 中的一個 Hook,允許你在函數(shù)組件中執(zhí)行副作用操作,本文給大家介紹React useEffect、useLayoutEffect底層機制及區(qū)別介紹,感興趣的朋友一起看看吧
    2025-04-04
  • React通過conetxt實現(xiàn)多組件傳值功能

    React通過conetxt實現(xiàn)多組件傳值功能

    Context 提供了一種在組件之間共享此類值的方式,而不必顯式地通過組件樹的逐層傳遞 props。本文給大家介紹React通過conetxt實現(xiàn)多組件傳值功能,感興趣的朋友一起看看吧
    2021-10-10

最新評論

黑龙江省| 繁峙县| 应城市| 道孚县| 葫芦岛市| 江口县| 太仆寺旗| 酒泉市| 肃北| 寿宁县| 泸州市| 昭苏县| 西乌珠穆沁旗| 大同县| 梧州市| 岐山县| 辽中县| 兴和县| 曲阜市| 外汇| 云安县| 寿阳县| 临邑县| 汶川县| 黄龙县| 柯坪县| 荆州市| 乌鲁木齐市| 长垣县| 龙口市| 武陟县| 舟山市| 卢湾区| 达尔| 阳曲县| 密云县| 泾源县| 河池市| 二连浩特市| 浮山县| 荔浦县|