1. 程式人生 > >常見的跨域問題以及解決方案

常見的跨域問題以及解決方案

身為一個碼農,在日常的開發過程中難免遇到API介面跨域的問題,今天主要整理一下導致跨域問題的原因以及常用的解決方案。

導致跨域問題的原因?

跨域問題其實是由瀏覽器的同源策略導致的。

同源策略限制了從同一個源載入的文件或指令碼如何與來自另一個源的資源進行互動。這是一個用於隔離潛在惡意檔案的重要安全機制。

常用的解決方案

解決跨域問題的方式有很多,一般有下面幾種:

1、 Cross-Origin Resource Sharing(CORS)跨域資源

2、JSONP

3、反向代理

4、document.domain

5、使用postMessage

6、WebSocket

7、關閉瀏覽器跨域限制(disable-web-security)

然而,在實際的開發過程中我們一般最常用的解決方案是CORS和反向代理。

跨域資源共享(CORS)

跨域資源共享(Cross-Origin Resource Sharing,簡稱 CORS),是 HTML5 提供的標準跨域解決方案。相較於JSONP的方式,CORS具有更多優勢:

  • JSONP只能實現GET請求,而CORS支援所有型別的HTTP請求。

  • 使用CORS,開發者可以使用普通的XMLHttpRequest發起請求和獲得資料,比起JSONP有更好的錯誤處理。

不過使用CORS來解決跨域問題需要服務端支援,然後通過設定Access-Control-Allow-Origin來解決跨域問題。

服務端如何實現CORS跨域資源共享?

我們以node服務為例,因為我個人比較喜歡使用koa2來進行Restful API的開發, 所以我們可以通過koa2-cors來快速實現服務對CORS的支援,具體實現示例程式碼:

var koa = require('koa');
var app = new koa();
var router = require('koa-router')();
//引入koa2-cors庫
const cors = require('koa2-cors');

