如何配置如何解决跨域的问题题

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
专注软件开发领域知识与创新。
微软北京.Net俱乐部13:
Java平台架构:
Go技术交流群:
Python技术交流群:
WeChat:iamwlb
加联系方式请注明:网易博客。
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(5814)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_085',
blogTitle:'WebApi中跨域解决办法',
blogAbstract:'\n
在做Web开发中,常常会遇到跨域的问题,到目前为止,已经有非常多的跨域解决方案。由于时间有限,本文不会深入。\n\n\n
笔者遇到的问题是Js调用WebAPI中的数据进行跨域的场景。涉及若干跨域方案:\n\n\n
方案1:jsonp+回调\n
方案2:Microsoft.AspNet.WebApi.Cors提供的跨域属性\n
方案3:利用ACAO编写自定义Filter实现 \n
一、关于方案一\n
方案1是同事提出来的,已经经过论证,并且自己研究过,是可行的。本质上是通过script标签动态加载js,还有callback机制。\n\n\n
但是,我个人觉得这个方案有些不足:\n\n\n
实现细节复杂,技术复杂性增大了不少,并且不好理解(服务器端、Web前端两头忙活)\n
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:5,
publishTime:1,
permalink:'blog/static/',
commentCount:2,
mainCommentCount:1,
recommendCount:1,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'专注软件开发领域知识与创新。\r\n微软北京.Net俱乐部13:\r\nJava平台架构:\r\nGo技术交流群:\r\nPHP群:\r\nPython技术交流群:\r\nWeChat:iamwlb\r\n加联系方式请注明:网易博客。',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(7685)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'使用js获取当前域名,配置domain,解决js跨域问题。',
blogAbstract:'&&&&&&& 在js中,因为不同域名会产生跨域问题,网上可以搜到有不少解决js跨域问题的方法,考虑了一下自己的需求,为了简单实现跨域的js,就选取了配置domain的方式来实现js跨域。&&&&& 配置domain方式需要动态指定顶级域名,但为了配置简单,就可以直接用js获取当前域名,指定domain域名。代码如下:&script type=\"text/javascript\"&
var getHost = function(url) {
var host = \"null\";
if (typeof url == \"undefined\"',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:2,
publishTime:2,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}如何解决 Ajax 跨域请求不到的问题?
希望最好用原生js,可以掠去ajax方法体,而且能满足post需求,另外,请不要直接拷网上的“滥”了的文章。。。谢谢增加一個問題:我要用JS獲取一個網頁上面的內容, 一個JSON. 格式只能是: {'id' : xxx}. 我試過JSONP不成=.= iframe的話, JS又訪問不了iframe內容(因為跨域). 又不可以用代理. 因為要用戶身份認證.求教呀
lz,不要多想了,如果要请求的服务器不是你控制的,那基本不可能了。如果你可以控制要请求的服务器,那完全可以定制虾 用jsonp。什么iframe,window。name也都用不着了。。。
尽量让前端简化吧 在我看来最简单最直接的方案不过两种:1. 配置目标服务器的CORS 2. 如果觉得CORS有学习成本,最简单的办法就是加一个“转发”的路由,注意这里不是“跳转”,因为跳转同样会遇到跨域问题。
除非你有数据的控制权,能通过 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 的通用漏洞,那卖给黑产小哥都够你大赚一笔的了。
既然这样,为何舍近取远呢?这才叫做最原生的处理方法。方法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 是写 script 标签,只能满足 get 请求。跨域 post 的话,IE8 及以上和其他主流浏览器可以用 window.postMessage 来实现,也就是传说中的 HTML5 方法了,可以看下标准,代码很简单。IE6、7 就用老式的方法,隐藏的 form,target 指向一个隐藏的 iframe,然后调 form 的 submit,服务端返回的结果会刷到 iframe 里。不过这两种方法一般都需要服务端做一定的配合,要是不能操作接口所在的服务器(比如调第三方的接口),那就只能在自己的服务端上做代理了。
所有使用JSON的方案都有一个错误,就是无法实现POST。那目前实现POST的方法是1、建立一个iframe,iframe内的JS创建一个form表单,并可以将接收到的参数放入表单中POST提交。2、将iframe页面插入到页面中。3、针对现代浏览器,将数据通过postMessage()方法传入iframe中。针对不支持此方法的浏览器,通过URL HASH的方法将参数传入iframe中。(由于URL有长度限制,所以不能传播大数据)除此方法外,可以使用window.name的方案,但此方案我没有实现过,具体可以百度一下张克军写的事例。
首先假设你请求数据的网站为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 方案能很好满足我的需求。 希望对大家有帮助
jsonp对内容的长度有限制,最多也就能传几百字节。要大量内容的话,只能创建一个form,动态输入input,然后调用它的submit方法。将submit的结果放到一个iframe中,就可以显示返回值。 p.s 目前看到最好的跨域解决方案是window.name跨域传递,可以无缝传输最大2M的数据。具体方案见:
跨域问题,目前地球上最好、最方便(没有之一)的解决方案是,利用Apache转发。原因有2:1.前台后台的代码都不需要改动,也不需要为跨域去专门写代码或改代码。2.Apache非常容易安装:Win上有WAMP,Linux上有LAMP;且Apache的转发设置起来非常简单方便。开发时甚至可以直接把转发配置为客户端到VS或Eclipse,方便调试;上线后把转发切换成客户端到Apache自身或IIS或Tomcat或WebLogic或Nginx等等。
现在使用浏览跨域除了JSONP, 还有一种就是让服务器端支持跨域,前面的有人回答已经说了,设置响应头
Access-Control-Allow-Origin: * 。 除此之外需要特别注意的是对于POST、PUT和Delete的跨域请求之前, 浏览器会发起一个OPTIONS Method 的预请求来获得一些资源的信息,因此服务器必须支持OPTIONS才能完成 POST、PUT和Delete的跨域请求, 有些服务器不支持或者默认会禁止这些比较不安全的请求,所以还需要您设置Access-Control-Allow-Methods:GET, POST, PUT, DELETE,HEAD, OPTIONS。
已有帐号?
无法登录?
社交帐号登录

我要回帖

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

 

随机推荐