什么是JS跨域访问

JavaScript09

什么是JS跨域访问,第1张

ajax或者iframe指向的地址中,二级域名、端口、协议必须与主页面完全相同,否则就算跨域

比如

a.baidu.com访问b.baidu.com 是跨域;

a.baidu.com:8080访问a.baidu.com:80 是跨域;

http://a.baidu.com访问https://a.baidu.com 是跨域

ajax跨域,两种办法:后端写个代理接口,让后端去抓数据;或者与对方合作,用jsonp等方式传送数据

iframe跨域问题有点多,必须要得到iframe内部页面的配合才可能通信,方法也比较多:

1,假写hash值通信,父子页面各自建立轮询去检测iframe中url的hash值,通过值来通信

2,利用HTML5的postMessage,不过注意这个也是异步的

3,利用IE6\7中对navigator的bug,我前同事发现的,在ie6/7中,父子页面使用的window.navigator是同一个东西,父页面改了,子页面也会跟着变;

4,iframe中嵌套一层与顶层页面同域的页面,比如a中套b,b中套c,其中a、c同域,b做出改变后通过url给c传值,c中操作top对象也就是a,由于同域,所以不会有问题

问题一:如何解决跨域问题 特别注意两点:

第一,如果是协议和端口造成的跨域问题“前台”是无能为力的,

第二:在跨域问题上,域仅仅是通过“URL的首部”来识别而不会去尝试判断相同的ip地址对应着两个域或两个域是否在同一个ip上。

“URL的首部”指window.location.protocol +window.location.host,也可以理解为“Domains, protocols and ports must match”。

2. 前端解决跨域问题

1>document.domain + iframe (只有在主域相同的时候才能使用该方法)

1) 在a/a中:

复制代码

document.domain = 'a'

var ifr = document.createElement('iframe')

ifr.src = 'script.a/b'

ifr.display = none

document.body.appendChild(ifr)

ifr.onload = function(){

var doc = ifr.contentDocument || ifr.contentWindow.document

在这里操作doc,也就是b

ifr.onload = null

}

复制代码

2) 在script.a/b中:

document.domain = 'a'

2>动态创建script

这个没什么好说的,因为script标签不受同源策略的限制。

复制代码

