什么是跨域(CROS)
跨域是指a页面想获取b页面资源,如果a、b页面的协议、域名、端口、子域名不同,或是a页面为ip地址,b页面为域名地址,所进行的访问行动都是跨域的,而浏览器为了安全问题一般都限制了跨域访问,也就是不允许跨域请求资源。
为什么不允许跨域
同源策略/SOP(Same origin policy)是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。所谓同源是指”协议+域名+端口”三者相同,即便两个不同的域名指向同一个ip地址,也非同源。
同源策略限制以下几种行为:
- Cookie、LocalStorage 和 IndexDB 无法读取
- DOM 和 Js对象无法获得
- AJAX 请求不能发送
如何解决跨域问题
由于前后端项目往往部署在不同服务器,或者不同端口上,会产生资源的跨域问题。解决办法如下:
利用jsonp
设置资源为允许跨域
原理是在响应头中添加 Access-Control-Allow-Origin
字段,值设置为*,( *表示任意域都可以请求此资源)
spring中的@CrossOrigin 实现的跨域,就是基于此原理。
Nginx反向代理
首先,让我们了解一下什么是代理。
比如,A想访问C的资源,但A并不直接访问,而是通过B来访问C的资源,这里的B就是A的代理。这种代理方式也叫做正向代理。
这里举两个方便理解的例子:
- 正向代理:A向C借钱,由于一些情况不能直接向C借钱,于是A想了一个办法,他让B去向C借钱,这样B就代替A向C借钱,A就得到了C的钱,C并不知道A的存在,B就充当了A的代理人的角色。
- 反向代理:A向B借钱,B没有拿自己的钱,而是悄悄地向C借钱,拿到钱之后再交给A,A以为是B的钱,他并不知道C的存在。
- 正向代理隐藏真实客户端,正向代理代理的对象是客户端
- 反向代理隐藏真实服务端,反向代理代理的对象是服务端
而Nginx就可以做到反向代理,Nginx和资源服务器属于同一域,所以不存在跨域问题。