localStorage和cookie的跨域解决方案
原文转自:点我
前言
localStorage和cookie大家都用过,我前面也有文章介绍过,跨域大家也都了解,我前面也有文章详细描述过。但是localStorage和cookie的跨域问题,好多小伙伴没有遇到或者不是很清楚,下面这篇文章,我来简单的聊聊!
业务场景
cookie跨域的业务场景很多,例如:
1、百度www域名下面登录了,发现yun域名下面也自然而然登录了。
2、淘宝登录了,发现天猫也登录了,淘宝和天猫是完全不一样的2个域名。
cookie跨域
首先说说同一个主域下面的跨域问题,类似www.百度 和yun.baidu
聊到这里,必须说一说cookie的参数或者属性了。 打开谷歌浏览器,找到cookie,如下图:
关于具体每一个参数,这里就不详细介绍了,不清楚的大家可以搜索一下,下面主要介绍一下domain个path
path
cookie 一般都是由于用户访问页面而被创建的,可是并不是只有在创建 cookie 的页面才可以访问这个cookie。在默认情况下,出于安全方面的考虑,只有与创建 cookie 的页面处于同一个目录或在创建cookie页面的子目录下的网页才可以访问。那么此时如果希望其父级或者整个网页都能够使用cookie,就需要进行路径的设置。
path表示cookie所在的目录,haorooms.com默认为/,就是根目录。 在同一个服务器上有目录如下:
/post/,/post/id/,/tag/,/tag/haorooms/,/tag/id/
现假设一个
cookie1的path为/tag/,
cookie2的path为/tag/id/,
那么tag下的所有页面都可以访问到cookie1,而/tag/和/tag/haorooms/的子页面不能访问cookie2。 这是因为cookie2能让其path路径下的页面访问。
让这个设置的cookie 能被其他目录或者父级的目录访问的方法:
document.cookie = "name = value; path=/";
domain
domain表示的是cookie所在的域,默认为请求的地址,
如网址为 http://www.haorooms.com/post/long_lianjie_websocket ,那么domain默认为www.haorooms.com。
而跨域访问,
如域A为love.haorooms.com,域B为resource.haorooms.com,
那么在域A生产一个令域A和域B都能访问的cookie就要将该cookie的domain设置为.haorooms.com;
如果要在域A生产一个令域A不能访问而域B能访问的cookie就要将该cookie的domain设置为resource.haorooms.com。
这样,我们就知道为什么www.百度 和yun.baidu共享cookie,我们只需要设置domain为.baidu.com就可以了【注:点好是必须的】
业务场景中问题2,天猫和淘宝是如何共享cookie的?
cookie跨域解决方案一般有如下几种:
1、nginx反向代理
反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
反向代理服务器对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理 的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容 原本就是它自己的一样。
nginx配置如下:
upstream web1{
server 127.0.0.1:8089 max_fails=0 weight=1;
}
upstream web2 {
server 127.0.0.1:8080 max_fails=0 weight=1;
}
location /web1 {
proxy_pass http://web1;
proxy_set_header Host 127.0.0.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Cookie $http_cookie;
log_subrequest on;
}
location /web2 {
proxy_pass http://web2;
proxy_set_header Host 127.0.0.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Cookie $http_cookie;
log_subrequest on;
}
2、jsonp方法
其实,淘宝和天猫cookie的传递,应该也是利用jsonp来进行的,如下图:
打开淘宝首页,回向天猫发送一个请求。
说白了,这个jsonp 的cookie跨域和我们平时用的jsonp跨域是一样的,关于jsonp跨域,请看http://www.haorooms.com/post/js_kuayu_service
jsonp会通过回调函数来处理服务器端返回的数据,因为返回的可以执行的js代码(也就是重写cookie的path和域),然后自动执行返回的js代码,从而达到目的。
3、nodejs superagent
package.json中的模块依赖:
调用superagent api请求:
其实本质也是jsonp的方式。
同一域下,不同工程下的cookie携带问题
cookie跨域访问之后,可以成功的写入本地域。本地的前端工程在请求后端工程时,有很多是ajax请求,ajax默认不支持携带cookie,所以现在有以下两种方案:
(1). 使用jsonp格式发送
(2). ajax请求中加上字段 xhrFields: {withCredentials: true},这样可以携带上cookie
服务器需要配置:
Access-Control-Allow-Credentials: true
localStorage跨域
可以使用postMessage和iframe
思路如下:
假设有a.haorooms.com/text.html和b.haorooms.com/text.html两个页面。
通过a.haorooms.com/text.html页面去修改b.haorooms.com/text.html页面的本地数据:
① 在a.haorooms.com/text.html页面创建一个iframe,嵌入b.haorooms.com/text.html页面。
② a.haorooms.com/text.html页面通过postMessage传递指定格式的消息给b.haorooms.com/text.html页面。
③ b.haorooms.com/text.html页面解析a.haorooms.com/text.html页面传递过来的消息内容,调用localStorage API 操作本地数据。
④ b.haorooms.com/text.html页面包装localStorage的操作结果,并通过postMessage传递给a.haorooms.com/text.html页面。
⑤ a.haorooms.com/text.html页面解析b.haorooms.com/text.html页面传递回来的消息内容,得到 localStorage 的操作结果。
思路理清了,关于postMessage,我之前有文章专门介绍,请看文章:http://www.haorooms.com/post/window_postMessage
这里就不多详细介绍了!
localStorage和cookie的跨域解决方案的更多相关文章
- 携带cookie的跨域访问
携带cookie的跨域解决方案 有的时候访问后台的请求需要携带cookie以供后台分析,比如jQuery的ajax请求: $.ajax({ url: a_cross_domain_url, xhrFi ...
- 跨域解决方案一:使用CORS实现跨域
跨站HTTP请求(Cross-site HTTP request)是指发起请求的资源所在域不同于请求指向的资源所在域的HTTP请求. 比如说,我在Web网站A(www.a.com)中通过<img ...
- asp.net web api2.0 ajax跨域解决方案
asp.net web api2.0 ajax跨域解决方案 Web Api的优缺点就不说了,直接说怎么跨域,我搜了一下,主要是有两种. 一,ASP.NET Web API支持JSONP,分两种 1, ...
- iframe跨域解决方案
公司某个功能用的是iframe,由于跨域的原因,我们不能直接设置父级页面iframe的高度,所以用了一个中间页home来完成父级页面iframe的高度设置,这种中间页其实很多时候不好用,因为涉及到页面 ...
- [php-cookie] cookie 请求跨域,如何共享
cookie 请求跨域的问题, 假设我有两个域名,一个 m.example.com,另一个是 www.example.com . 那么我需要如何设置 cookie 才可以在这两个域名都实现共享呢? / ...
- JSON跨域解决方案收集
最近面试问的挺多的一个问题,就是JavaScript的跨域问题.在这里,对跨域的一些方法做个总结.由于浏览器的同源策略,不同域名.不同端口.不同协议都会构成跨域:但在实际的业务中,很多场景需要进行跨域 ...
- Cookie的跨域问题
被误解的HttpCookie.Domain属性 有人说可以利用HttpCookie.Domain属性实现跨域访问,假如在A站(A.com)中写B站(B.com)的cookie,如下所示 这其实是错误的 ...
- Atitit.js跨域解决方案attilax大总结 后台java php c#.net的CORS支持
Atitit.js跨域解决方案attilax大总结 后台java php c#.net的CORS支持 1. 设置 document.domain为一致 推荐1 2. Apache 反向代理 推荐1 ...
- js最全的十种跨域解决方案
在客户端编程语言中,如javascript和ActionScript,同源策略是一个很重要的安全理念,它在保证数据的安全性方面有着重要的意义.同 源策略规定跨域之间的脚本是隔离的,一个域的脚本不能访问 ...
随机推荐
- selenium 鼠标滑动操作验证码
selenium 鼠标点击操作比较简单,这里就不介绍了,主要说一下鼠标滑动(按住并滑动),经常用于解决自动化操作的滑动验证码 下面举个简单的例子,比如这种验证码: 代码: div = driver.f ...
- Linux配置dhcp服务器
一.安装dhcp软件 yum -y install dhcp 二.配置 dhcp 主配置文件 /etc/dhcp/dhcpd.conf ns-update-style interim; log-fac ...
- 2015蓝桥杯五星填数(C++C组)
题目:五星填数 如[图1.png]的五星图案节点填上数字:1~12,除去7和11.要求每条直线上数字和相等.如图就是恰当的填法.请你利用计算机搜索所有可能的填法有多少种.注意:旋转或镜像后相同的算同一 ...
- vue-resource安装与使用
vue-resource是vue中使用的请求网络数据的插件,这个插件是依赖于vue的,简单说就是用来调接口的. 安装 cd 项目目录 npm i vue vue-resource --save-dev ...
- 几行代码实现cookie的盗取
前言 上一篇文章中介绍了XSS(跨站脚本攻击)简单原理与几种类型.接下来通过实例用几行代码实现cookie的盗取. 正文 这里测试用的工具是DVWA(可以本地搭建,前面文章有介绍),和phpstudy ...
- AJ学IOS(42)UI之核心动画CAAnimationGroup以及其他
AJ分享,必须精品 效果: 代码: 很简单,不多说,就是把一堆动画放一起,看代码. - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent * ...
- 【three.js第七课】鼠标点击事件和键盘按键事件的使用
当我们使用鼠标操作three.js渲染出的对象时,不仅仅只是仅限用鼠标对场景的放大.缩小.旋转而已,还有鼠标左键.右键的点击以及键盘各种按键等等的事件.我们需要捕获这些事件,并在这些事件的方法里进行相 ...
- matlab计算LZ复杂度
我这个计算得14通道,每个通道截取3000个数据得复杂度,最后将计算得出得数据存储到本地txt文档中 function LZC(data) % 计算一维信号的复杂度 % data时间序列 % lzc: ...
- python做个谷歌内核浏览器
源码: import sys,os os.chdir(os.path.dirname(os.path.abspath(__file__))) from PyQt5.QtGui import * fro ...
- 深入理解Java线程状态转移
目录 前言 状态转移图 1.0 新建态到就绪态 1.1 就绪态到运行态 1.2 运行态到就绪态 1.2.1 时间片用完 1.2.2 t1.yield() .Thread.yield(); 1.3 运行 ...