国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

漏了一個“/”導(dǎo)致的跨域錯誤(CORS)

這篇具有很好參考價值的文章主要介紹了漏了一個“/”導(dǎo)致的跨域錯誤(CORS)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

在成功搭建好DRF(Django rest framework)的Blog的backend后,昨天開始搭建Vue3+axios+pinia+element_plus的前臺服務(wù).

開始一切順利,到第一個axios的get處理的時候,出現(xiàn)了錯誤.

axios相關(guān)的代碼如下:

加載vue-axios和axios模塊

npm install --save vue-axios axios

axios初始化(main.ts)

app.use(VueAxios, axios);
axios.defaults.baseURL = "http://localhost:8000/api";
//axios.defaults.headers.common['Access-Control-Allow-Origin'] = '*';
// axios.defaults.headers.common['Access-Control-Allow-Methods'] = 'GET, POST, PUT, DELETE, OPTIONS';
//axios.defaults.headers.common['Access-Control-Allow-Headers'] = 'X-Requested-With,content-type';
//axios.defaults.headers.common['Content-Type'] = 'application/x-www-form-urlencoded';

app.provide('axios',app.config.globalProperties.axios)

?文章來源地址http://www.zghlxwxcb.cn/news/detail-420497.html

axios取數(shù)據(jù)

在Pinia的Store中調(diào)用axios.get方法取得Backend端的Tag數(shù)據(jù)

export const useBlogData = defineStore("blogData",()=>{

    const axios:any = inject('axios');
    const tagsMenu = ref([])
    axios.get('/tags').then((response:{data:any})=>{
        tagsMenu.value = response.data.results;

    })

    return {tagsMenu}
})

目前的代碼不嚴謹,沒有進行錯誤處理.

出現(xiàn)跨域錯誤(CORS)

