js 跨域访问问题解决方法

如何用CORS来解决JS中跨域的问题 最近楼主在写代码的时候遇到了一个比较纠结的问题,需要在http请求的页面调用HTTPS的请求,但因为进行了跨域,导致请求失败。在这个过程中,楼主找了很多办法,如JSONP等,但都不能满足我的需求,后来,楼主发现,CORS提供了一套AJAX跨域问题的解决方案。 CORS的原理:CORS定义一种跨域访问的机制,可以让AJAX实现跨域访问。CORS 允许一个域上的网络应用向另一个域提交跨域 AJAX 请求 阅读详情

什么引起了ajax不能跨域请求的问题?

ajax本身实际上是通过XMLHttpRequest对象来进行数据的交互,而浏览器出于安全考虑,不允许js代码进行跨域操作,所以会警告。

 

有什么完美的解决方案么?

解决方案有不少,但是只能是根据自己的实际情况来选择。

 

跨域的安全限制都是指浏览器端来说的,服务器端是不存在跨域安全限制的。所以针对这2种情况衍生出2类跨域解决方案,一类是服务器端做中转类似代理方式,一类是js处理浏览器端的真正跨域访问。

 

具体情况有:

  1.   本域和子域的相互访问: www.aa.com和book.aa.com 用document.domain = "aa.com";
  2. 本域和其他域的相互访问: www.aa.com和www.bb.com 用 XMLHttpRequest访问代理,既服务器端代理方式
  3. 本域和其他域的相互访问: www.aa.com和www.bb.com 用 JS创建动态脚本,<script>标签的src属性实现跨域访问

 

解决方法:

 

  1. 如果想做到数据的交互,那么www.aa.com和book.aa.com必须由你来开发才可以。可以将book.aa.com用iframe添加到 www.aa.com的某个页面下,在www.aa.com和iframe里面都加上document.domain = "aa.com",这样就可以统一域了,可以实现跨域访问。就和平时同一个域中镶嵌iframe一样,直接调用里面的JS就可以了。
  2. 这种情形是最经常遇到的,也是用的最多的了。就是www.aa.com和www.bb.com你只能修改一个,也就是另外一个是别人的,人家告诉你你要取得数据就访问某某连接参数是什么样子的,最后返回数据是什么格式的。而你需要做的就是让你的服务器端充当中转代理,让服务器去别人的网站上取得数据,再返回给浏览器端。

服务器端充当中转代理方式有很多可以由服务器端程序实现,也可以修改服务器配置实现,下面举例Apache重写(mod_rewrite proxy模式)方式:
在Apache的安装目录下的conf/httpd.conf 文件添加如下语句:

?
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule rewrite_module modules/mod_rewrite.so
RewriteEngine On
RewriteRule ^/_proxy/(.*)$ http:// $1  [P,L]

 

 


这样就可以把其他网站的url映射为本服务器的/_proxy/目录下面, 例如可以这么访问百度http://html.duqn.com/_proxy/www.baidu.com


 这个的区别就是请求是使用<script>标签来请求的,这个要求也是两个域都是由你来开发才行。原理就是JS文件注入,在本域内的aa.com 内生成一个JS标签,它的SRC指向请求的另外一个域bb.com的某个页面b,b返回数据即可,可以直接返回JS的代码。因为script的src属性是可以跨域的。具体看代码,这个也比较简单。

aa.com/a.jsp

?
<script type= "text/javascript" >
function  myTest(data) {
     alert(data);
}
</script>
<script type= "text/javascript"  src= "http://www.bb.com/index!getData.action?jsoncallback=myTest" ></script>

 

 

bb.com/b.jsp页面代码如下:

 

?
$(param.jsoncallback)({ "name" : "Zhang Huihua" , "QQ" : "350863780" })

 

b.jsp页面通过$(param.jsoncallback)得到浏览器端随后要回调的js function name:myTest