app.use(cors({
    origin: function (ctx) {
        return
"*"; // 允許來自所有域名請求 }, exposeHeaders: ['WWW-Authenticate', 'Server-Authorization'], maxAge: 5, credentials: true, allowMethods: ['GET', 'POST', 'DELETE'], allowHeaders: ['Content-Type', 'Authorization', 'Accept'], })) router.post('/', async function (ctx) { ctx.body = 'hello,world' }); app .use(router.routes()) .use(router.allowedMethods()); app.listen(3000);

反向代理

除了使用CORS之外,我們也會經常通過設定反向代理服務來解決跨域問題。

一般情況下,我們可以直接通過配置nginx伺服器來實現反向代理功能;

因為我們公司後端是採用了微服務架構+閘道器(kong),所以可以直接在kong裡面配置路由規則;

如果自己是前端開發者並且使用了vue進行前端專案開發,我們只可以開啟專案中config資料夾下index.js檔案,然後在dev.proxyTable新增配置資訊就可以了。示例:

var path = require('path')

module.exports = {
    build: {
        env: require('./prod.env'),
        index: path.resolve(__dirname, '../dist/index.html'),
        assetsRoot: path.resolve(__dirname, '../dist'),
        assetsSubDirectory: 'static',
        assetsPublicPath: '/',
        productionSourceMap: true,
        // Gzip off by default as many popular static hosts such as
        // Surge or Netlify already gzip all static assets for you.
        // Before setting to `true`, make sure to:
        // npm install --save-dev compression-webpack-plugin
        productionGzip: false,
        productionGzipExtensions: ['js', 'css'],
        // Run the build command with an extra argument to
        // View the bundle analyzer report after build finishes:
        // `npm run build --report`
        // Set to `true` or `false` to always turn it on or off
        bundleAnalyzerReport: process.env.npm_config_report
    },
    dev: {
        env: require('./dev.env'),
        port: 8087,
        autoOpenBrowser: true,
        assetsSubDirectory: 'static',
        assetsPublicPath: '/',

        //################################################################配置資訊
        proxyTable: {
            '/api': {
                target: 'http://13.63.***.**',//填寫需要代理的真實地址
                changeOrigin: true,
                pathRewrite: {
                    '^/api': ''
                }
            }
        },
        //################################################################配置資訊
        // CSS Sourcemaps off by default because relative paths are "buggy"
        // with this option, according to the CSS-Loader README
        // (https://github.com/webpack/css-loader#sourcemaps)
        // In our experience, they generally work as expected,
        // just be aware of this issue when enabling this option.
        cssSourceMap: false
    }
}

補充

如果我們希望可以最快速的解決跨域問題,然後進行臨時除錯,我們可以直接通過關閉chrome的安全設定(不推薦)。

具體實現方式

1、在桌面找到瀏覽器快捷圖示並點選滑鼠右鍵的屬性一欄

2、在屬性頁面中的目標輸入框里加上 --disable-web-security --user-data-dir=C:\MyChromeDevUserData,user-data-dir可以是任意路徑,如下圖所示:

3、儲存並重啟瀏覽器

相關推薦

C#進階系列——WebApi 問題解決方案:CORS

dea ati ice pro target default 異常 測試工具 復雜 前言:上篇總結了下WebApi的接口測試工具的使用,這篇接著來看看WebAPI的另一個常見問題:跨域問題。本篇主要從實例的角度分享下CORS解決跨域問題一些細節。 WebApi系列文章

前端-關於CORS解決方案,面向服務端

red 瀏覽器 環境 和我 methods retrieve name 後臺 一件事 最近自己在寫後臺管理系統的時候,並沒有采用jsp、freemaker、葉子等模板技術,而是由後端提供數據api,前端通過AJAX和JQuery來動態操作頁面上的一些div、table元素,

ajax請求解決方案

tro cti jquer 解決方案 tab all ajax跨域 自帶 b-s 大家好,今天我們學習了js的跨域請求的解決方案,由於JS中存在同源策略,當請求不同協議名,不同端口號、不同主機名下面的文件時,將會違背同源策略,無法請求成功!需要進行跨域處理! 方案一、後臺P

ajax 請求解決方案

allow option ajax cred eth post delet 求解 delete response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access

laravel 5.5 oauth2.0 問題解決方案

title apach war laravel jsonp 另一個 over gin strong 一、laravel-Cors 安裝 在終端執行安裝命令如下: composer require barryvdh/laravel-cors

[轉]No 'Access-Control-Allow-Origin' header is present on the requested resource.'Ajax訪問解決方案

不能 ade 方式 ole 相同域名 all log head 允許 原 https://blog.csdn.net/zhoucheng05_13/article/details/53580683 No ‘Access-Control-Allow-Origin‘ heade

CORS 與 TP5中解決方案

在做專案過程中,使用Vue-element-admin作為前端,ThinkPHP5作為後端框架進行開發,會遭遇跨域問題,本文給出ThinkPHP5解決跨域 1.CORS的概念     CORS(Cross-Origin Resource Sharing 跨源資源共享),當

angularjspost解決方案

前端同學李雷和後臺同學韓梅梅分別在自己電腦上進行開發,後臺介面寫好的時候,李雷改動完就把前端程式碼上傳到gitlab,然後在測試機上從gitlab上拉下來,然後在測試機上移動最新程式碼,最後回到本機重新整理頁面。有時候碰到網速不好的情況傳個git傳了半天,或者李雷剛上傳完發現少寫了一個單詞,加上再傳

flume常見異常彙總以及解決方案

                       flume常見異常彙總以及解決方案                                            作者:尹正傑 版權宣告:原創作品,謝絕轉載!否則將追究法律責任。       實際生產環境

WebApi多種解決方案

關於WebAPI跨域踩到的一點坑 最近在嘗試前後端分離的WebAPI+AngularJS方案,在率先處理授權的時候,踩到了一點WebAPI跨域的坑,其實嚴格意義上來說也不算是坑吧,只是我自己對WebAPI不熟悉而已,這裡我與大家分享一下。 先說一下我這邊遇到的情況: 我是在做登入

javaWeb專案問題解決方案

1.簡單的servlet專案 1.配置一個filter過濾器,過濾所有的請求,並且設定響應頭   package Filter; import javax.servlet.*; import javax.servlet.http.HttpServletRes

vue+django問題解決方案(前後端兩種方案

1.Vue前端設定代理(方案一) 我們在使用vue-cli啟動專案的時候npm run dev便可以啟動我們的專案了,通常我們的請求地址是以localhost:8080來請求介面資料的,localhost是沒有辦法設定cookie的。  我們可以在vu

Geoserver終極解決方案

在其他程式呼叫使用Geoserver時,可能會遇到跨域 如 Access to XMLHttpRequest at 'http://localhost:8080/geoserver/gwc/service/tms/1.0.0/KylinWS:[email protected]:[e

什麼是以及解決方法:

#跨域: # 瀏覽器從一個域名的網頁去請求另一個域名的資源時,瀏覽器處於安全的考慮,不允許不同源的請求 #同源策略: #  協議相同 #  域名相同 #  埠相同 #處理方法: # 1.通過JSONP跨域 # JSON是一種資料交換格式 # JSONP是一種非官方的跨域

No 'Access-Control-Allow-Origin' header is present on the requested resource.'Ajax訪問解決方案

出現該錯誤是由於存在網站跨域訪問的問題。 什麼是網站跨域,簡單來講,當你通過ajax來請求或傳送資料時,兩個域名之間不能跨過域名來發送請求或者請求資料,瀏覽器會認為它是不安全的。 解決方式: 1、伺服器端解決方案 設定響應報文頭 response.setHeader

JS請求解決方案

1 js跨域請求 1.1 域名的比較 1.2 什麼是JS跨域: 1.3 預設情況下JS不允許跨域 1.4Access-Control-Allow-Origin 2 跨

WebApi 問題解決方案:CORS

前兩篇文章介紹了WebApi專案的建立和測試,今天來說說WebApi跨域訪問的問題。本篇主要介紹了利用CORS解決跨域問題一些細節和具體步驟,下面來看看吧。 一、釋出WebApi 既然是解決WebApi跨域問題,那WebApi(http://localhost:9002)

No 'Access-Control-Allow-Origin' header is present之 為什麼會解決方案

1 瀏覽器的限制 2 跨域 3 瀏覽器傳送的是 XHR (XMLHttpRequest)請求 當以上三個條件都滿足時瀏覽器會丟擲跨域請求異常(記住是瀏覽器丟擲的異常,和服務端沒太大關係),在講跨域請求解決方案前先了解幾個問題。 1 http請求中,哪些是常見的簡單請求,哪些是非簡單請

java中常見的異常以及解決方案-持續更新

同學們有沒有被java中的異常機制弄得頭大?不要急,接下來,就帶你熟悉熟悉java中常見的異常以及解決方法(其實就是程式碼的嚴謹性的問題) 1.java.lang.NullPointerExcepti

前後端互動問題解決方案資源共享(CORS)

跨域資源共享(CORS) 普通跨域請求:只服務端設定Access-Control-Allow-Origin即可,前端無須設定,若要帶cookie請求:前後端都需要設定。 需注意的是:由於同源策略的限制,所讀取的cookie為跨域請求介面所在域的cookie,而非當前頁。如