老被跨域问题烦?看看都有哪些处理方法

前面写的,没想到几天内收到了不少良好的反馈,在此感谢大家的关注。往后会不定时分享一些技术、管理领域的工作经验总结与感悟,欢迎大家持续关注、交流。最近被问及一个跨域的问题,包括之前面试时发现很多面试者对跨域及其处理也是一知半解,故本文对该问题进行了梳理总结,以供参考。

1. 什么是跨域

理解什么是跨域,就要先了解一个叫“同源策略”的东西,什么是“同源策略”?这是浏览器为了网站访问安全,对来自不同源的请求做一些必要的访问限制的一种策略。那什么叫“同源”呢?我们知道,一个http请求地址一般包含四部分:协议://域名:端口/路径,所谓同源,就是前面三者,即协议、域名、端口都一样。举例说明,假如我们有一个地址 , 来看以下地址是否与它同源

地址 是否同源 说明
https://blog.jboost.cn/docker-1.html   不同源   协议不同,一个http,一个https  
  不同源   域名不同  
:8080/docker-1.html   不同源   端口不同,一个是默认端口80,一个是8080  
  同源   虽然路径不同,但协议、域名、端口(默认80)都相同  

 

那么浏览器对不同源的请求做了哪些访问限制呢?共有三种限制

对Cookie、LocalStorage,以及IndexDB(浏览器提供的类NoSQL的一个本地数据库)的访问

对DOM的访问

AJAX请求

而跨域就是要打破这种访问限制,对不同源的资源请求也能顺利进行,最常见的就是AJAX请求,比如前后端分离架构中,两者服务域名不同,前端通过AJAX直接访问服务端接口,就会存在跨域问题。

2. 为什么会存在跨域

前面说“同源策略”时已经提到,浏览器是为了网站的访问安全,才设置了跨域这道屏障。那么前面所说的三种限制,分别都是如何来保障网站安全的。

对本地存储Cookie、LocalStorage、IndexDB的访问限制
我们系统的登录凭证一般是通过在Cookie中设置 SESSIONID(如针对浏览器表单请求)或直接返回 token(如针对REST请求)的形式返回给客户端的,比如Tomcat是通过在Cookie中设置名为 JSESSIONID 的属性来保存的,而一般REST请求的token前端会存储于 LocalStorage 中,如果不存在访问限制,则你访问的其它网站可能就会获取到这些凭证,然后伪造你的身份来发起非法请求,这就太不安全了。

对DOM的访问限制
如果不对DOM进行访问限制,那么其它网站,尤其一些钓鱼网站,就可以通过 <iframe> 的形式拿到你访问网站的DOM,进而获取到你输入的一些敏感信息,比如用户名、密码…

对AJAX请求的限制
同源策略规定,AJAX请求只能发给同源的网址,否则就会报错。至于为什么要限制,一方面是避免1中所提到伪造非法请求,另一方面我理解是AJAX过于灵活,如果不做限制,可能网站的接口资源就会被其它网站随意使用,就像你的私有物品被别人招呼都不打任意拿去用一样。 


总之,同源策略是浏览器提供的最基本的一种安全保障机制或约定。

3. 怎么实现跨域访问

我们平常遇到的跨域问题基本都出现在AJAX请求的场景,一般而言,可以通过代理、CORS、JSONP等方式来解决跨域问题。

3.1 代理

既然“同源策略”是浏览器端的机制,那我们就可以绕开浏览器,最常见的做法就是使用代理,如 Nginx,比如我们前端项目的域名是 ,服务端接口域名是 ,我们在 Nginx 中提供如下配置

server{ # 端口 listen 80; # 域名 server_name blog.jboost.cn; # 所有 请求都会被转发到 location ^~ /api { proxy_pass ; } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwdjzw.html