前端如何解决跨域问题,跨域请求如何携带cookie

一.什么是跨域

1.简介

跨域分为开发跨域(开发环境跨域)和线上跨域(生产环境跨域):
开发环境跨域:开发阶段前后端工作站不同,所以ip地址不同,请求数据必然出现跨域问题;
生产环境跨域:一个网站关联多台服务器,构成一个完整的生产服务器集群。不同的服务器之间通过地址进行通信,就算在局域网中,端口地址也是不一样的,就会产生跨域问题。

2.同源策略

跨域问题其实就是浏览器的同源策略所导致的。同源策略是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到攻击。所谓同源是指"协议+域名+端口"三者相同(注:即便两个不同的域名指向同一个ip地址,也非同源)不同源之间相互请求资源,就算作“跨域”。
注:跨域并不是请求发不出去,请求能发出去,服务端能收到请求并正常返回结果,只是结果被浏览器拦截了。


image.png

但是有一些标签是允许跨域加载资源:

<img src="xxx">
<link href="xxx">
<script src="xxx">

一.解决跨域

1.JSONP (线上跨域解决方案)

(前端+后端共同解决)


image.png

JSONP 跨域主要就是利用了 script 标签没有跨域限制的这个特性。
通过script标签src属性,发送带有callback参数的get请求,服务端将返回数据拼凑到callback函数中,返回给浏览器,浏览器解析执行,拿到callback函数返回的数据:

<script type="text /javascript"> 
    window.jsonpCallback = function (res) { console.log(res); }
</script>
<script src="http://xx/api/jsonp?msg=abc&callback=jsonpCallback"  type="text/javascript"></script>
// 相应后端实现
app.use(async (ctx, next) => {  
  if (ctx.path === "/api/jsonp") {    
    const { callback, msg } = ctx.query;    
    ctx.body = `${callback.stringify({ msg })})`;
    return;  
    }
});

jsonp的缺点:只能发送get一种请求。

2 跨域资源共享(CORS)(线上跨域解决方案)

(服务端解决的方式)
CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。
它允许浏览器向跨源服务器发出请求,从而解决了Ajax只能同源使用的限制。
CORS需要浏览器和服务器同时支持。目前,所==有浏览器都支持该功能,IE浏览器不能低于IE10。

我们只需要在后端代码上增加一个跨域请求响应头:Access-Control-Allow-Origin
例如php中的 header(Access-Control-Allow-Origin:*) *表示所有请求地址都允许跨域响应。

3.代理服务器

vue项目开发环境跨域问题
1.在vue.config.js里配置

// 跨域的代理中转服务器服务
proxy: {
    "/api":{   // /vue代理target
        target: 'http://10.1.XXX.XXX:8088',      // 后端接口的根目录
        // secure: true,           // 如果是 https ,需要开启这个选项,http为false
        changeOrigin: true,        // 是否跨域
        pathRewrite: {            // 是否重写路径,看代理前端路径是否与后端路径一致
          '^/api':'', //将所有含/api路径的,去掉/api转发给服务器                 
        }
    }
},

2.react项目开发环境跨域问题

npm i http-proxy-middleware -S

项目src中新建文件setupProxy.js,名字不能更改,必须是这个

//setupProxy.js内容
const proxy = require('http-proxy-middleware')
module.exports = function(app) {
  app.use(
    proxy.createProxyMiddleware('/api', {
      target: process.env.REACT_APP_BASE_URL, //你需要访问的地址
      changeOrigin: true,
      // secure: false,
      pathRewrite: {'^/api': ''}
    })
  )
}

3.nginx代理

server {
  listen 8888;
  server_name localhost;
  location /api/ {
      proxy_pass http://targetserver.com/api/;
      add_header Access-Control-Allow-Origin *;
      # 其他配置
  }
}

在上面的配置中,/api/ 是要跨域访问的接口路径,http://targetserver.com/api/ 是目标服务器的接口地址。当请求到达 Nginx 后,Nginx 会将请求代理到目标服务器,同时在响应头中添加 Access-Control-Allow-Origin 信息,允许所有源跨域访问。

4.Websocket方式解决跨域

使用Websocket也可以解决跨域问题,因为WebSocket本身不存在跨域问题,所以我们可以利用webSocket来进行非同源之间的通信,

二.跨域请求携带cookie

默认情况下是跨域是不会携带cookie的,例如:a.com 网站请求 b.com 的接口,这个时候不会把a.com这个域名下的 cookie 携带上。如果需要携带,则需要做一下配置

1.前端配置

XMLHttpRequest发请求需要设置

withCredentials=true

fetch 发请求需要设置

credentials = include

axios发请求配置:

axios.defaults.withCredentials = true

2.服务端配置

Access-Control-Allow-Credentials: true

Access-Control-Allow-Origin: [特定域名] // 不能设置为 “” 或 *,而要设置为客户端发送请求时的IP地址

因为最新版本谷歌浏览器 samesite 属性默认是 lax,lax 模式在很多情况都是不允许跨域携带cookie,所以必须要把 samesite设置为 none, 但是设置为 none 有一个要求,就是必须 secure 属性为 true,也就是必须使用 https 。

设置 cookie 增加配置

sameSite: 'none'
secure: true
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容