![a5454a797038ef589291582fd51e20ce.png](https://i-blog.csdnimg.cn/blog_migrate/a6248ca6bae5ac09876250e518deec13.jpeg)
1 跨域请求
在构建分布式系统时,将门户系统(负责前端页面展示的控制器)和获取数据的系统(从数据库获取资料)分开。在开发过程中,会遇到跨域请求问题。
![eab6c79ef170401308bc1b647bb1b110.png](https://i-blog.csdnimg.cn/blog_migrate/6242391604048c3007bff1775e254a05.jpeg)
什么是跨域请求
跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这里跨域是广义的。
- 资源跳转: A链接、重定向、表单提交
- 资源嵌入:
<link>
、<script>
、<img>
、<frame>
等 dom 标签,还有样式中background:url()、@font-face()等文件外链 - 脚本请求: js 发起的 ajax 请求、dom 和 js 对象的跨域操作等
其实我们通常所说的跨域是狭义的,是由浏览器同源策略限制的一类请求场景。主要特征有两种:
- 域名不相同,即两个不同的应用
![6f2b11880538ca21dbd005b82af3e604.png](https://i-blog.csdnimg.cn/blog_migrate/75c971abc9969d0d963eef2638710222.jpeg)
2. 域名相同,但是端口不同,即同一个应用中的不同子系统
![2a82128606712455c6941259136280ee.png](https://i-blog.csdnimg.cn/blog_migrate/0a84a24cefa23c962c051f27e9dbd6d9.jpeg)
解决方式
想要从数据系统的接口中获得数据,我常用的有两种方式:
- 若使用前端 ajax 获取数据,常用的解决方式是使用 jsonp 实现跨域请求
- 若从后台程序中获取数据,使用 HttpClient
2 jsonp
通常为了减轻 web 服务器的负载,我们把js、css,img 等静态资源分离到另一台独立域名的服务器上,在 html 页面中再通过相应的标签从不同域名下加载静态资源,这种行为被浏览器允许。基于此原理,我们可以把需要的数据封装成一段 js 代码。
实现方式
jsonp 只能使用 get 请求,前台请求时,指定回调函数名,后台系统将数据封装成 js 代码,将数据放到参数里面:
<