怎么解决服务器间的跨域问题

怎么解决服务器间的跨域问题,第1张

关于跨域名问题还是问题么,这方面的解决实践非常多,今天我就旧话重提把我所知道的通过几个应用场景来分别总结一下(转帖请注明出处:http://blog.csdn.net/lenel)

先说明一点:我说的某某域名在您的控制下的意思是这个域名下的网页由您来负责开发内部的JavaScript

场景一:将bbs.xxx.com的页面用iframe嵌入到www.xxx.com的中,如何在iframe内外使用js通信(转帖请注明出处:http://blog.csdn.net/lenel)

一级域名都是xxx.com 这个域名一定是在您的控制下,所以你只要在两个页面中同时升级域名即可

在父窗口和iframe内部分别加上js语句:document.domain="xxx.com"

之后2个页面就等于在同一域名下,通过window.parent oIframe.contentDocument就可以相互访问,进行无障碍的JS通信

在新浪、淘宝等很多页面都能找到这样的语句。不过document.domain不可以随便指定,只能向上升级,从bbs.xxx.com升级到yyy.com肯定会出错

场景二:将www.yyy.com的页面用iframe嵌入到www.xxx.com的中,两个域名都在您的控制下,如何在iframe内外进行一定的数据交流(转帖请注明出处:http://blog.csdn.net/lenel)

你可以通过相互改变hash值的方式来进行一些数据的通信

这里的实现基于如下技术要点:

1、父窗口通过改变子窗口的src中的hash值把一部分信息传入,如果src只有hash部分改变,那么子窗口是不会重新载入的。

2、子窗口可以重写父窗口的location.href,但是注意这里子窗口无法读取而只能重写location.href所以要求前提是您控制两个域

名,知道当前父窗口的location.href是什么并写在子窗口内,这样通过parent.location.href =

"已知的父窗口的href" "#" hash。这样父窗口只有hash改变也不会重载。

3、上面两步分别做到了两个窗口之间的无刷新数据通知,那么下面的来说如何感知数据变化。标准中没有相关规定,所以当前的任意浏览器遇到

location.hash变化都不会触发任何javaScript事件,也就是说您要自己写监听函数来监视loaction.hash的值的变化。做法

是通过setTimeout或者setInterval来写一个监听函数每20-100ms查看一下hash是否变化,如果变化了驱动js根据新的数据做

想做的事情。

这种实现的一些分析:

1、信息通道是双向的,当然会兼容单向,如果只是父窗口向子窗口通知数据,只需要子窗口写hash监听,反之亦然。

2、局限性也是颇大,因为这种通信的前提是双方知道对方的location.href。如果父窗口带有动态的location.search也就是查询参数,那么子窗口的处理上就比较困难,需要把父窗口的location.search作为传递信息的一部分告知子窗口。

3、另外的困扰会有浏览器带给你,IE之外的浏览器遇到hash的改变会记录历史,这样你在处理前进后退的时候会非常头疼

场景三:将www.yyy.com的页面用iframe嵌入到www.xxx.com的中,只有被嵌入的yyy.com在您的控制下,如何在iframe内外进行一定的交流

真实场景:google adsence的一个需求,你希望google发现您的页面不能匹配出相关性非常好的按点击付费广告时,你希望google的广告iframe能够隐藏。

google的广告iframe在google域下显然不能把自己隐藏掉,那么怎么办呢?

1、google会提供给你一个html页面

2、您将这个页面放置在您的域名下,并告诉google它的位置

3、当google发现没有很好的广告时,会将子窗口的loaction重定向到您的那个页面下,这样您的页面因为同域名就可以访问父页面来隐藏自己了

是不是很巧的方法?

场景四:您是内容发布商,如何改造接口,让其他域名下的页面可以从浏览器端出发获得您的数据

我们知道ajax的xmlHttpRequest()说到底是一个无刷新请求服务器数据的辅助工具,但是xmlHttpRequest并不能跨域名请求数据,在某些情况下成了极大的限制。

但是我们如果通过其他方式完成无刷新请求数据不也可以么,我们用Dom方法操作动态JS脚本请求来做这件事。

//创建一个脚本节点

var oScript = document.createElement('script')

//指定脚本src src可以指向任意域名

//注意src不再指向静态js,而是带着查询参数指向一个动态脚本广播服务。

oScript.src = "http://yyy.com/query.php?" yourQueryString

//如果指定了charset 同时还可以解决xmlHttpRequest另一大困扰 乱码问题

//oScript.charset = "utf-8"

//通过Dom操作把这个新的节点加入到文档当中

document.getElementsByTagName("head")[0].appendChild(oScript)

这样只要query.php的输出是可执行的javaScript脚本,比如:djsCallBack({jsondata})

当他从服务器返回后就会自动执行,你可以方便的用json方式来做数据传递了。

要注意,您的脚本请求最好带上时间戳,避免浏览器缓存造成取回数据实时性下降。

如果您是数据提供者,您可以要求数据索取者在查询参数中提供回调函数名,比如query.php?callback=myDataHandler

域(Domain)是Windows网络中独立运行的单位,域之间相互访问则需要建立信任关系(即Trust Relation)。信任关系是连接在域与域之间的桥梁。当一个域与其他域建立了信任关系后,2个域之间不但可以按需要相互进行管理,还可以跨网分配文件和打印机等设备资源,使不同的域之间实现网络资源的共享与管理。 有一种简明的说法来解释广域跨域:跨域访问,简单来说就是 A 网站的 javascript 代码试图访问 B 网站,包括提交内容和获取内容。由于安全原因,跨域访问是被各大浏览器所默认禁止的。

解决方案:

1、js向服务器发送请求,然后让服务器去另一个域上获取数据后返回。(用于你无法控制另一个域) 比如php中利用cUrl。

2、放置跨域文件.

3、用JSONP。虽然不能跨域进行通信,但是可以引入跨域的js文件。

先定义一个函数

var returnData

function getData(obj) {

   returnData = JSON.parse(obj)

}

当我们要向www.baidu.com/s.php请求数据的时候,我们可以引入某个包含返回信息的js文件。

比如: <script type="text/javascript" src="www.baidu.com/s.php?id=12321" />

js的内容是getData({json:'格式'})返回时输出 格式是 text/javascript (比如php用header('Content-type:text/javascript')来输出)

那么文件加载好后解析js时就会执行这个函数,返回得到的数据就被赋值给了returnData变量

以这样的方式插入到页面中:

var script = document.createElement('script')

script.src='www.baidu.com/s.php?id=12321'  //传入参数id=12321

body.appendChild(script)

跨域是由http协议的无状态性引发的。考虑下面的流程:

客户选择购物 ->在线支付 ->支付成功 ->发货

如果中间有黑客入侵,跳过支付成功直接向发货的API请求怎么办?

跨域就是来解决这个问题的,服务器端在维护某个session时禁止跨域,这样黑客即使成功盗取了session token数字凭证,也会因为ip地址与之前请求不一致而导致拒绝。

具体方法是服务器在http头强制设置这一要求,并且伴随session检查是否符合这一要求。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/348182.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-07
下一篇2023-05-07

发表评论

登录后才能评论

评论列表(0条)

    保存