服务器显示跨域请求,出现跨域问题的原因及其解决方法

出现跨域问题的原因:

同源策略

同源策略

三同

协议相同

域名相同

端口相同

同源策略目的

保证用户信息安全,防止恶意网站窃取数据。同源策略是必须的,否则cookie可以共享。

同源策略的限制范围

cookie、localstorage、indexdb无法读取。

DOM无法获取。

ajax请求不能发送。

规避策略

cookie:设置document.domain共享cookie。

DOM获取:(父子页面通信)H5引入了一个API,这个API为windows对象新增了一个window.postMessage方法,允许跨窗口通信,无论这两个窗口是否同源。

window.opener.postMessage(content,origin)

content是消息的具体内容,origin是协议 + 域名 + 端口

AJAX:

JSONP:JSONP是服务器无客户端跨源通信的常用方法。基本思想是网页通过添加一个元素,向服务器请求json数据,这种做法不受同源政策的限制,服务器收到请求后,将数据放在一个指定名字的回调函数里面传回来。(只能发GET请求)

WebSocket:WebSocket是一种通信协议。使用ws://(非加密)和wss://(加密)作为协议前缀。该协议不实行同源政策,只要服务器支持,就可以通过它进行跨源通信。

CORS:详解如下。

CORS

跨域资源共享(corss-origin resource sharing):CORS需要浏览器和服务器同时支持。目前所有浏览器都支持该功能,IE浏览器不能低于IE10。整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。

两种请求

浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)。

413a2f11828d

CORS请求.png

1. 简单请求

对于简单请求,浏览器直接发出CORS请求。具体来说,就是在Header中增加一个Origin字段。如果浏览器发现跨源AJAX请求是简单请求,就自动在头信息之中,添加一个Origin字段。

GET /cors HTTP/1.1

Origin: http://easywork.xin //浏览器添加字段,说明本次请求来自哪个源(协议+域名+端口)。

Host: 119.23.214.114

Accept-Language: en-US

Connection: keep-alive

User-Agent: Mozilla/5.0...

服务器根据Origin的值决定是否同意这次请求。

如果Origin指定的源在不在后端的许可白名单范围内,服务器会返回一个正常的http回应。浏览器接收后发现,这个response的Header没有包含Access-Control-Allow-Origin字段,就知道出错了,从而抛出一个错误,被XMLHttpRequest的onerror回调函数捕获。这种错误无法通过状态码识别,因此HTTP response的状态码有可能是200。

如果Origin指定的域名在许可的范围内,则服务器返回的相应中,会多出几个头信息字段

Access-Control-Allow-Origin: http://easywork.xin

Access-Control-Allow-Credentials: true

Access-Control-Expose-Headers: FooBar

Content-Type: text/html; charset=utf-8

Access-Control-Allow-Origin:(必须字段)它的值要么是请求时Origin的值,要么是*,表示接受任意域名的请求。

Access-Control-Allow-Credentials:(可选字段)它是一个bool值,表示是否允许发送Cookie。默认情况下,Cookie不包括在CORS请求之中。设为true,表示服务器明确许可,Cookie可以包含在请求中,一起发给服务器。CORS请求默认不发送Cookie和HTTP认证信息。如果要把Cookie发送到服务器,一方面要服务器同意,指定Access-Control-Allow-Credentials:true;另一方面,前端必须在AJAX请求中打开withCredentials属性:

var xhr = new XMLHttpRequest();

xhr.withCredentials = true;

注意:如果要发送Cookie,Access-Control-Allow-Origin不能设置为* ,必须指定明确的,与请求网页一致的域名。同时,Cookie依然遵守同源政策,只有用服务器域名设置的Cookie才会上传,其他域名的Cookie并不会上传。

Access-Control-Expose-Headers:(可选字段)CORS请求时,XMLHttpRequest对象的getResponseHeader(args)方法只能拿到6个基本字段:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。如果想拿到其他字段,就必须在Access-Control-Expose-Headers`里面指定。

2. 非简单请求

非简单请求是那种对服务器有特殊要求的请求,比如请求方法是PUT或DELETE,或者Content-Type字段的类型是application/json。

非简单请求的CORS请求,会在正式通信之前,增加一次HTTP查询请求,称为"预检"请求(preflight)。浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些HTTP动词和头信息字段。只有得到肯定答复,浏览器才会发出正式的XMLHttpRequest请求,否则就报错。

与JSONP比较

CORS与JSONP的使用目的相同,但是比JSONP更强大。JSONP只支持GET请求,CORS支持所有类型的HTTP请求。JSONP的优势在于支持老式的浏览器,以及可以向比支持CORS的网站请求数据。

Reference

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PC端请求接口出现跨域问题原因是由于浏览器的同源策略所致。同源策略规定了浏览器只允许发送同源的请求,即协议、域名、端口号必须完全相同,否则会被浏览器拦截。跨域问题一般由以下几个情况引起: 1. 域名不同:如果前端请求的接口域名和当前页面的域名不同,会触发跨域问题。 2. 端口号不同:如果前端请求的接口的端口号和当前页面的端口号不同,同样会触发跨域问题。 3. 协议不同:如果前端请求的接口的协议和当前页面的协议不同,也会导致跨域问题解决跨域问题有多种方法,常见的几种解决方案如下: 1. JSONP(JSON with Padding):JSONP利用了script标签的src属性不受同源策略的限制这一特性,通过在前端页面中动态创建script标签,并使用回调函数来接收后端返回的数据,从而绕过跨域问题。 2. CORS(Cross-Origin Resource Sharing):使用CORS可以在服务端设置响应头,允许指定的域名来跨域访问接口。在服务端设置Access-Control-Allow-Origin字段为允许访问的域名,前端请求时在请求头中带上Origin字段即可。 3. 代理服务器:可以在服务器端创建一个代理服务器,接收前端的请求并代为发送到目标接口,并将响应返回给前端。这种方式可以绕过浏览器的同源策略限制。 通过以上解决方案,我们可以有效解决PC端请求接口出现跨域问题,确保接口正常访问和数据传输。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值