实际上客户端接收到的response如下:myTest({"name": "Zhang Huihua", "QQ": "350863780"})

 

 

 

jQuery浏览器端跨域访问

目前jQuery $.ajax()支持get方式的跨域,这其实是采用jsonp的方式来完成的。其原理就是上面第三种方式,<script>标签的src属性实现跨域访问

真实案例代码如下:

?
$.ajax({
     url: http: //跨域的dns/index!searchJSONResult.action,
     type: "GET" ,
     dataType: 'jsonp' ,
     data: {name:”ZhangHuihua”},
     timeout: 5000,
     success: function  (json) { //客户端jquery预先定义好的callback函数,成功获取跨域服务器上的json数据后,会动态执行这个callback函数
         alert(json);
     },
     error: function  (xhr, ajaxOptions, thrownError){
           alert( "Http status: "  + xhr.status + " "  + xhr.statusText + "\najaxOptions: "  + ajaxOptions + "\nthrownError:" +thrownError + "\n"  +xhr.responseText);
     }
 
});

注意:

?
$.getJSON( "http://跨域的dns/index!searchJSONResult.action?name1=" +value1+ "&jsonCallback=?" , function (json){
     // 执行代码
});

这种方式其实是上例$.ajax({..}) api的一种高级封装,有些$.ajax api底层的参数就被封装而不可见了.

这样,jquery就会拼装成如下的url get请求

http:// 跨域的 dns/index!searchJSONResult.action?&jsonCallback=jsonp1236827957501&_=1236828192549&name=ZhangHuihua

 

jsonCallback自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名,也可以写"?",jQuery会自动为你处理数据.

 