function loadScript(url, func) {

var head = document.head || document.getElementByTagName('head')[0]

var script = document.createElement('script')

script.src = url

script.onload = script.onreadystatechange = function(){

if(!this.readyState || this.readyState=='loaded' || this.readyState=='plete'){

func()

script.onload = script.onreadystatechange = null

}

}

head.insertBefore(script......>>

问题二:如何解决跨域问题 由 于此前很少写前端的代码(哈哈,不合格的程序员啊),最近项目中用到json作为系统间交互的手段,自然就伴随着众多ajax请求,随之而来的就是要解决 ajax的跨域问题。本篇将讲述一个小白从遇到跨域不知道是跨域问题,到知道是跨域问题不知道如何解决,再到解决跨域问题,最后找到两种方法解决ajax 跨域问题的全过程。

不知是跨域问题

起 因是这样的,为了复用,减少重复开发,单独开发了一个用户权限管理系统,共其他系统获取认证与授权信息,暂且称之为A系统;调用A系统以B为例。在B系统 中用ajax调用A系统系统的接口(数据格式为json),当时特别困惑,在A系统中访问相应的url可正常回返json数据,但是在B系统中使用 ajax请求同样的url则一点儿反应都没有,好像什么都没有发生一样。这样反反复复改来改去好久都没能解决,于是求救同事,提醒可能是ajax跨域问 题,于是就将这个问题当做跨域问题来解决了。

知跨域而不知如何解决

知道问题的确切原因,剩下的就是找到解决问题的方法了。google了好久,再次在同事的指点下知道jQuery的ajax有jsonp这样的属性可以用来解决跨域的问题。

找到一种解决方式

现在也知道了怎样来解决跨域问题,余下的就是实现的细节了。实现的过程中错误还是避免不了的。由于不了解json和jsonp两种格式的区别,也犯了错误,google了好久才解决。

首先来看看在页面中如何使用jQuery的ajax解决跨域问题的简单版:

复制代码

$(document).ready(function(){

var url='localhost:8080/...upById

+?id=1&callback=?'

$.ajax({

url:url,

dataType:'jsonp',

processData: false,

type:'get',

success:function(data){

alert(data.name)

},

error:function(XMLHttpRequest, textStatus, errorThrown) {

alert(XMLHttpRequest.status)

alert(XMLHttpRequest.readyState)

alert(textStatus)

}})

})

复制代码

这样写是完全没有问题的,起先error的处理函数中仅仅是alert(“error”),为了进一步弄清楚是什么原因造成了错误,故将处理函数变 为上面的实现方式。最后一行alert使用为;parsererror。百思不得其解,继续google,最终还是在万能的stackoverflow找 到了答案,链接在这里。原因是jsonp的格式与json格式有着细微的差别,所以在server端的代码上稍稍有所不同。

比较一下json与jsonp格式的区别:

json格式:

{

message&q......>>

问题三:跨域是指什么,因为什么引起的?有哪些解决方案?web前端知识 跨域是指 不同域名之间相互访问 例如 我的电脑上有2个服务器 192.168.0.11 192.168.0.12 如果第一个服务器上的页面要访问第二个服务器 就叫做跨域 或者baidu 要访问xxx 也是不同域名 也是跨域

HTML5 里有个window.postMessage 方法,支持跨域访问,详情可以参考

webhek/window-postmessage-api

如果你的程序在服务器上,也可以进行相应的操作来完成跨域访问

纯手打 有问题欢迎咨询

问题四:如何解决跨域问题 打开IE浏览器,在工具菜单下选择Internet选项,打开Internet选项卡

切换到安全选项卡下,点击可信站点,然后单击站点按钮

可信站点窗口输入网址到可信站点的区域,点击添加按钮,网址则会添加到网站列表下,最后关闭可信站点窗口

还是在安全选项卡下的可信站点,点击自定义级别

打开受信任的站点区域窗口,找到跨域浏览窗口和框架选择启用

在当前窗口中继续往下翻,通过域访问数据源也选择启用,点击确定关闭受信任的站点区域窗口

在Internet窗口也点击确定按钮,同时关闭浏览器

在请求的js脚本中添加是否允许跨域访问的权限,jQuery.support.cors默认值为true,则代表允许;反之,不允许。设置完成,重新打开浏览器验证即可

问题五:$跨域请求怎么解决 post请求进行跨域

angularjs内置封装了类ajax的网络服务$,所以实现了依赖外部插件来完成完整的前后端分离方案

$scope.main = {

getData: function () {

$({

method: 'POST',

url: 'localhost:8000',

headers: {

'Content-Type' : 'application/x--form-urlencoded'

},

data: {

myUrl: 'c.m.163/...0'

}

}).then(function success(result) {

数据请求成功

console.log(result.data)

},function error(err) {

数据请求失败

console.log(err)

})

}

}

注意:表面上是向$中传入了一个回调函数提供相应时调用,实际是返回了一个promise对象,angular1.2以上的版本对$进行了优化

优化后:

$scope.main = {

getData: function () {

var myUrl = 'c.m.163/...0'

var url = 'localhost:8000'

var promise = $({

method: 'POST',

url: url,

headers: {

'Content-Type' : 'text/plain'

......>>

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

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

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

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

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

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

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

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

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

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

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

2、

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

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

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

3、上面两步分别做到了两个窗口之间的无刷新数据通知,

那么下面的来说如何感知数据变化。标准中没有相关规定,所以当前的任意浏览器遇到location.hash变化都不会触发任何javaScript事

......>>

问题七:如何解决javascript的跨域问题 一般是用iframe设置

document.domain = 'a'var ifr = document.createElement('iframe')ifr.src = 'a/index'ifr.style.display = 'none'document.body.appendChild(ifr)ifr.onload = function(){ var doc = ifr.contentDocument || ifr.contentWindow.documentconsole.log(doc.documentElement.innetHTML)}然后HTML5新特性有 ,postMessage

function Init () { if (window.addEventListener) { all browsers except IE before version 9 window.addEventListener (message, OnMessage, false)} else { if (window.attachEvent) { IE before version 9 window.attachEvent(onmessage, OnMessage)} } } function GetState () { var frame = document.getElementById (myFrame)var message = getstate参数if (frame.contentWindow.postMessage) { 传递的参数,后面是传递的你的跨域域名frame.contentWindow.postMessage (message, *)} } function OnMessage (event) { console.log(event.data)} document.body.onload=function(){Init()GetState()}

问题八:如何解决跨域问题 VPN或者域名

问题九:如何解决请求跨域的问题 jsonp 是写 script 标签,只能满足 get 请求。跨域 post 的话,IE8 及以上和其他主流浏览器可以用 window.postMessage 来实现,也就是传说中的 HTML5 方法了,可以看下标准,代码很简单。IE6、7 就用老式的方法

问题十:怎么解决服务器间的跨域问题 服务端的解决方案的基本原理就是,由客户端将请求发给本域服务器,再由本域服务器的代理来请求数据并将响应返回给客户端。

最常用的服务器解决方案就是利用web服务器本身提供的proxy功能,如apache和ligd的mod_proxy模块。在百度内 部,tran *** it的分流功能也可以解决部分跨域问题。但这些方法都有一定的局限性,鉴于安全性等问题的考虑,space这边最后开发了一个专门用于处

理跨域请求代理服务的spproxy模块,用于彻底解决js跨域问题。

下面我们将以空间的开放平台为例,简单介绍下如何通过apache的mod_proxy、tran *** it的分流以及space的spproxy模块来解

决该跨域问题,并简单介绍下spproxy的一些特性、缺点及下一步的改进计划。

空间在展现每个UWA开放模块之前都必须请求该模块的xml源代码以进行解析,每个模块的源代码文件都是存放在act域下的/ow/uwa目录下,那么在

用户空间首页(hi域)中请求该xml文件时就会存在js跨域问题。要解决该问题,只能让js向hi域的web服务器请求xml文件,而hi域web服务

器则通过一定的代理机制(如mod_proxy、tran *** it分流、spproxy)向act域的web服务器请求文件

1、CORS的原理:CORS定义一种跨域访问的机制,可以让AJAX实现跨域访问。CORS 允许一个域上的网络应用向另一个域提交跨域 AJAX 请求。实现此功能非常简单,只需由服务器发送一个响应标头即可。

2、tomcat如何配置cors的跨域请求: 

在tomcat中,有一个和cors相关的拦截器:CORS Filter

该过滤器可以通过添加必需的访问控制请求头Access-Control-*对象来进行跨域。同时还可以对一些请求进行拦截。如果请求是无效的,或者是不被允许的,该请求被拒绝或者禁止。 

其在web.xml文件中的基本配置如下:

<filter>

        <filter-name>CorsFilter</filter-name>

        <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>

        <init-param>

            <param-name>cors.allowed.origins</param-name>

            <param-value>

                http://localhost:8080,

                https://localhost:8443

            </param-value>

        </init-param>

        <init-param>

            <param-name>cors.allowed.methods</param-name>

            <param-value>

                GET,POST,HEAD,OPTIONS,PUT

            </param-value>

        </init-param>

        <init-param>

            <param-name>cors.allowed.headers</param-name>

            <param-value>

                Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,Access-Control-Allow-Origin

            </param-value>

        </init-param>

        <init-param>

            <param-name>cors.exposed.headers</param-name>

            <param-value>

                Access-Control-Allow-Origin,Access-Control-Allow-Credentials

            </param-value>

        </init-param>

        <init-param>

            <param-name>cors.support.credentials</param-name>

            <param-value>true</param-value>

        </init-param>

        <init-param>

            <param-name>cors.preflight.maxage</param-name>

            <param-value>10</param-value>

        </init-param>

    </filter>

    <filter-mapping>

        <filter-name>CorsFilter</filter-name>

        <url-pattern>/wxrefund/*</url-pattern>

    </filter-mapping>

3、cors.allowed.origins:允许访问资源的源列表。*表示任何来源都可以访问该资源。否则,只有配置的白名单的来源可以访问该资源,其中白名单用逗号隔开,如http://localhost:8080,https://localhost:8443。

4、cors.allowed.methods:允许访问的http请求方法,如GET,POST,HEAD,OPTIONS,PUT等,方法名用逗号隔开。

5、cors.allowed.headers:在实际请求时可使用的请求头列表,用逗号隔开。如Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,Access-Control-Allow-Origin。这些头也将返回作为访问控制的一部分。