“当对一个目标有着强烈的持续的渴望时,苦苦思索体悟,就可能在事先“清晰地看见”那个崭新的结果。相反,如果事先没有清晰的意象,就不会有崭新的成果出现” ——出自《稻盛和夫给年轻人的忠告》
前言
相信无论是前端还是后端在开发的时候,都会遇到这样的一个问题就是:跨域跨域可以说是成长路上必经的一个“坑”。但是我们不应该对它嗤之以鼻,因为它在时时保护着我们服务器的安全。
概念
到底什么是跨域?
当我们发起一个请求时,请求中URL的协议、域名、端口三者之间任意一个与当前页面URL不同时就出现跨域现象。
解释一下:
一个请求链接如下:
http://www.xxxx.com。那么它的
- 协议是
http://
- 域名是
www.xxxx.com
- 端口是
80
(默认端口可以省略)
它的同源的情况如下:
- http://www.xxxx.com/index.html(同源)
- https://www.xxxx.com(不同源,协议不一样)
- http://www.yyyy.com(不同源,域名不一样)
- http://www.xxxx.com:8080(不同源,端口不一样)
为什么要有跨域?
我们在开发web应用的时候,一般都是基于浏览器。当代浏览器都遵循同源政策。
同源政策的目的,是为了保证用户信息的安全,防止恶意的网站窃取数据。
在这一政策下,受影响的有:
- Cookie、LocalStorage、IndexDB不能获取
- DOM 无法获得
- Ajax 无法正常请求
所以我们平时遇到的AJAX 无法发送只是其中一个情况而已
那么问题来了,小伙伴肯定有疑问,为什么我平时用Postman 或者 其它第三方的测试接口的工具没有发生跨域的情况呢,这是因为它们没有遵循同源政策,所以不会有跨域的情况。
没有必要对跨域嗤之以鼻,如果没有它的存在,各个网站之间的Cookie或者其它敏感的信息相互传递,肯定是非常不安全的。所以我们应该正确对待他。
如何解决跨域?
下面我们重点介绍如何在 AJAX 下解决跨域情况,这是我们平时遇到最多的问题。
其实有三种办法可以解决 AJAX下的跨域情况:
- JSONP
- WebSocket
- CORS
这里呢我们只介绍 CORS 这种情况, 这也是我唯一推荐给大家的一种方式。
在CORS这种情况下,前端几乎不用配置任何东西,当然这要麻烦后端的大佬了,相信大家对下面的配置肯定不陌生。无论是直接复制别人的还是从网上百度的,应该都见过:
Access-Control-Allow-Methods: …… Access-Control-Allow-Headers: …… Access-Control-Allow-Credentials: …… Access-Control-Max-Age: ……
没错,就是这几个请求头。
服务器需要在浏览器预检时候,告诉浏览器,同意你的请求,这时浏览器才会发起真正的请求。
这也是很多小伙伴说,为什么我的后端代码没有执行,没有打印任何信息呢,就是因为这几个头字段没有配置正确,从而浏览器不会继续发起真正的请求。
总结
今天先给大家介绍这么多。详细的信息,大家可以参考【阮一峰】大佬的文章,介绍的非常详细。相信大家在读完之后,一定会有所收获,从此对跨域不再害怕甚至是痛恨了。