在响应端(http://跨域的dns/index!searchJSONResult.action),

通过 jsoncallback = request.getParameter("jsoncallback") 得到jquery端随后要回调的js function name:jsonp1236827957501

然后 response的内容为一个Script Tags:"jsonp1236827957501("+按请求参数生成的json数组+")";

jquery就会通过回调方法动态加载调用这个js tag:jsonp1236827957501(json数组);

这样就达到了跨域数据交换的目的.

 

jsonp的最基本的原理是:动态添加一个<script>标签,而script标签的src属性是没有跨域的限制的。这样说来,这种跨域方式其实与ajax XmlHttpRequest协议无关了.

这样其实"jQuery AJAX跨域问题"就成了个伪命题了,jquery $.ajax方法名有误导人之嫌.

如果设为dataType: 'jsonp', 这个$.ajax方法就和ajax XmlHttpRequest没什么关系了,取而代之的则是JSONP协议.

JSONP是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问

JSONP即JSON with Padding。由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源。如果要进行跨域请求,

我们可以通过使用html的script标记来进行跨域请求,并在响应中返回要执行的script代码,其中可以直接使用JSON传递javascript对象。

这种跨域的通讯方式称为JSONP。

jsonCallback 函数jsonp1236827957501(....): 是浏览器客户端注册的,获取跨域服务器上的json数据后,回调的函数

 

Jsonp原理:

首先在客户端注册一个callback (如:'jsoncallback'), 然后把callback的名字(如:jsonp1236827957501)传给服务器。

此时,服务器先生成 json 数据。

然后以 javascript 语法的方式,生成一个function , function 名字就是传递上来的参数 'jsoncallback'的值 jsonp1236827957501 .

最后将 json 数据直接以入参的方式,放置到 function 中,这样就生成了一段 js 语法的文档,返回给客户端。

客户端浏览器,解析script标签,并执行返回的 javascript 文档,此时javascript文档数据,作为参数,

传入到了客户端预先定义好的 callback 函数(如上例中jquery $.ajax()方法封装的的success: function (json))里.(动态执行回调函数)

可以说jsonp的方式原理上和<script src="http://跨域/...xx.js"></script>是一致的(qq空间就是大量采用这种方式来实现跨域数据交换的) .JSONP是一种脚本注入(Script Injection)行为,所以也有一定的安全隐患.

 

注意,jquey是不支持post方式跨域的.

虽然采用post +动态生成iframe是可以达到post跨域的目的,但这样做是一个比较极端的方式,不建议采用.

也可以说get方式的跨域是合法的,post方式从安全角度上,被认为是不合法的, 万不得已还是不要剑走偏锋..

浏览器端跨域访问的需求看来也引起w3c的注意了,看资料说html5 WebSocket标准支持跨域的数据交换,应该也是一个将来可选的跨域数据交换的解决方案.

JS跨域访问IFrame问题的解决方法 同源策略是浏览器的一个核心安全机制,它防止不同源的文档或脚本之间的相互干扰。所谓“源”通常由协议、域名和端口号共同决定。当两个URL的协议、域名和端口号都相同时,它们才被看作是同源的。跨源资源共享(Cross-Origin Resource Sharing,简称CORS)是一种网络浏览器的安全策略,允许服务器在响应跨域HTTP请求时指定哪些域可以从其接收请求。CORS通过在HTTP头中添加新的字段来实现跨域请求,允许服务器声明哪些来源可以访问资源,从而允许或拒绝来自不同源的请求。 阅读详情

相关推荐

CISP-PTE考前实操练习题

CISP-PTE考前学习练习题目,渗透测试功工程师

2301_79546223的博客 1996

网站跨域访问的问题

(1)Host:表示当前请求要被发送的目的地host,仅包括域名和端口号。在任何类型请求中,request都会包含此header信息。(2)Referer:Referer请求头包含了当前请求页面的来源页面的地址,即表示当前页面是通过此来源页面里的链接进入的。它由协议+域名+查询参数组成(注意不包含锚点信息),所有类型的请求都包含此header。

m0_73896875的博客 343

手把手教你用Python实现ITRS与GCRS坐标转换(附完整代码)

本文详细介绍了如何使用Python的Astropy库实现ITRS与GCRS坐标转换。文章从环境配置、坐标对象构建入手,深入解析了transform_to方法背后的转换矩阵与地球定向参数管理,并通过卫星地面轨迹计算实战案例,帮助开发者掌握高精度空间坐标转换的核心技术与工程实践。

weixin_28335283的博客 79

详解浏览器跨域访问的几种办法

​​​​​​​​​​​​摘要: 本文讨论 web 前端安全问题以及应对措施,浏览器同源策略以及对资源跨域访问的几种解决方案今天说一说和前端相关的 Web 安全问题和开发过程中经常遇到的跨域问题。

A_991128a的博客 1248

告别I2C和SPI:用FPGA驱动DS18B20,一根线搞定温度采集(附Verilog代码)

本文详细介绍了如何利用FPGA通过单总线协议(One-Wire)驱动DS18B20温度传感器,仅用一根数据线实现高效温度采集。内容涵盖协议解析、Verilog代码实现及调试技巧,帮助开发者节省IO资源并提升系统性能。

weixin_42696271的博客 389

史上最小白之RNN详解

1.前言 网上目前已经有诸多优秀的RNN相关博客,但是我写博客的出发点主要是为了加深和巩固自己的理解,所以还是决定自己再进行一下总结和描述,如有不正确的地方欢迎指正~ 2.区分RNN 循环神经网络(Recurrent Neural Network),递归神经网络(Recursive Neural Network),你有没有发现他们的缩写都是RNN,那他们两个是同一回事儿吗?网上有一些博客把这两就当...

Tink1995的博客 4万+

前端引入第三方js跨域

在前端引入第三方JS时跨域是一个常见的问题。以上是解决前端引入第三方JS跨域问题的几种常见方法,根据具体情况选择最适合的方法。​标签加载外部脚本,所以需要确保加载的脚本是可信的,且不会执行恶意代码。请注意,使用JSONP存在一些安全风险,因为它是通过动态创建​。如果只允许特定的源访问,可以将​。​替换为对应的域名。

700

国社科基金申报书“选题与说明依据”用AI怎么写?借助Gemini 3 Pro一次理清研究演进逻辑

研究进展部分要明确指出已有研究的不足与局限,比如方法不足、数据或材料受限、研究视角单一等等局限,之后要找准研究切入点,自然引申出自己的研究问题。为提升课题申报书的质量,学术史梳理要遵循述评结合、中外结合、新老结合的原则,不仅“述”,更要“评”,兼顾国内研究与国际学术动态,统筹经典研究与最新成果。它是对选题的整体概述,需阐明研究的具体问题、视角以及核心概念。2)存在问题或争议:结合已有研究或实践现状,指出该领域在理论建构、测量工具、实践应用或研究结论方面仍存在的不足、空白或争议,明确研究的必要性;

