【跨域异常】跨域解决方案之----通过document.domain实现跨域访问

本文涉及的产品
.cn 域名,1个 12个月
简介: 通过document.domain实现跨域访问

一、跨域问题产生的原因

Javascript出于对安全性的考虑,而禁止两个或者多个不同域的页面进行互相操作。相同域的页面在相互操作的时候不会有任何问题。我们在用跨域的时候。大部分都在知道哪些问题是跨域问题,也知道怎么解决。但是就是具体解决,或者说最终解决,都不理想,或者最终解决不了。

解决方案,大部分人都会回答,document.domain、jsonp、iframe,只是不知道具体怎么去解决。

一般出现这些问题。


Error: Permission denied to access property xxxx


跨域了,然后去访问原来域的内容,就会这样。因为域不一样,导致访问失败。怎么解决呢。首先用document.domain来指定域,是可以的,但是有局限性,也就是一级域名一致才可以。如下:

www.xxx.com  下指到xxx.com 是可以的。

icp.xxx.com  下指到 xxx.com 是可以的。

像上面是可以的,因为一级域名都是 xxx.com 。

www.xxx.com下指到 www.baidu.com是不行的。

xxx.com指到 baidu.com还是不行的。

像上面是不可以的,因为一级域名都不一致,这个情况下,会报错:


NS_ERROR_DOM_BAD_DOCUMENT_DOMAIN: Illegal document.domain value


规则说明了,那么下面来说怎么解决吧,当然要结合 Iframe  。

需求:

比如我们要在当前页面下,“www.xxx.com/shiro” 下上传图片到 "cdn.xxx.com/images/" 下去。直接搞肯定是不行的。

解决方法:

在请求“www.xxx.com/shiro” 的时候,写上如下代码:

if(document.domain!='xxx.com'){
document.domain='xxx.com';
}

然后在上传的地址“cdn.xxx.com” 的Iframe 文件内写上一样的代码。

if(document.domain!='xxx.com'){
document.domain='xxx.com';
}

这样上传就是在相同的域下了,有的人是少了第一步,其实仔细想想,正所谓跨域,就是指你使用功能的时候,当前域和使用的域不一样,所以要在前面就指定就可以了。故保证一致。

1.1 域名拓展

PS:这里额外补充一下,能懂就懂,不懂也没事。


一级域名:一级域名中只含有一个“.”,且“.”左边要没有内容。最后一个点的右边被称为一级域名,一级域名又被称为顶级域名。下面列出的都是一级域名,如:.com(表示商业机构)、.org(表示非营利性组织)、.gov(表示政府机构)、.edu(表示教育机构)、.mil(表示军事机构)等等。有人把www.xxx.com叫一级域名这是错误的。


二级域名:英语:Second-level domain;英文缩写:SLD,是互联网DNS等级之中,处于顶级域名之下的域。二级域名是域名的倒数第二个部分,例如在域名example.baidu.com中,二级域名是Baidu。如:xxx.com、baidu.com等等。

以百度贴吧为例:

.com 顶级域名/一级域名
baidu.com 二级域名
tieba.baidu.com 三级域名
detail.tieba.baidu.com 四级域名
(其他级别域名以此类推)

二、解决方案

2.1 方案1 利用document.domain 实现跨域

前提条件:这两个域名必须属于同一个基础域名!而且所用的协议,端口都要一致,否则无法利用document.domain进行跨域。比如在:aaa.com的一个网页(a.html)里面 利用iframe引入了一个bbb.com里的一个网页(b.html)。这时在a.html里面可以看到b.html里的内容,但是却不能利用javascript来操作它。因为这两个页面属于不同的域,在操作之前,js会检测两个页面的域是否相等,如果相等,就允许其操作,如果不相等,就会拒绝操作。这里不可能把a.html与b.html利用JS改成同一个域的。因为它们的基础域名不相等。(强制用JS将它们改成相等的域的话会报跟上面一样的"参数无效错误。")所以如果在a.html里引入aaa.com里的另一个网页,是不会有这个问题的,因为域相等。

有另一种情况,两个子域名:

aaa.xxx.com

bbb.xxx.com

aaa里的一个网页(a.html)引入了bbb 里的一个网页(b.html),这时a.html里同样是不能操作b.html里面的内容的。因为document.domain不一样,一个是aaa.xxx.com,另一个是bbb.xxx.com。

这时我们就可以通过Javascript,将两个页面的domain改成一样的,需要在a.html里与b.html里都加入:

document.domain="xxx.com";


PS:某一页面的domain默认等于window.location.hostname。主域名是不带www的域名,例如a.com,主域名前面带前缀的通常都为二级域名或多级域名,例如www.a.com其实是二级域名。 domain只能设置为主域名,不可以在b.a.com中将domain设置为c.a.com。

问题:

1、安全性,当一个站点(b.a.com)被攻击后,另一个站点(c.a.com)会引起安全漏洞。

2、如果一个页面中引入多个iframe,要想能够操作所有iframe,必须都得设置相同domain。

2.2 方案2 修改url的写法

根据错误提示信息,按要求修改请求的url即可。

在另一篇博客里记录着,请移步至此:https://blog.csdn.net/weixin_44299027/article/details/105968382



本文首发于CSDN,为博主原创文章,如果需要转载,请注明出处,谢谢!


完结!

相关文章
|
8天前
|
开发框架 中间件 Java
如何处理跨域资源共享(CORS)的 OPTIONS 请求?
处理 CORS 的 OPTIONS 请求的关键是正确设置响应头,以告知浏览器是否允许跨域请求以及允许的具体条件。根据所使用的服务器端技术和框架,可以选择相应的方法来实现对 OPTIONS 请求的处理,从而确保跨域资源共享的正常进行。
|
14天前
|
存储 缓存 网络协议
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点,GET、POST的区别,Cookie与Session
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点、状态码、报文格式,GET、POST的区别,DNS的解析过程、数字证书、Cookie与Session,对称加密和非对称加密
|
前端开发 JavaScript 安全
|
Web App开发 JavaScript 前端开发
【跨域】一篇文章彻底解决跨域设置cookie问题!
之前做项目的时候发现后端传过来的 SetCookie 不能正常在浏览器中使用。是因为谷歌浏览器新版本Chrome 80将Cookie的SameSite属性默认值由None变为Lax。接下来带大家解决该问题。
3224 0
|
JavaScript 前端开发 PHP
通过js(ajax)请求另外一个域名的接口时会产生跨域问题解决办法
通过js(ajax)请求另外一个域名的接口时会产生跨域问题解决办法
303 0
|
前端开发
fetch各种报跨域错误,数据无法获取的解决方案
1、介绍     fetch 提供了一个获取资源的接口 (包括跨域)。     fetch 的核心主要包括:Request , Response , Header , Body     利用了请求的异步特性 --- 它是基于 promise 的   2、用法 var request = new Request('/users.
4528 0
jsonpweb端跨域资源请求
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34173549/article/details/80547783 js...
718 0
|
Web App开发 前端开发 JavaScript
ajax 跨域----好用的解决方案
一、前言 跨域这个词就一直以很高的频率在身边重复出现,一直到现在,已经调试过N个跨域相关的问题了! 但是感觉还是差了点什么,于是现在重新梳理了一下。个人见识有限,如有差错,请多多见谅 二、前言 关于跨域,有N种类型,本文只专注于 ajax请求跨域(ajax跨域只是属于浏览器"同源...
2345 0
|
JSON JavaScript 前端开发