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

js跨域問題及解決方法匯總

這篇具有很好參考價(jià)值的文章主要介紹了js跨域問題及解決方法匯總。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言

定義

瀏覽器為了保證用戶信息的安全,防止惡意網(wǎng)站竊取數(shù)據(jù),禁止不同域之間的js交互。對(duì)于瀏覽器而言,只要協(xié)議、域名、端口其中有一個(gè)不同就會(huì)觸發(fā)同源策略,造成跨域,從而限制交互

  • cookie、storage、indexDB等不能獲取

  • ajax不能發(fā)送請(qǐng)求、dom樹無法獲得

為什么要限制跨域訪問

如果一個(gè)網(wǎng)頁可以隨意的訪問另一個(gè)網(wǎng)站的資源,就有可能在用戶完全不知情的情況下出現(xiàn)安全問題

瀏覽器出于安全問題,對(duì)同源請(qǐng)求放行,對(duì)異源請(qǐng)求限制,這些限制規(guī)則統(tǒng)稱為同源策略,因?yàn)橄拗圃斐傻拈_發(fā)問題,稱之為跨域(異源)問題

對(duì)標(biāo)簽發(fā)出的跨域請(qǐng)求輕微限制,對(duì) AJAX 發(fā)出的跨域請(qǐng)求嚴(yán)厲限制

方法

常用方法

跨域資源共享(CORS)

CORS(Cross-Origin Resource Sharing)跨域資源共享,定義了必須在訪問跨域資源時(shí),瀏覽器與服務(wù)器應(yīng)該如何溝通。CORS背后的基本思想就是使用自定義的HTTP頭部讓瀏覽器與服務(wù)器進(jìn)行溝通,從而決定請(qǐng)求或響應(yīng)是應(yīng)該成功還是失敗。

是一套機(jī)制,用于瀏覽器校驗(yàn)請(qǐng)求。只要服務(wù)器明確表示允許,則校驗(yàn)通過;服務(wù)器明確拒絕或沒有表示,則校驗(yàn)不通過。CORS將請(qǐng)求分為兩類,簡單請(qǐng)求和預(yù)檢請(qǐng)求:

簡單請(qǐng)求
  1. 請(qǐng)求方法為GET、HEAD、POST

  1. 頭部字段滿足CORS安全規(guī)范

  1. 請(qǐng)求頭的Content-Type為 text/plain、multipart/form-data、application/x-www-form-urlencoded

  1. 服務(wù)器響應(yīng)頭,要么同源,要么放行

預(yù)檢請(qǐng)求
瀏覽器發(fā)送預(yù)請(qǐng)求
  1. 從哪個(gè)源發(fā)送的請(qǐng)求:Origin:http://my.com

  1. 請(qǐng)求方式:Access-Controt-Request-Method:POST

  1. 請(qǐng)求改變了哪些請(qǐng)求頭:Access-Controt-Request-Headers:content-type

服務(wù)器進(jìn)行響應(yīng)
  1. Access-Controt-Allow-Origin:http://my.com...,允許的源,可以多個(gè)

  1. Access-Controt-Allow-Method:POST,GET...,允許的方式,可以多個(gè)

  1. Access-Controt-Allow-Headers:content-type...,允許改變的請(qǐng)求頭,可以多個(gè)

  1. Access-Controt-Max-Age:86400,多少秒不用再次檢驗(yàn)

jsonp

前端寫一個(gè)函數(shù),服務(wù)端調(diào)用函數(shù)傳入?yún)?shù),通過參數(shù)獲取,根本不是AJAX

// 獲取返回結(jié)果
function callback(resp){
    console.log(resp);
}

// 向服務(wù)端請(qǐng)求js文件
function request(url){
    // 生成一個(gè) script 標(biāo)簽
    const script = document.createElement('script')
    // 標(biāo)簽引用 js 路徑為填入路徑
    script.src = url
    // 標(biāo)簽解析完成之后刪除
    script.onload = function(){
        script.remove()
    }
    // 插入 body 中
    document.body.appendChild(script)
}

Nginx代理跨域

差別
  • cors:需要服務(wù)器設(shè)置響應(yīng)頭

  • jsonp:需要服務(wù)器響應(yīng)一段js代碼,并且還要調(diào)用函數(shù)

方法
  1. 瀏覽器請(qǐng)求自己的服務(wù)器 proxy

  1. 代理服務(wù)器請(qǐng)求目標(biāo)服務(wù)器 target

  1. 服務(wù)器之間沒有跨域問題,目標(biāo)服務(wù)器響應(yīng)代理服務(wù)器

  1. 代理服務(wù)器返回?cái)?shù)據(jù)