智能AI让学术科研更容易 938

【一文读懂】浏览器跨域访问问题及其解决方案

介绍一下浏览器跨域访问问题及其解决方案

Bl_a_ck的博客 2302

基于SVD矩阵分解的用户购物篮预测分析实战

基于SVD矩阵分解的用户购物篮预测分析实战

360

华为OD机试 - 压缩日志查询(Python/JS/C/C++ 双机位C卷 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。某设备需要记录每分钟检测到的指标值。为了节约存储空间,将连续相同指标值的记录合并。压缩之前:202411231000,11 202411231001,11 202411231002,12 202411231003,12 202411231004,

学Java,找哪吒 1878

js跨域的解决方案

指的是浏览器不能执行其他网站的脚本,简单来说是浏览器同源政策的限制,浏览器针对于的限制。两个页面拥有相同的协议,端口,域名就是同源,如果有一个不相同就是不同源。保护用户,防止一些网站盗取用户信息。 1、通过jsonp跨域 2、跨域资源共享(CORS) 3、document.domain + iframe跨域 4、location.hash + iframe 5、window.name + iframe跨域 6、postMessage跨域 7、nginx代理跨域 8、nodejs中间件代理跨域(非vue、v

muzidigbig的博客 1万+

OSPF规划两大模型:双塔奇兵、犬牙交错

大家好,今天给大家带来的是OSPF规划两大模型:双塔奇兵、犬牙交错,让我们直接开始吧! OSPF规划之双塔奇兵 说明: OSPF 如果某个区域存在两个 ABR,并且在两个 ABR 上都对 area n 内的路由做了聚合操作。 最佳配置: 两台ABR之间的红线应该使用以太网的子接口技术,一个子接口属于area0,另一个属于 area n;或者该链路规划为 area n,同时配置虚连接; ABR 的 loopback0 规划入 area 0 OSPF 规划之犬牙交错 说明: 有时接入层的设备会以乱序的

网络技术联盟站 2423

解决调用Iframe引入跨域访问页js方法问题

Js跨域问题是web开发人员最常碰到的一个问题之一。所谓js跨域问题,是指在一个域下的页面中通过js访问另一个不同域下的数据对象,出于安全性考虑,几乎所有浏览器都不允许这种跨域访问,这就导致在一些ajax应用中,使用跨域的web service会成为一个问题。 本文章所介绍的用...

weixin_34218579的博客 1007

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【转】js 跨域访问问题解决方法

本文原址:http://www.cnblogs.com/dwzjs/archive/2011/08/19/2146093.html   什么引起了ajax不能跨域请求的问题? ajax本身实际上是通过XMLHttpRequest对象来进行数据的交互,而浏览器出于安全考虑,不

Fighting with Winston Shao 546

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

ESP32连接WPA2网络失败?从四次握手原理到实战避坑指南

WPA2-PSK是当前2.4G WiFi网络最主流的加密认证标准,其核心是通过四次握手协商出成对主密钥PTK,再以AES-CCMP加密数据帧。在嵌入式开发中,ESP32的WiFi连接稳定性高度依赖认证模式与加密算法的正确匹配。当路由器运行WPA/WPA2混合模式或TKIP加密时,若代码中认证枚举值配置不当,便会出现密码正确却反复连接失败、频繁掉线等典型问题。理解WPA2握手流程与ESP32协议栈的交互机制,有助于快速定位加密类型不匹配、射频供电不足等工程痛点,广泛应用于智能家居、传感器网关等物联网场景。

weixin_34074740的博客 214

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

JS跨域访问 问题解决中

经常看到有人去面试被问到JS跨域访问问题,到底什么是js跨域问题呢?是不是cookie问题?如果仅仅是cookie,那用单点登录就可以实现。基于疑惑查了些资料。 由于安全方面的考虑,Javascript被限制了跨域访问的能力,但是有时候我们希望能够做一些合理的跨域访问的事情,那么怎么办呢?这里分两类情况:一、基于同一父域的子域之间页面的访问;参见如下3个domain 域:taobao...

weixin_30551947的博客 84

关于JS跨域访问的简解

Javascript出于安全性考虑,不允许跨域调用其他页面的对象。 最近在项目中也遇到了这个问题,存在于多应用系统之间JS的调用时。 问题是在平台系统(A系统)主页面上包含了一个展现业务系统(B系统)的待办列表的JSP,而当点击其中的连接的时候,是要在A的主页面上调用JS方法打开一个标签页,标签页中载入B业务平台,但两个系统不在同一个域,所以就出现无法访问的情况。 我们的解决方案是,先在A系...

hck341204的专栏 129

WKWebView捕获JS Error 跨域解决

通过window.onerror捕获到js error以后,发现js error都是Script error,毫无参考价值,webkit源码查看可知,script资源加载的地方,是进行了同源策略判断的,如果是非同源资源,errorMessage就被写死了Script error File跨域漏洞 UIWebView虽然已经被遗弃,但依然还有很多app继续使用,且最新版本的iOS也会兼容UIWeb...

lfdanding的专栏 4316

js跨域访问问题

经常看到有人去面试被问到JS跨域访问问题,到底什么是js跨域问题呢?是不是cookie问题?如果仅仅是cookie,那用单点登录就可以实现。基于疑惑查了些资料。  由于安全方面的考虑,Javascript被限制了跨域访问的能力,但是有时候我们希望能够做一些合理的跨域访问的事情,那

xincai的专栏 4009

前端解决跨域问题

🤹‍♀️潜意识起点:个人主页🎙座右铭:得之坦然,失之淡然。💎擅长领域:前端是的,我需要您的:🧡点赞❤️关注💙收藏💛是我持续下去的动力!目录 一.作者有话说二.第一步2.1 在你的vue找到 vite.config.js2.2 快捷代码 三. 第二步 3.1 访问路径更改​编辑3.2 问题解决了四.总结【不用看,浪费大家时间】4.1 安全性4.2 灵活性4.3 模块化架构4.4 分离关注点4.5 提高用户体验4.6 便于调试和测试4.7 支持移动端和多平台应用4.8 增强API管理4.9 支持CD

潜意识Java的博客 1138

JS中的跨域问题

JS中的跨域问题 一、什么是跨域? 1.定义:跨域是指从一个域名的网页去请求另一个域名的资源。比如从www.baidu.com 页面去请求 www.google.com 的资源。但是一般情况下不能这么做,它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制。跨域的严格一点的定义是:只要 协议,域名,端口有任何一个的不同,就被当作是跨域 所谓同源是指,域名,协议,端口均相同。这...

qq_41812443的博客 619
上一篇: 使用VMware安装OS X 10.8 Mountain Lion (多图/零基础/保证成功安装)
下一篇: 十八年开发经历小结
7star_java
博客等级 码龄15年 80粉丝 127原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值