什么是浏览器跨域访问操作,JS如何实现?

什么是浏览器跨域访问操作,JS如何实现?

@in桂林理工大学

跨域访问是指你在一个域环境下,访问另一个域的内容。
跨域访问前提是彼此相互信任,否则是无法访问的。

以下参考于脚本之家:https://www.jb51.net/article/113156.htm

1、什么是跨域问题

在页面中使用js访问其他网站的数据时,就会出现跨域问题,比如在网站中使用ajax请求其他网站的天气、快递或者其他数据接口时,以及hybrid app中请求数据,浏览器会提 示一下错误:

XMLHttpRequest cannot load http://你请求的域名. No ‘Access-Control-Allow-Origin’ header is present on the requested resource. Origin ‘http://当前页的域名’ is therefore not allowed access.

2、为什么会出现跨域问题

因为浏览器收到同源策略的限制,当前域名的js只能读取同域下的窗口属性。

同源策略: 不同的域名, 不同端口, 不同的协议不允许共享资源的, 保障浏览器安全。

同源策略时针对浏览器设置的门槛。如果绕过浏览就能实现跨域,所以说早期的跨域都是打着安全路数的擦边球,都可以认为是 hack 处理。

3、现在总结一下解决跨域的几种方法

jsonp 跨域方法

我们提供一个 script 标签. 请求页面中的数据, 同时传入一个回调函数的名字. 服务器端得到名字后, 拼接函数执行格式的字符串. 发送回浏览器. script 在下载代码以后并执行, 执行的就是这个函数调用形式的字符串, 因此就将本地函数调用了.同时拿到了从服务器端得到的数据。

window.name

window对象的name属性是一个很特别的属性,当该window的location变化,然后重新加载,它的name属性可以依然保持不变。那么我们可以在页面A中用iframe加载其他域的页面B,而页面B中用JavaScript把需要传递的数据赋值给 window.name,iframe加载完成之后,页面A修改iframe的地址,将其变成同域的一个地址,然后就可以读出window.name的值了。这个方式非常适合单向的数据请求,而且协议简单、安全。不会像JSONP那样不做限制地执行外部脚本。

document.domain

通过修改document的domain属性,我们可以在域和子域或者不同的子域之间通信。同域策略认为域和子域隶属于不同的域,比如 www.a.com和sub.a.com是不同的域,这时,我们无法在www.a.com下的页面中调用sub.a.com中定义的JavaScript 方法。但是当我们把它们document的domain属性都修改为a.com,浏览器就会认为它们处于同一个域下,那么我们就可以互相调用对方的 method来通信了。

window.postMessage
window.postMessage是HTML5定义的一个很新的方法,这个方法可以很方便地跨window通信。由于它是一个很新的方法,所以在很旧和比较旧的浏览器中都无法使用。

借助于服务器代码来跨域(正向代理、反向代理)

正向代理: 我借助与我的服务器, 像数据服务器发送数据, 我的服务器只需要向数据服务器发送get请求即可

反向代理: 与正向代理类似, 但是不借助于脚本, 而是直接使用 服务器映射 url.

例如: 我们的 url 是 http://studyit.com

数据服务器的 url 是 http://api.botue.com/login

在 apache 配置一个 url 的代理映射

理论上使用 url: http://studyit.com/api 是在网站根目录下找 api 文件夹

但是现在 apache 提供一个映射的功能, 将 /api 映射到 http://api.botue.com

有了这个映射, 那么 访问 http://api.botue.com/login 就可以利用 /api/login来访问了.

在Java中,跨域(Cross-Origin Resource Sharing, CORS)是指浏览器的同源策略限制了网页从不同源加载资源,包括JavaScript、XMLHttpRequest等。由于安全原因,浏览器不允许一个来源的页面(通常指HTTP或HTTPS协议)直接访问另一个来源的服务器资源。 当用户试图从一个域下的页面向另一个域发送HTTP请求(比如Ajax调用),浏览器会阻止这个请求,除非服务器明确地允许这种跨域行为。这通常是出于防止恶意网站对用户隐私数据的窃取。 要解决Java中的跨域问题,有以下几种常见方法: 1. **JSON-P (JSON with Padding)**: 使用`<script>`标签而不是XMLHttpRequest,服务器返回的是JSONP格式的数据,通常包含一个回调函数名作为参数。 2. **CORS服务器端设置**: - 对于RESTful API服务,可以在服务器响应头(`Access-Control-Allow-Origin`)中添加一个或多个允许的源,如 `Access-Control-Allow-Origin: *` 允许所有源,或者具体指定某个源。 - 设置 `Access-Control-Allow-Methods` 和 `Access-Control-Allow-Headers` 来允许特定的请求方法和头部信息。 - 对于跨域资源共享(CORS预检请求,Preflighted Request),服务器可能需要处理`OPTIONS`请求来确认是否允许跨域操作。 3. **使用代理服务器**: 开发者可以在本地或服务器端设置一个代理服务器,所有的跨域请求都通过这个代理转发,这样就可以绕过浏览器的同源策略。 4. **修改浏览器配置**: 这种方法不常用,因为通常不被推荐。有些老旧浏览器可能会允许临时关闭同源策略,但这种方式不稳定且不安全。 5. **使用Nginx或IIS等反向代理**:在生产环境中,也可以通过配置网络层的反向代理服务器,如Nginx,来代理跨域请求。 记住,以上方法都是为了遵循浏览器的安全策略,确保用户数据的安全。在设计API时,应尽可能在服务端处理跨域问题,而不是在客户端。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值