// 引入庫
const express = require('express')
// 創(chuàng)建服務(wù)器
const app = express()
// 接受對(duì)路徑 /hero 的 GET 請(qǐng)求
app.get('/hero',async (req,res)=>{
    // 使用 cors 解決對(duì)代理服務(wù)器的跨域
    res.header('assess-control-allow-origin','*')
    // 響應(yīng)一段測(cè)試文本
    res.send('你好,我是代理服務(wù)器')
    // 在這里請(qǐng)求目標(biāo)服務(wù)器,然后返回給前端
})
// 監(jiān)聽9527端口
app.listen(9527,()=>{
    console.log('服務(wù)器已啟動(dòng)');
})

擴(kuò)展學(xué)習(xí)

Node中間件代理跨域

Vue項(xiàng)目一般使用此方法,就是對(duì)代理服務(wù)器的一種封裝。

在vue.config.js文件中配置
module.export = {
    ...
    devServer: {
        proxy: {
            [ process.env.VUE_APP_BASE_API ]: {
                target: 'http://xxxx',? ? // 代理跨域目標(biāo)接口
                ws: true,
                changeOrigin: true,
                pathRewrite: {
                    [ '^' + process.env.VUE_APP_BASE_API ] : ''
                }
            }
        }
    }
Node/Express中配置:
const express = require(\'express\')
const proxy = require('http-proxy-middleware')
const app = express()
app.use('/', proxy({ 
    // 代理跨域目標(biāo)接口 
    target: 'http:? ? // xxxx:8080', 
    changeOrigin: true, 
    // 修改響應(yīng)頭信息,實(shí)現(xiàn)跨域并允許帶cookie 
    onProxyRes: function(proxyRes, req, res) { 
        res.header('Access-Control-Allow-Origin', 'http://xxxx')
        res.header('Access-Control-Allow-Credentials', 'true')
    }, 
    // 修改響應(yīng)信息中的cookie域名 
    cookieDomainRewrite: 'www.domain1.com' ? ? // 可以為false,表示不修改
})); 
app.listen(3000); 

Websocket

WebSocket是HTML5標(biāo)準(zhǔn)中的一種基于TCP但是區(qū)別于HTTP的通信協(xié)議,因?yàn)槭情L連接,該協(xié)議不實(shí)行同源政策。以ws://(非加密)和wss://(加密)作為協(xié)議前綴。

因?yàn)閃ebSocket請(qǐng)求頭信息中有Origin字段,表示請(qǐng)求源來自哪個(gè)域,服務(wù)器可以根據(jù)這個(gè)字段判斷是否允許本次通信。

// 創(chuàng)建websocket
var socket = new WebSocket('ws://www.baidu.com');
// 發(fā)送消息
socket.send('hello WebSocket');
// 接收消息
socket.onmessage = function(event){
    var data = event.data;
}

postMessage

是HTML5引入的一個(gè)全新的API:跨文檔通信 API(Cross-document messaging)。 這個(gè)API為window對(duì)象新增了一個(gè)window.postMessage方法,允許跨窗口通信,不論這兩個(gè)窗口是否同源。

窗口之間傳遞消息
// 父窗口發(fā)起
window.opener.postMessage("我是來自a頁面的","http://b.com")

// 子窗口接收
window.onmessage = function(e){
    e = e || event;
    console.log(e.data);//我是來自a頁面的
}
// 子窗口發(fā)送
window.opener.postMessage('我是來自b頁面的', 'http://a.com');
讀取其他窗口LocalStorage
// 父窗口調(diào)用方法
var obj = { name: 'Jack' };
// 存入對(duì)象
window.parent.postMessage(JSON.stringify({key: 'storage', method: 'set', data: obj}), 'http://b.com');
// 讀取對(duì)象
window.parent.postMessage(JSON.stringify({key: 'storage', method: "get"}), "*");
window.onmessage = function(e) {
? ? // 判斷消息是否來自a窗口
? ? if (e.origin != 'http://a.com') return;
    // "Jack"
    console.log(JSON.parse(e.data).name);
}

b窗口接收消息,獲取自己的localStorage之后再傳遞給a窗口

