解决方案 »

  1.   

    加载js没有同源问题ajax请求需要被请求的页面允许跨域请求才行,iframe,window.open加载的页面要相互操作有同源问题,不同源不能相互操作
      

  2.   

    说白点就是,你加载js你肯定知道js是要干嘛的所以你才会加载ajax请求资源,有些人家不允许你调用的,肯定不希望你ajax或者iframe引入了iframe也同样,你引入别人的页面,还想修改成自己的显示方法,谁能乐意
      

  3.   

    1可以用jsonp来替代ajax,虽然被请求的页面可以设置access-control-allow-origin为*允许跨域,但是xhr对象在IE8-下用的对象不一样,兼容性不是很好
    iframe/window.open这种如果你没有权限修改页面内容,没办法实现互相操作。如果你能控制,可以通过插入iframe做代理来实现跨域,参考:javascript通过iframe加载同源代理页面实现顶级域跨域操作
      

  4.   

    无解。。不能控制的话要不你就需要做代理页面,代理页面服务器端xhr捉取跨域的页面内容输出(自己处理里面的css文件,图片文件地址,直接引用别人网站的),然后iframe加载你的代理页面就可以,不过这种方法操作起来不是一般的麻烦
      

  5.   

    什么假如没有同源策略。知不知道:
    javascript(正确点,寄托在浏览器中的javascript)提供的方法或属性,适用于在不同页面的操作,有那些。       是方法。
    <script>、<img>、<iframe>、<link>  是标签,
      

  6.   

    如果没有同源策略,那么你的第二个例子可以这样:在http://www.change.com/index.html放上钓鱼的内容,诱导用户在其页面上点击打开http://www.icbc.com/index.html网银页面,这里可以用window.open来打开,同时获得新窗口的句柄。用户看地址栏是“爱存不存”的,乖乖的填上网银的关键信息,然而,孰不知,这个页面的window句柄已被钓鱼页面获取。有窗口句柄可以干什么?这个所谓的句柄就是页面的window对象啊,有了window对象,等于整个页面都是你的了,拦截表单,捕获数据,将账号密码发送到钓鱼网站的后端从此上网都只能直接输入域名来访问了,第三方链接神马的有人敢点么?你只是open了我的页面而已,结果你都可以随意篡改我的前端内容了。这个逻辑同样适用于被打开页面回过头来修改来源页面的内容,使用window.opener即可获取来源页面的窗口句柄,而且target="_blank"的超链接打开的页面也可以获取window.opener,想想这多么恐怖,一个外链就能引来XSS。如果两个tab是相互独立的,那自然还是安全的,但是web的特性就是超链接,用户的tab不可能都是自己输入网址打开的,肯定存在某个tab是其他tab的超链接打开的情况,没有同源策略,世界就混乱了。这段话明显错误,也不知道你从什么网上看到的谬论,如果是这样,那么,那些CDN js托管是怎么办到的?存在同源策略的地方有:跨frame脚本,跨window脚本,cookie访问,XMLHttpRequest请求。其实XHR第二版已经支持跨域异步请求了,只要后端配合就行。浏览器为什么不支持ajax跨域呢,脑子抽了一下,突然不理解了,创建一个form然后js脚本submit不照样可以跨域吗?为什么ajax跨域要被限制呢?
      

  7.   


    存在同源策略的地方有:跨frame脚本,跨window脚本,cookie访问,XMLHttpRequest请求。其实XHR第二版已经支持跨域异步请求了,只要后端配合就行。浏览器为什么不支持ajax跨域呢,脑子抽了一下,突然不理解了,创建一个form然后js脚本submit不照样可以跨域吗?为什么ajax跨域要被限制呢?
    你第一段话解决了我的第二个问题,至于你问:比如说,浏览器的两个tab页中分别打开了http://www.baidu.com/index.html和http: //www.google.com/index.html,其中,JavaScript1和JavaScript3是属于百度的脚本,而 JavaScript2是属于谷歌的脚本,当浏览器的tab1要运行一个脚本时,便会进行同源检查,只有和www.baidu.com同源的脚本才能被执 行,所谓同源,就是指域名、协议、端口相同。所以,tab1只能执行JavaScript1和JavaScript3脚本,而JavaScript2不能 执行,从而防止其他网页对本网页的非法篡改。来源于哪里?百度随便一搜便是,地址:http://hikin.iteye.com/blog/857573还有你最后一个问题:浏览器为什么不支持ajax跨域呢,脑子抽了一下,突然不理解了,创建一个form然后js脚本submit不照样可以跨域吗?为什么ajax跨域要被限制呢?这是你的问题还是问我?我不会的说
      

  8.   

    其实我就是不明白为什么要设定同源策略这个规则,我要知其然也要知其所以然啊,所以弄不明白原因很别扭,但是你回答我看到了,可以通过window.open()方法来获得打开的网页的句柄,并且操作它,通过这种方式就可以获取别的“源”的信息了,谢谢。
    我还知道利用iframe加载可以,不知道还有其他方法吗?
      

  9.   

    ajax同源策略的原因想起来啦!我来构造一个如果没有同源策略,ajax请求会有危险的场景:我们知道,现在很多web应用的身份验证都是通过cookie来维持的,http是无状态的,于是后端催生了session的概念,session必然有id,用来标识当前用户的本次会话之用,session id一般都会放在cookie中,具体session id的生成和防冒用等技术,这里不说,且看cookie。cookie的特性是,每次http请求都会带到服务器上,这样,服务器就可以从中取出sessionID,会话得以保持。再说说ajax,ajax本身其实就是一次Http请求,自然,ajax也会带上cookie,否则程序员就没办法写出类似ajaxGetUserInfo这种功能。这里问题就来了,如果a.com页面上的js脚本向b.com域发起一个跨域ajax请求,那么,你说浏览器会带上哪个域的cookie呢?自然是b.com域下的!问题来了,既然带的是b.com的域下的cookie,那么认证什么的,自然是看b.com的cookie有什么了。如果恰巧用户此时正在浏览b.com而且登陆了,那恭喜a.com,可以顺顺利利得到b.com返回的内容了,只要进一步挖掘b.com的接口,a.com可以想干啥就干啥啦!假设你此时正登陆了某宝,同时登陆了某带色的网站b,b网站只要一条跨域ajax,就可以把你账户里的money转走。ajax没有同源策略太恐怖了!!!你会说,那某宝傻啊,不会判断一下发来的ajax的referer啊,如果referer不是自己站点的,就不开方便之门不就行了。可是,但是,这是ajax第二版规范里的东东,服务端可以设置接受哪些域发起的ajax。况且光凭referer去判断存在很多弊端,比如超链接打开的页面也带referer那怎么办,干脆一个同源策略,阻止的干干净净。由于web的复杂性越来越高,很多时候需要跨域ajax的场景,与其程序员费脑子又是后端代理又是各种歪门邪道的,不如将跨域ajax纳入规范吧,但是安全这一关一定要把紧啊,事关钱财性命!综上,这就是ajax需要同源策略的原因。
      

  10.   


    这是你说的:“存在同源策略的地方有:跨frame脚本,跨window脚本,cookie访问,XMLHttpRequest请求。”中的cookie访问。谢谢你,讲解的很详细。我知道为什么存在同源策略了。结贴了~
      

  11.   


    ajax需要同源策略还可以有一个例子,假设我知道csdn发帖的api,那么我可以写一个ajax并调用此api并循环一百亿次,那么csdn就挂了。