html 允许跨域_HTTP总结(三):跨域、预请求

用node来实现一个简单的HTTP服务

e6cf20bf6f7b6caf72b8ae3fd7eaea4f.png

在终端启动服务

7eece7ce5c1857c7bcaed510680e3632.png

浏览器端

关于HTTP的header的一些功能

什么是HTTP的客户端:最简单最常用的HTTP客户端就是浏览器,浏览器不仅发送HTTP请求和返回内容,还帮我们处理了返回的内容。

5d3a2fd29c3838e8792da93f59610bbb.png

这个就是HTTP的首行信息,并不属于headers里面的内容,

再看response

d9e37ecf9dd7fd6a9d8adba8621f78e9.png

response其实是一堆html代码。返回的这些html如何变成我们看到的页面呢?浏览器又做了一些工作。

用curl来请求

3d31f26b7b345fd5352ca6a67eb7261a.png

返回的内容很少,浏览器会识别这些标签。

可以用curl -v 来更详细的展示请求和返回的header和general相关的一些东西。

95cdc410ae419134c0ef6b32d3876ffe.png

用curl不会像浏览器一样去渲染。

浏览器同域的限制

两个端口不一样的server

496edfaf2e45a94201cb6e8c978a34c0.png

7b9b2f6172e725597857614fae7b6f81.png

aa9dadebfbcf9978987bda30bd39cfb0.png

启动这两个服务,这时候我们是用8888端口去请求8889,浏览器中观察下

ec101ce2f4f0397e3cbe6f57cbf32c36.png

确实有了html的结构

但是

3c517c991affe4328deb38c13a91bb32.png

因为8889端口没有设置允许跨域的header,所以出现了跨域问题。

我们可以在server2.js里面设置

21f2fdd1eac9408e9231eca74fd366b8.png

重启一下服务,

再到浏览器中,就没有报错了,并且成功请求了8889

a8cef6110a2645b77e5184cfdd2fc901.png

不管我们有没有返回header,浏览器都会向我们这个服务发送这个请求。浏览器在发送这个请求的时候,并不知道这个服务是不是跨域。

请求已经发送了,内容也已经返回了,只是浏览器在解析了这个返回的内容之后,它发现这个是不允许的,就帮我们拦截了,这其实是浏览器提供的一个功能。

如果在curl里面,随便怎么发送,都是没有跨域的概念的。

跨域的方法:jsonp

a9094489de8a061b75b57ff20cd49578.png

afac566bc39771d0fe6ee7205a031de7.png

2c0c4f176a5b1133f7cfd21ac35d0020.png

这样子请求依旧是成功的,浏览器允许向link、img、script标签,在标签上src加载一些内容的时候,是允许跨域的。并不在乎服务器是否设置了跨域的头。

jsonp实现的原理就是在script标签里面加载了一个链接,这个链接访问了服务器的某一个请求,并且返回了内容。因为服务器返回的内容是可控的,所以我们可以在服务器的返回内容里面写script标签里面的代码,是一段可执行的js代码。然后调用jsonp在发起请求之前,给我们设置的一些内容。

跨域的头的设置

如果把Access-Control-Allow-Origin设置为*,是不安全的,因为任何人都可以访问,可以把*设置为某一个特定的域名,比如设置为http://xxx.com当然不会有这个域名来请求这个服务。我们可以把头设置为127.0.0.1,依然可以实现跨域。这个头只能设置一个值,不能设置为多个值。

6d1b0984b3623354e8f4abf531165ceb.png

72e56253d82a159d6f133baeeff8781f.png

fef80350f7ec891ccfe3ceb7ae0c4bbe.png

html文件我们用fetch

efc2b5e62ee967680450b35a8eb42ffa.png

server2.js文件不变

7d3770f02b58a860590be32a4087ed73.png

我们写的X-Test-Cors在跨域请求的时候是不被允许的。

其他限制:

在跨域的时候允许的方法:GET HEAD POST ,其他的方法默认不允许,预请求会验证。这三个方法不需要预请求。

允许的Content-Type:text/plain multipart/form-data application/x-www-form-urlencoded,其他的值也要通过预请求之后才能进行发送。

其他限制:请求头限制(比如上文的请求头),XMLHttpRequestUpload对象均没有注册任何事件监听器,请求中没有使用ReadableStream对象。

CORS的预请求

浏览器根据什么判断这个返回的内容是不是允许的呢?就是header。

如果我们要允许我们自定义的头在请求里面发送,我们需要返回一个新的头来告诉浏览器,这个操作是允许的。

6d9b982a8ac700325223754bf46aaff2.png

这个时候浏览器是请求成功的。

deae3a0f19c8f666b5fbf24bc2fbe59c.png

但是比之前多出一个请求,就是预请求。method为OPTIONS.

类似的,我们也可以通过设置,来使用除了GET HEAD POST这三个方法以外的方法。

f00c4ee397561f8f9efecf44d2bdd172.png

还可以设置一下,'Access-Control-Max-Age': '1000' 在这个请求下面允许以这种方式实现跨域的请求的最长时间,比如,1000秒之内不需要再发送预请求来验证了,发正式请求就可以了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值