window.onmessage = function(e) {
? // 消息來自自己,不予理會(huì)
  if (e.origin !== 'http://b.com') return;
  var payload = JSON.parse(e.data);
  // 判斷方法進(jìn)行操作
  switch (payload.method) {
    case 'set':
      localStorage.setItem(payload.key, JSON.stringify(payload.data));
      break;
    case 'get':
      var parent = window.parent;
      var data = localStorage.getItem(payload.key);
? ? ? // 如果是獲取,獲取之后傳遞給a窗口
      parent.postMessage(data, 'http://a.com');
      break;
    case 'remove':
      localStorage.removeItem(payload.key);
      break;
  }
}

單向跨域

利用瀏覽器對(duì)標(biāo)簽發(fā)出的跨域請(qǐng)求輕微限制,進(jìn)行單方面的跨域請(qǐng)求

  • <img src='' />標(biāo)簽發(fā)送get請(qǐng)求

  • <script src=""></script>標(biāo)簽嵌入跨域腳本,語法錯(cuò)誤信息只能在同源腳本中捕捉到。

  • <link src="">標(biāo)簽嵌入CSS。由于CSS的松散的語法規(guī)則,CSS的跨域需要一個(gè)設(shè)置正確的Content-Type消息頭。

  • <video>、<audio>嵌入多媒體資源。

  • <object>、<embed>、<applet>的插件。

  • @font-face引入的字體。一些瀏覽器允許跨域字體( cross-origin fonts),一些需要同源字體(same-origin fonts)。

  • <iframe> 和 <iframe>載入的任何資源。站點(diǎn)可以使用X-Frame-Options消息頭來阻止這種形式的跨域交互。文章來源地址http://www.zghlxwxcb.cn/news/detail-499800.html

