<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          fetch 如何處理 302?

          共 2718字,需瀏覽 6分鐘

           ·

          2022-01-26 14:00

          作者:時傾

          來源:SegmentFault  思否社區(qū)


          問題描述



          fetch 發(fā)送一個請求,請求登錄過期返回 302,瀏覽器自動重定向到 Response Headers 的 Location 登錄頁面。Location 對應的服務器不接受跨域請求,因此頁面報錯。


          嘗試在 fetch 的回調(diào)函數(shù)處理,一旦 fetch 的 response status 是 302 就跳轉(zhuǎn)到 Location 頁面, 但是不論在fetch的回調(diào)函數(shù)中做任何事情,都執(zhí)行不到。



          什么是 HTTP 狀態(tài)碼 302 ?



          HTTP 302 重定向狀態(tài)碼表明請求的資源被暫時的移動到了由Location頭部指定的 URL 上。瀏覽器會重定向到這個URL, 但是搜索引擎不會對該資源的鏈接進行更新。


          使用場景:


          1. 在 OAuth 流程中,302 經(jīng)常使用;

          2. 有時候請求的資源無法從其標準地址訪問,但是卻可以從另外的地方訪問。在這種情況下可以使用臨時重定向。

          3. 搜索引擎不會記錄該新的、臨時的鏈接。在創(chuàng)建、更新或者刪除資源的時候,臨時重定向也可以用于顯示臨時性的進度頁面。


          痛點:瀏覽器 自動 發(fā)起對 重定向地址的請求,js 無法插手干預。

          fetch 為什么不能攔截302?



          一般請求的流程:

          • fetch 發(fā)送請求;

          • 服務器返回 response 并且?guī)в袪顟B(tài)碼(比如200) ;

          • 瀏覽器接收到響應,結(jié)果遞交給fetch;

          • 從 fetch 的回調(diào)函數(shù)獲取相應數(shù)據(jù);



          302 臨時重定向請求的流程是:

          • fetch 發(fā)送請求;

          • 服務器返回 response (帶有l(wèi)ocation) 并且?guī)в?302 狀態(tài)碼;

          • 瀏覽器接收到響應,自動從302響應的頭信息的重定向地址中取到 location 進行跳轉(zhuǎn);


          對于重定向,當瀏覽器檢查到 headers 中存在 Location,會直接進行跳轉(zhuǎn),不會告知任何請求發(fā)送者(fetch),這時候發(fā)送者會以為請求還在處理中。所以此時的 fetch 的 then 和catch 都捕獲不到信息

          如何解決?



          1. 配置 fetch 的 redirect


          fetch 的 options 配置項redirect,用于配置可用的 redirect 模式。

          redirect 的值有:

          • follow:默認, 自動重定向;

          • error:如果產(chǎn)生重定向?qū)⒆詣咏K止并且拋出一個錯誤;

          • manual:手動處理重定向;


          error


          如果產(chǎn)生重定向?qū)⒆詣咏K止并且拋出一個錯誤。此錯誤可以在 fetch catch 回調(diào)函數(shù)中捕獲:TypeError: Failed to fetch。

          fetch 只有服務器錯誤才調(diào)用 catch,其他都會調(diào)用 then 函數(shù),那么 302 為什么會調(diào)用catch?

          不是 302 導致 catch 被調(diào)用而是重定向后的請求的 response 導致 catch 被調(diào)用。


          manual


          手動處理重定向。通過這種方法只能知道發(fā)生了重定向,但是 response 的內(nèi)容非常有限,無法獲取到具體的信息。


          2. 后端改寫狀態(tài)碼,前端手動處理


          目前的 302 是對 404 的改寫,那么如果我們將 404 改寫成自定義狀態(tài)碼,然后前端捕獲到這個狀態(tài)碼后,進行手動處理。這種方法則需要前后端的同學都做處理。

          301 和 302 狀態(tài)碼區(qū)別



          301:永久重定向。一旦請求發(fā)往某個URL,狀態(tài)碼返回301,那么瀏覽器就會自動跳轉(zhuǎn)到 header中 Location 對應的 url。下次請求,再次向 location 對應的 url 發(fā)送請求。

          • 之后每次請求都會跳轉(zhuǎn)到 location 對應的url。沒有例外。

          • 瀏覽器可以緩存從這個 url 獲取的響應。


          302:臨時重定向。請求的資源臨時從不同的url獲取。一旦請求發(fā)往某個URL,狀態(tài)碼返回302,那么瀏覽器就會自動跳轉(zhuǎn)到 header中 Location對應的 url。但是下次再次請求的時候向原來的url發(fā)請求。

          • 每次請求不能確定是否向 Location 的 url 發(fā)請求,因此需要先想原來的 url 發(fā)送請求確定。

          • 瀏覽器不可緩存從重定向的 url 獲取到的響應。


          重定向可以用來set cookie



          瀏覽器如果發(fā)現(xiàn)當前請求的響應要重定向,則會直接忽略掉 response 的 body,無法在開發(fā)者工具中的 network 面板上看到 body。雖然重定向請求的 body 會被瀏覽器忽略掉,但重定向請求響應的頭部仍然可以發(fā)揮作用。

          例如一個請求服務端返回 302 的同時 set-cookie,那么瀏覽器可以在發(fā)起跳轉(zhuǎn)之前在當前頁面的域下set cookie。即使因為 302 跳轉(zhuǎn)到其他域了,也仍然可以set cookie。

          1. 用戶訪問 a 域名

          2. 后端返回302,location是 b 域名,同時set-cookie: cookieA

          3. 瀏覽器在 a 域名下種上cookie: cookieA,然后向 b 域名發(fā)起請求

          4. 后端返回 302,location 是a 域名,同時 set-cookie: cookieB

          5. 瀏覽器在 b 域名下種上cookie: cookieB,然后向 a 域名發(fā)起請求


          這里相當于是實現(xiàn)了這樣一種效果:一次請求即可向不同域名種下cookie(重定向是后端控制的,前端透明,相當于只有一次請求的效果)

          如果不用重定向的話,可能會考慮配置CORS發(fā)一個跨域請求set cookie,但CORS一旦涉及到cookie這種 credentials 信息,就會出現(xiàn)各種各樣的限制,實際很難發(fā)揮效果。

          其實跨域 set cookie 還可以用瀏覽器的 beacon API 實現(xiàn),當然也是有一些限制的

          重定向可以有多次,比如連續(xù)的302, 就是 location 對應的 URL 又返回了 302 和新的location,如此重復直到不再跳轉(zhuǎn)位置。為了防止出現(xiàn)無限重定向的情況,重定向的次數(shù)是有上限的。Chrome 瀏覽器的重定向次數(shù)是20,超過20次重定向就會報ERR_TOO_MANY_REDIRECT錯誤。



          點擊左下角閱讀原文,到 SegmentFault 思否社區(qū) 和文章作者展開更多互動和交流,掃描下方”二維碼“或在“公眾號后臺回復“ 入群 ”即可加入我們的技術(shù)交流群,收獲更多的技術(shù)文章~

          - END -

          瀏覽 30
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  强伦轩人妻一区二区电影 | 久久视频高清无码 | 四虎国产成人永久精品免费 | 91色人妻 | 欧美日韩国产手机在线 |