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

Posts - 209,
Articles - 0,
Comments - 1524
11:20 by 贺臣, ... 阅读,
一. 使用JSONp方式调用
  不做详细讲解,可以参考jq文档
二. 服务端配置
  修改Web.config 文件
&system.webServer&
&modules runAllManagedModulesForAllRequests="true"&&/modules&
&httpProtocol&
&customHeaders&
&add name="Access-Control-Allow-Origin" value="*"/&
&add name="Access-Control-Allow-Headers" value="Content-Type"/&
&add name="Access-Control-Allow-Methods" value="GET,POST,PUT,DELETE"/&
&/customHeaders&
&/httpProtocol&
&/system.webServer&
  客户端调用代码如下
var param = {};
var msg = "dafdasfdsaf";
param["userName"] = "1";
param["passWord"] = "1";
param["code"] = "3323";
url: "http://www./UserAjax/Login?t=" + Math.random(),
data: param,
type: "post",
async:false,
success: function (result) {
alert(result);
alert(msg+"ddddddddddFFFFFFFFFFFFFFFF");
  经过测试调用成功,可以用于手机端的调用你可能喜欢
12345678910
关于本站 本站以分享运维技术为主,欢迎大家参与技术分享,同时也欢迎大家吐槽,本站提供以下交流圈:QQ群①:*****(满)QQ群②:6690706 QQ群③: QQ群④:(新) 微信公众号:ttlsacom 商务合作QQ:如何解决 Ajax 跨域请求不到的问题?
希望最好用原生js,可以掠去ajax方法体,而且能满足post需求,另外,请不要直接拷网上的“滥”了的文章。。。谢谢增加一個問題:我要用JS獲取一個網頁上面的內容, 一個JSON. 格式只能是: {'id' : xxx}. 我試過JSONP不成=.= iframe的話, JS又訪問不了iframe內容(因為跨域). 又不可以用代理. 因為要用戶身份認證.求教呀
按投票排序
lz,不要多想了,如果要请求的服务器不是你控制的,那基本不可能了。如果你可以控制要请求的服务器,那完全可以定制虾 用jsonp。什么iframe,window。name也都用不着了。。。
尽量让前端简化吧 在我看来最简单最直接的方案不过两种:1. 配置目标服务器的CORS 2. 如果觉得CORS有学习成本,最简单的办法就是加一个“转发”的路由,注意这里不是“跳转”,因为跳转同样会遇到跨域问题。
既然这样,为何舍近取远呢?这才叫做最原生的处理方法。方法1
服务器端直接设置header内容
Access-Control-Allow-Origin:*
Access-Control-Allow-Origin:htt@p://
这样就可以直接请求到任何网站或者htt@p://php程序这样写:
header('Access-Control-Allow-Origin:*');或者
header('Access-Control-Allow-Origin:htt@p://');(注意去掉@,知乎编辑器不知道怎么不让带http的网址自动链接,先这样写了)方法2
在Nginx设置”头信息“直接添加Access-Control-Allow-Origin:*的信息。
除非你有数据的控制权,能通过 JSONP 或者 CORS 等方法拿到数据,否则肯定没戏。这是个浏览器的原则问题,如果有跨域方法那肯定是浏览器漏洞,早晚会被修复。在一些上古浏览器里可以使用上古漏洞,修改 Object 或 Array 的构造函数来进行 JSON 劫持。就像这样:&script&
Object.prototype.__defineSetter__('id', function(obj) {
alert(obj);
&script src="/test.json"&&/script&
这样就会弹出 test.json 中所有 key 为 “id” 的值。或者这样:var arrData;
Array = function() {
arrData = this;
这样通过 arrData 也能访问到 JSON 数据。现代浏览器早就把这些漏洞封死了,如果你能找到可以在前端劫持 JSON 的通用漏洞,那卖给黑产小哥都够你大赚一笔的了。
jsonp 是写 script 标签,只能满足 get 请求。跨域 post 的话,IE8 及以上和其他主流浏览器可以用 window.postMessage 来实现,也就是传说中的 HTML5 方法了,可以看下标准,代码很简单。IE6、7 就用老式的方法,隐藏的 form,target 指向一个隐藏的 iframe,然后调 form 的 submit,服务端返回的结果会刷到 iframe 里。不过这两种方法一般都需要服务端做一定的配合,要是不能操作接口所在的服务器(比如调第三方的接口),那就只能在自己的服务端上做代理了。
首先假设你请求数据的网站为B。要看你是否可以控制(修改里面的代码)。1
缺点 只能get请求 ,需要修改B网站的代码2 cors 说的方案,这个方案缺点 是 ie6 7 兼容不好(倒是不见得要兼容)。需要B网站在响应中加头3 postMessage
缺点也是 ie6 7 兼容不好(倒是不见得要兼容)。需要修改B网站的代码4 iframe window.name 传值得方式很巧妙,兼容性也很好。但是也是需要你能修改B网站代码5 服务端主动请求B网站,兼容性好而且你客户端的代码还是原来的ajax,缺点是感觉不好。。6 类似5 用nginx把B网站的数据url反向代理。我觉得吧,如果你不能修改B网站的代码老老实实5 6 方案如果能修改B网站 方案2的修改应该是最简单的。就算是B网站你可以修改,还有种需求处理起来比较麻烦的,就是有的数据需要登录之后才能取。最直接的方案,B网站提供数据的url 进去先提供用户名密码,走下登录再走取数据,最后返回数据。但是往往最直接的方案都不是好的方案。。。(登录请求=》返回令牌=》带令牌请求受限数据)所以最好用是方案2
然后B网站有oauth 功能,你的页面加个登陆后,用户登陆后客户端保存好token_key,然后取数据。(这个方案类似通过sessionid得到session。因为安全相关的原因,通过通过sessionid得到session 这样的需求并不是所有语言的所有框架都会提供的)当然oauth方案也有坏处,就是B网站本来没有oauth,要加上一个会略麻烦。所以还可以选择方案2 加上withcredentials=true 这个方案。当然登录页面还是需要的这个问题已经是4年前的了,不过跨域请求似乎是个永恒的问题,正好最几天刚刚也遇到了类似的需求,就写得多了一点了。最近需要将原来的一个web网站写成手机版本,我是用的html5 加cordova 打包成手机程序的, 方案2
然后加withcredentials=true 然后在登录请求后重写手机客户端的cookie 方案能很好满足我的需求。 希望对大家有帮助
所有使用JSON的方案都有一个错误,就是无法实现POST。那目前实现POST的方法是1、建立一个iframe,iframe内的JS创建一个form表单,并可以将接收到的参数放入表单中POST提交。2、将iframe页面插入到页面中。3、针对现代浏览器,将数据通过postMessage()方法传入iframe中。针对不支持此方法的浏览器,通过URL HASH的方法将参数传入iframe中。(由于URL有长度限制,所以不能传播大数据)除此方法外,可以使用window.name的方案,但此方案我没有实现过,具体可以百度一下张克军写的事例。
使用json,就是使用 & script & 标签,实现伪ajax.我一般使用jq.给你个jq的例子.$.ajax({
dataType:'jsonp',
timeout : 3000 ,//毫秒
data : 'foo=bar1&foo=bar2',
//jsonpCallback:'jsoncallback',
beforeSend
:function(){
error:function(item){
alert('加载失败');
success: function(item){
alert( item.items[0].media.m);
complete: function(){}});json.php& ?phpheader('Content-type: application/json');$results = array("key" = &
"value",'key1'= & array('a'= & 'ok'));echo $_GET['callback'] . '(' . json_encode($results) . ')';? &
跨域问题,目前地球上最好、最方便(没有之一)的解决方案是,利用Apache转发。原因有2:1.前台后台的代码都不需要改动,也不需要为跨域去专门写代码或改代码。2.Apache非常容易安装:Win上有WAMP,Linux上有LAMP;且Apache的转发设置起来非常简单方便。开发时甚至可以直接把转发配置为客户端到VS或Eclipse,方便调试;上线后把转发切换成客户端到Apache自身或IIS或Tomcat或WebLogic或Nginx等等。
jsonp对内容的长度有限制,最多也就能传几百字节。要大量内容的话,只能创建一个form,动态输入input,然后调用它的submit方法。将submit的结果放到一个iframe中,就可以显示返回值。 p.s 目前看到最好的跨域解决方案是window.name跨域传递,可以无缝传输最大2M的数据。具体方案见:
已有帐号?
无法登录?
社交帐号登录前端遇到的跨域问题及解决方案一 - 易小亨 - 博客园
随笔 - 40, 文章 - 0, 评论 - 42, 引用 - 0
《JavaScript 高级程序设计》一直断断续续的看这本书,有些地方看了三四遍,有些地方一遍也没有看过。这本书真心是非常不错的书,再随着google些资料,还是受益很多的。昨睡不着,翻了下看看跨域,今又认真搜了下,有跟先前不一样的体会了。工作中遇到的跨域,比如说iframe引用某某盛典的页面,你是没有办法设置高度的~~有嵌套iframe的方法获取高度,但是对方这个页面不是你一家用的,你不能有任何修改,它是不会内嵌什么iframe的。真心没办法解决~~ 有些东西,你是甲方的话,别家提供,基本是采用JSONP方式,约定个函数传递数据,或者是直接链别家的JS文件有全局对象。
让我们从书开始吧~
Ajax跨域请求问题
Ajax是无需刷新页面就能够从服务器去的数据的一种方法。负责Ajax运作的核心对象是XMLHttpRequest(XHR)对象。同源策略是对XHR的一个主要约束,它为通信设置了&相同的域、相同的端口、相同的协议&这一限制。试图访问上述限制之外的资源都会引发安全错误,除非采用被认可的跨域解决方案。这个方案叫做CORS(Cross-Origin Resource Sharing ,跨源资源共享。)提一句,对于未被授权系统有权访问某个资源的情况,称之为CSRF(Cross-Site Request Forgery, 跨站点请求伪造)。
CORS背后的基本思想,是用用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或响应是应该成功还是失败。
比如一个简单的使用GET或POST发送的请求,它没有自定义的头部,而主体内容是text/plain。在发送该请求时,需要给它附加一个额外的Origin头部,其中包含请求页面的源信息(协议、域名、端口),以便服务器根据这个头部信息来决定是否给予响应。示例
如果服务器认为这个请求可以接受,就在Access-Control-Allow-Origin头部中回发相同的源信息(如果过是公共资源,可以回发&*&)。
Access-Control-Allow-Origin:
如果没有这个头部,或这个有这个头部但源信息不匹配,浏览器就会驳回请求。正常情况下,浏览器会处理请求。注意,请求和响应中都不包含cookie信息。
IE对CORS的实现
IE8引入了XDR(XDomainRequest)类型。与XHR类似,但能实现安全可靠的跨域通信。所有XDR请求都是异步的,不能用它来创建同步请求。请求返回之后,会触发load事件,响应数据也会保存在responseText属性中。
var xdr=new XDomainRequest();
xhr.onload=function(){
console.log(xhr.responseText);
xhr.onerror=function(){
console.log("Error");
xdr.timeout=1000;
xdr.ontimeout=function(){
console.log("Request took too long");
xdr.open("get","/yixiaoheng/");
xdr.send(null);
其他浏览器对CORS的实现
Firefox3.5+、Safari4+、Chrome、iOS版Safari和Android平台中的WebKit都通过XMLHttpRequest对象实现对CORS的原生支持。在尝试打开不同来源的资源时,无需额外编写代码就可以触发这个行为。要请求位于另一个域中的资源,使用标准的XHR对象并在open()方法中传入绝对URL即可。
var xhr=createXHR();
xhr.onreadystatechange=function(){
if(xhr.readyState==4){
console.log(xhr.responseText);
console.log("Request was fail "+xhr.status);
xhr.open("get","/yixiaoheng/",true);
xhr.send(null)
JSONP是JSON with padding(填充式JSON或参数式JSON)的简写,它是被包含在函数调用中的JSON 像这样callback({&name&:&Fany&})。
JSONP由两部分组成:回调函数和数据。会掉函数是响应到来时应该在页面中调用的函数。回调函数的名字一般是在请求中指定的。而数据就是传入回调函数中的JSON数据。下面是一个典型的JSONP请求。
你可以使用$.getJSON()来处理返回数据。
JSONP在开发人员中极为流行,主要原因是它非常简单易用。与图像Ping相比,它的优点在于能够直接访问响应文本,支持在浏览器和服务器之间的双向通信。
首先,JSONP是从其他域中加载代码执行。如果其他域不安全,很可能会在响应中夹带一些恶意的代码,而此时除了完全放弃JSONP调用之外,没有办法追究。
其次,要确定JSONP请求是否失败并不容易。开发人员不得不使用计时器检测指定时间内是否接收了响应。
服务器代理请求
&这个方案中心思想是在页面发送请求给本域服务器的一个代理脚本,代理脚本来完成对它域的请求,然后把结果返回给客户端。它的优点是可以完全模拟请求方法(无论GET还是POST),并把参数和客户端Cookies传递过去。
这个方案能完成Jsonp不能完成的Post请求,但是实施起来比Jsonp麻烦的多。这里有一个PHP的实现方案可以参考,你可以先看下Yahoo团队的解决方案
因为方案是PHP我仅是了解重点,你需要Proxy!
上面的三个方案主要解决Ajax跨域请求问题。
还有个不一样的跨域方式是图像Ping
可以从任何网页中加载图像,不用担心跨域。这也是在线广告跟踪浏览量的主要方式,如跟踪用户点击页面或动态广告曝光次数。
动态创建图像经常用于图像Ping.图像Ping是与服务器进行简单、单项的跨域通信的一种方式。请求的数据是通过查询字符串形式发送的,而相应可以是任意内容,但通常是像素图或204相应。通过图像Ping,浏览器得不到任何具体的数据,但通过侦听load和error,能知道响应式什么死后接收到的。例子:
var img=new Image();
img.onload=img.onerror=function(){
console.log("Done");
img.src="/test?name=fany";
一是只能发送get请求,二是无法访问服务器的相应文本。图像Ping只能用于浏览器与服务器间的单向通信。
还有Flash跨域的解决方法,有几年不看这个了,所以没有仔细核实。罗列分享下吧
Flash URLLoader
Flash有自己的一套安全策略,服务器可以通过crossdomain.xml文件来声明能被哪些域的SWF文件访问,SWF也可以通过API来确定自身能被哪些域的SWF加载。当跨域访问资源时,例如从域请求域上的数据,我们可以借助Flash来发送HTTP请求。首先,修改域上的crossdomain.xml(一般存放在根目录,如果没有需要手动创建) ,把加入到白名单。其次,通过Flash URLLoader发送HTTP请求,最后,通过Flash API把响应结果传递给JavaScript。Flash URLLoader是一种很普遍的跨域解决方案,不过需要支持iOS的话,这个方案就无能为力了。
&Flash LocalConnection
页面上的双向通信也可以通过Flash来解决,Flash API中有LocalConnection这个类,该类允许两个SWF之间通过进程通信,这时SWF可以播放在独立的Flash Player或者AIR中,也可以嵌在HTML页面或者是PDF中。遵循这个通信原则,我们可以在不同域的HTML页面各自嵌套一个SWF来达到相互传递数据的目的了。SWF通过LocalConnection交换数据是很快的,但是每次的数据量有40kb的大小限制。用这种方式来跨域通信过于复杂,而且需要了2个SWF文件,实用性不强。
&解决不同域之间JS交互又有哪些方式呢?怎么解决服务器间的跨域问题_百度知道
怎么解决服务器间的跨域问题
我有更好的答案
要找高手。技术上只有想不到。。,没有做不到
其他类似问题
为您推荐:
服务器的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁}

我要回帖

更多关于 nginx解决跨域问题 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信