到了這里,關(guān)于js跨域問題及解決方法匯總的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 在uniapp Vue3版本中如何解決web/H5網(wǎng)頁瀏覽器跨域的問題

    在uniapp Vue3版本中如何解決web/H5網(wǎng)頁瀏覽器跨域的問題

    uniapp項(xiàng)目在瀏覽器運(yùn)行,有可能調(diào)用某些接口會(huì)出現(xiàn)跨域問題,報(bào)錯(cuò)如下圖所示: 存在跨域問題的原因是因?yàn)闉g覽器的同源策略,也就是說前端無法直接發(fā)起跨域請(qǐng)求。同源策略是一個(gè)基礎(chǔ)的安全策略,但是這也會(huì)給uniapp/Vue開發(fā)者在部署時(shí)帶來一定的麻煩。一般來說,瀏覽

    2024年01月21日
    瀏覽(84)
  • 2D-3D配準(zhǔn)指南[方法匯總]【入門指導(dǎo)向】(一)問題介紹+LCD跨域描述子+Triplet loss

    2D-3D配準(zhǔn)指南[方法匯總]【入門指導(dǎo)向】(一)問題介紹+LCD跨域描述子+Triplet loss

    近年來,采用三維和二維數(shù)據(jù)的應(yīng)用層出不窮,它們都需要將 三維模型 與 二維圖像 進(jìn)行匹配。大型定位識(shí)別系統(tǒng)可以估算出照片拍攝的位置。在全球定位系統(tǒng)可能失靈的情況下,地理定位系統(tǒng)可以進(jìn)行地點(diǎn)識(shí)別,對(duì)自動(dòng)駕駛非常有用。此外,法醫(yī)警察也可以利用該系統(tǒng)破案

    2024年02月03日
    瀏覽(22)
  • 瀏覽器同源策略導(dǎo)致跨域問題 No ‘Access-Control-Allow-Origin‘ header 原因及解決方式--(后端、nginx、前端)

    瀏覽器同源策略導(dǎo)致跨域問題 No ‘Access-Control-Allow-Origin‘ header 原因及解決方式--(后端、nginx、前端)

    目錄 現(xiàn)象 原因 瀏覽器同源策略 導(dǎo)致結(jié)果: 解決方案 跨源資源共享(CORS) 各個(gè)端解決方法: 后端: 方式1:重載WebMvcConfigurer方法 方式2:配置監(jiān)聽CorsFilter 方式3:相關(guān)類上加注解?@CrossOrigin 注意事項(xiàng): Nginx解決: 情況1: 前端解決: 本人身份:后端 今天部署線上環(huán)境前端

    2024年01月23日
    瀏覽(25)
  • Node.js 使用 cors 中間件解決跨域問題

    Node.js 使用 cors 中間件解決跨域問題

    cors 是 Express 的一個(gè)第三方中間件。通過安裝和配置 cors 中間件,可以很方便地解決跨域問題。 CORS (Cross-Origin Resource Sharing,跨域資源共享)由一系列 HTTP 響應(yīng)頭 組成, 這些 HTTP 響應(yīng)頭決定瀏覽器是否阻止前端 JS 代碼跨域獲取資源 。 瀏覽器的 同源安全策略 默認(rèn)會(huì)阻止網(wǎng)

    2024年01月20日
    瀏覽(62)
  • 前端跨域問題解決方法

    前端跨域問題解決方法

    跨域是 WEB瀏覽器專有 的同源限制訪問策略。(后臺(tái)接口調(diào)用和postman等工具會(huì)出現(xiàn)) 跨源資源共享(CORS,或通俗地譯為跨域資源共享)是一種基于 HTTP 頭的機(jī)制,該機(jī)制通過允許服務(wù)器標(biāo)示除了它自己以外的其他源(域、協(xié)議或端口),使得瀏覽器允許這些源訪問加載自己的資

    2024年02月13日
    瀏覽(31)
  • 解決跨域問題的常用方法

    有一個(gè)小小的東西叫cookie大家應(yīng)該知道,一般用來處理登錄等場景,目的是讓服務(wù)端知道誰發(fā)出的這次請(qǐng)求。如果你請(qǐng)求了接口進(jìn)行登錄,服務(wù)端驗(yàn)證通過后會(huì)在響應(yīng)頭加入Set-C

    2023年04月08日
    瀏覽(19)
  • Nginx跨域問題的解決方法

    Nginx跨域問題的解決方法

    Web前端開發(fā)經(jīng)常會(huì)遇到跨域訪問,如果沒有辦法讓后臺(tái)開放訪問域,調(diào)用接口就會(huì)被瀏覽器攔截。解決跨域問題的方案,可以搭建一個(gè)后臺(tái)服務(wù)做中間轉(zhuǎn)發(fā),也可以用 nginx https://so.csdn.net/so/search?q=nginx 轉(zhuǎn)發(fā)。 問題發(fā)生在nginx 反向代理 https://so.csdn.net/so/search?q=%E5%8F%8D%E5%90%91%E

    2024年02月11日
    瀏覽(22)
  • Spring Boot學(xué)習(xí)隨筆- 后端實(shí)現(xiàn)全局異常處理(HandlerExceptionResolver),前后端解決跨域問題(@CrossOrigin(局部解決)自定義跨域配置類(全局))

    Spring Boot學(xué)習(xí)隨筆- 后端實(shí)現(xiàn)全局異常處理(HandlerExceptionResolver),前后端解決跨域問題(@CrossOrigin(局部解決)自定義跨域配置類(全局))

    學(xué)習(xí)視頻:【編程不良人】2021年SpringBoot最新最全教程 異常處理作用:用來解決整合系統(tǒng)中任意一個(gè)控制器拋出異常時(shí)的統(tǒng)一處理入口 傳統(tǒng)單體架構(gòu)下的處理方式 配置全局異常處理類 resolveException :當(dāng)控制器方法出現(xiàn)異常時(shí),如果該方法沒有try...catch,則會(huì)進(jìn)入當(dāng)前方法 針

    2024年02月04日
    瀏覽(95)
  • vue自定義密碼輸入框解決瀏覽器自動(dòng)填充密碼的問題

    vue自定義密碼輸入框解決瀏覽器自動(dòng)填充密碼的問題

    瀏覽器對(duì)于 type=\\\"password\\\" 的輸入框會(huì)自動(dòng)填充密碼,但有時(shí)出于安全或者其他原因,我們不希望瀏覽器記住并自動(dòng)填充密碼。通過網(wǎng)上查到的一些解決方案,可以總結(jié)出以下幾種解決方案(主要用edge瀏覽器進(jìn)行測(cè)試): 通過 autocomplete=\\\"off\\\" / autocomplete=\\\"new-password\\\" 來關(guān)閉瀏覽器自

    2023年04月15日
    瀏覽(24)
  • 【Vue.js】Vue3全局配置Axios并解決跨域請(qǐng)求問題

    【Vue.js】Vue3全局配置Axios并解決跨域請(qǐng)求問題

    對(duì)于前后端分離項(xiàng)目,前端和后端端口不能重復(fù),否則會(huì)導(dǎo)致前端或者后端服務(wù)起不來。例如前端訪問地址為: http://localhost:8080/ ,后端訪問地址為 http://localhost:8081/ 。后端寫好Controller,當(dāng)用Axios訪問該接口時(shí),將會(huì)報(bào)錯(cuò): Access to XMLHttpRequest at \\\' http://localhost:8081/login \\\' from

    2024年02月05日
    瀏覽(31)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包