在Chrome的開發(fā)者模式下可以看到,報告Cors錯誤(CORS policy: No ‘Access-Control-Allow-Orign’ header is present on requested resource.

漏了一個“/”導(dǎo)致的跨域錯誤(CORS)

?發(fā)現(xiàn)錯誤后,急急慢慢去Google解決方案, 了解CORS的出錯的原因以及可能的解決方案,

CORS跨域錯誤的原因

MDN上有文章詳細說明了CORS出錯的原因以及Client Server端的請求與應(yīng)答之間的關(guān)系.https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS

簡單的來說,我們的backend與frontend服務(wù)是分開的, Browser在執(zhí)行Vue相關(guān)的處理的時候,回交叉訪問不同的服務(wù)器,這樣對于服務(wù)器來說可能會出現(xiàn)安全漏洞,所以會對這種請求進行拒絕操作.

關(guān)于CORS的中文的說明在Google云上有一篇文章說明https://cloud.google.com/storage/docs/cross-origin?hl=zh-cn, 我覺得還是MDN上講解的更透徹.

CORS跨域錯誤的解決方案

在Google、StackOverflow上各種查詢最終得出應(yīng)該是兩種解決方案:

Backend Server端的解決方案

Django提供了Backend Server端的解決方案,在前面的文章中已經(jīng)提到過處理方法:

參考Django的CORS Header模塊說明?https://pypi.org/project/django-cors-headers/

安裝django-cors-headers, 修改setting.py, 其中需要注意的是MiddleWare相關(guān)的修改

MIDDLEWARE = [
    ...,
    "corsheaders.middleware.CorsMiddleware",
    "django.middleware.common.CommonMiddleware",
    ...,
]

corsheaders.middleware.CorsMiddleware的位置盡量向上,要在這個CommonMiddleware前面,否則也可能會出現(xiàn)CORS錯誤.

我的Backend端一直有這樣的處理,檢查代碼,加入各種奇怪的配置,還是繼續(xù)出錯,苦惱很長時間.

Frontend Sever的解決方案

Frontend Server的解決方案就是在Frontend Server上設(shè)置Proxy, 將Vue的axios發(fā)起的get請求不直接發(fā)給Backend Server,發(fā)給Frontend, Frontend通過Proxy的配置轉(zhuǎn)給Backend Server,從而避免了CORS的問題.

我的開發(fā)環(huán)境使用的是Vite, Google等上面有說修改vue.config.ts的,這個主要是面向Vue-CLI的,在Vite上修改的vite.config.ts

  server:{
    port:8080,
    proxy:{
      '/api':'http://127.0.0.1:8000'
    }
  },

加入proxy代理, 如上所示我的backend端的rest api的url是http://127.0..0.1:8000/api ,加入上述處理后 Frontend對應(yīng)的http://localhost:8080/api上的請求會通過proxy轉(zhuǎn)移到backend上

在axios的處理中,將面向backend處理baseurl設(shè)置為frontend上

axios.defaults.baseURL = "http://localhost:8080/api";

通過Frontend Server的解決方案可以成功解決目前碰見的CORS問題.

為什么Backend Server端的解決方案沒有解決問題呢?

雖然通過Frontend Server的解決方案繞過了CORS錯誤,但是為什么Backend Server端的解決方案就是不行呢??

Google、Stackoverflow給出了在http的header上加Access-Control-Allow-Origin的解題過程.

我在代碼中加入headers相關(guān)的處理

axios.defaults.baseURL = "http://localhost:8000/api";
axios.defaults.headers.common['Access-Control-Allow-Origin'] = '*';

Chrome上的錯誤出現(xiàn)了新的情況:變成 access-control-allow-orign is not allowed by Access-Control-Headers的錯誤

漏了一個“/”導(dǎo)致的跨域錯誤(CORS)

在Chrome 網(wǎng)絡(luò)中可以看見多了一個axios的請求成功了, axios發(fā)了一個preflight的請求去Backend預(yù)檢測是否可以跨域請求

漏了一個“/”導(dǎo)致的跨域錯誤(CORS)

發(fā)現(xiàn)preflight請求成功了,我以為自己離解決問題近了一步,現(xiàn)在反思起了其實是退步了. 之后一直陷在這個地方找不到原因,各種Server端的配置,Frontend端的配置都不能成功.

在Stackoverflow上發(fā)現(xiàn)有人說問題就是結(jié)尾少了一個“/”,?我在axios的get請求“/tags”加入“/tags/”, 仍然還是出錯.一度錯過了這個問題的解決方案.

解決問題

折騰一晚上睡覺起了,再仔細的看MDN中的文章, 文章中說對于Simple Request(get、post、put、delete)的請求是不需要發(fā)送preflight請求的.現(xiàn)在看這個錯誤的意思就是access-control-allow-orgin這個header字段不被Backend Server支持,Backend拒絕了訪問. 看不到解決方案決定回到起點,將header相關(guān)的處理去掉,將axios的代碼回歸到

axios.defaults.baseURL = "http://localhost:8000/api";
//axios.defaults.headers.common['Access-Control-Allow-Origin'] = '*';

通過curl -i -L查看請求的結(jié)果,發(fā)現(xiàn)Backend端其實已經(jīng)取得了tags數(shù)據(jù),并返回給Broswer,但是結(jié)果確被重定向了,會出現(xiàn)301錯誤

漏了一個“/”導(dǎo)致的跨域錯誤(CORS)

這時候想起看過的關(guān)于請求結(jié)尾需要加“/”的處理,想明白了可能就是這個“/”導(dǎo)致的錯誤.在axios的get請求中將“/tags”,修改為“/tags/”.問題得到解決.

修改代碼?

export const useBlogData = defineStore("blogData",()=>{

    const axios:any = inject('axios');
    const tagsMenu = ref([])
    axios.get('/tags/').then((response:{data:any})=>{
        tagsMenu.value = response.data.results;

    })

    return {tagsMenu}
})

最終的解決方案: Backend的cors header模塊 + “/”解決問題.

還有一個需要注意的地方是,在每次修改代碼后,最好是將之前的頁面關(guān)掉,重開避免Cache引起的干擾.

?

?

到了這里,關(guān)于漏了一個“/”導(dǎo)致的跨域錯誤(CORS)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 跨域問題?無需擔(dān)心!學(xué)習(xí)如何解決 Axios 的跨域限制

    跨域問題?無需擔(dān)心!學(xué)習(xí)如何解決 Axios 的跨域限制

    跨域是指訪問另外一個域的資源,由于瀏覽器的同源策略,默認情況下使用 XMLHttpRequest 和 Fetch 請求時是不允許跨域的??缬虻母驹蚴菫g覽器的同源策略,這是由瀏覽器對 JavaScript 施加的安全限制。 跨域請求被阻止 (Cross-Origin Request Blocked) : 這是由瀏覽器實施的同源策略

    2024年04月27日
    瀏覽(23)
  • 常見的跨域解決方案

    常見的跨域解決方案: 跨域問題可以分為兩種情況: 前端跨域和后端跨域 。以下是針對這兩種情況的跨域解決方案: 前端跨域解決方案: JSONP: 適用于前端向不同域名下的服務(wù)器請求數(shù)據(jù),通過添加回調(diào)函數(shù)名稱來實現(xiàn)跨域數(shù)據(jù)獲取。 CORS: 當(dāng)前端向服務(wù)器請求數(shù)據(jù)時,

    2024年02月12日
    瀏覽(25)
  • 跨域介紹及Java中常見的跨域解決方案

    跨域(Cross-Origin)指的是在瀏覽器中,由于安全策略的限制,當(dāng)前網(wǎng)頁的 JavaScript 代碼無法直接訪問不同源(協(xié)議、域名、端口)的資源。這意味著如果網(wǎng)頁嘗試通過 AJAX、Fetch 或 WebSocket 等方式向不同源的服務(wù)器發(fā)送請求,瀏覽器會阻止這些請求,從而避免潛在的安全風(fēng)險。

    2024年02月07日
    瀏覽(28)
  • 拓展邊界:前端世界的跨域挑戰(zhàn)

    拓展邊界:前端世界的跨域挑戰(zhàn)

    目錄 什么是跨域 概念 同源策略及限制內(nèi)容 常見跨域場景 如何解決跨域 CORS Nginx代理跨域 Node中間件代理跨域 WebSocket postMessage JSONP 其他 概念 在此之前,我們了解一下一個域名地址的組成: 跨域指的是在網(wǎng)絡(luò)安全中,由于瀏覽器的同源策略(Same-Origin Policy)限制,當(dāng)一個網(wǎng)

    2024年01月21日
    瀏覽(20)
  • Chrome瀏覽器的跨域設(shè)置

    Chrome瀏覽器的跨域設(shè)置

    做前后端分離的開發(fā)的時候,出于一些原因往往需要將瀏覽器設(shè)置成支持跨域的模式,而且chrome瀏覽器支持可跨域的設(shè)置,但是新版本的chrome瀏覽器提高了跨域設(shè)置的門檻,原來的方法不再適用了。其實網(wǎng)上也有很多大神總結(jié)的chrome跨域設(shè)置教程,都是差不多。 下載好谷歌瀏

    2024年02月02日
    瀏覽(298)
  • chrome瀏覽器跨域設(shè)置(版本號108之后的跨域設(shè)置)

    chrome瀏覽器跨域設(shè)置(版本號108之后的跨域設(shè)置)

    1、首先在chrome瀏覽器安裝目錄下復(fù)制chrome.exe,生成一個新的命名為chrome-cross.exe 注意:為什么要在目錄下復(fù)制一個新的?是因為如果名字相同,可能會導(dǎo)致設(shè)置好的跨域瀏覽器打開后跟原來的chrome.exe是同一個瀏覽器,設(shè)置的跨域瀏覽器就不是生效了。 2、點擊 chrome-cross.exe

    2024年02月15日
    瀏覽(96)
  • 解決SpringBoot和前端Vue的跨域問題

    解決SpringBoot和前端Vue的跨域問題

    一、為什么會出現(xiàn)跨域問題?? ????????出于瀏覽器的同源策略限制。同源策略(Sameoriginpolicy)是一種約定,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,則瀏覽器的正常功能可能都會受到影響??梢哉fWeb是構(gòu)建在同源策略基礎(chǔ)之上的,瀏覽器只是針對同

    2024年02月04日
    瀏覽(18)
  • CORS就是跨域嗎?

    CORS就是跨域嗎?

    跨域的英文是:Cross-Origin。 Origin ?中文含義為:起源,源頭,出生地。 在跨域中,\\\"域\\\"指的是一個 Web 資源(比如網(wǎng)頁、腳本、圖片等)的 源頭 。 包括該資源的 協(xié)議 、 主機名 、 端口號 。 在 同源策略 中,如果兩個資源的域相同,則它們屬于同一域,可以自由進行交互和

    2024年02月20日
    瀏覽(17)
  • Chrome 跨域問題CORS 分析

    先疊個甲,有錯誤,望溝通指正! has been blocked by CORS policy: Response to preflight request doesn’t pass access control check: No ‘Access-Control-Allow-Origin’ header is present on the requested resource. 類似上面的報錯 ,就是出現(xiàn)了跨域限制訪問問題 同源策略(Same-Origin Policy),這個是瀏覽器的一個策略.也就

    2024年03月18日
    瀏覽(23)
  • SpringBoot 如何處理 CORS 跨域?

    SpringBoot 如何處理 CORS 跨域?

    ? Springboot跨域問題,是當(dāng)前主流web開發(fā)人員都繞不開的難題。但我們首先要明確以下幾點 跨域只存在于瀏覽器端,不存在于安卓/ios/Node.js/python/ java等其它環(huán)境 跨域請求能發(fā)出去,服務(wù)端能收到請求并正常返回結(jié)果,只是結(jié)果被瀏覽器攔截了。 之所以會跨域,是因為受到了

    2024年02月15日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包