| http://www.mcy.com/a | http://mcy.a.com/b | 是 | 主域名相同,但是子域名不相同 |
| http://mcy.com/a | http://abc.com/b | 是 | 域名不相同 |
为什么要使用跨域请求
-
在现代前端开发中,我们经常需要调用第三方的服务接口(例如 mock server、fake api),随着专业化分工的出现有很多专业的信息服务提供商为前端开发者提供各类接口,这种情况下就需要进行跨域请求(这类前端接口服务很多是采用的 cors 方式来解决跨域问题的)。
-
还有一类情况是在前后端分离的项目中,前端后端分属于不同的服务跨域问题在采用这种架构的时候就存在。而且现在很多项目都采用这种前后分离的方式。
跨域请求实现
一、jsonp 跨域
通常为了减轻web服务器的负载,我们可以引入其他服务器上的js、css,img等静态资源,在html页面中再通过相应的标签从不同域名下加载静态资源,而被浏览器允许,基于此原理,我们可以通过动态创建script,再请求一个带参网址实现跨域请求。
1、原生实现
var script = document.createElement(‘script’);
script.type = ‘text/javascript’;
// 传参并指定回调执行函数为onBack
script.src = ‘http://machaoyin.top:8080/user/findById?id=1&callback=back’;
document.head.appendChild(script);
// 回调执行函数
function back(data) {
console.log(data);
}
原生实现除了这样写,还可以自己使用script标签请求,具体代码如下;
// 回调执行函数
function back(data) {
console.log(data);
}
//跨域请求
后端返回方法(根据id查询数据)
@GetMapping(value = “findById”)
@ApiOperation(value = “根据id获取用户信息”, notes = “根据id查询用户信息”)
public String getUser(Integer id, HttpServletRequest request, HttpServletResponse response){
String callback = (String)request.getParameter(“callback”);
User user = userService.findById(id);
JSONObject jsonObject = JSONObject.fromObject(user);
String retStr = callback + “(” + jsonObject + “)”;
return retStr;
}
返回查询的对象数据。其中使用JSONObject把JavaBean对象转为json字符串。JSONObject的使用请移步:浅谈JSONObject的使用
测试代码中请求的地址为我服务器地址,后端请求接口方法使用的Swagger来维护接口规范,详情请访问:SpringBoot整合Swagger2
请求的结果如图:
2、Jquery AJAX实现
$.ajax({
url: ‘http://machaoyin.top:8080/user/findById?id=1’,
type: ‘get’,
dataType: ‘jsonp’, // 请求方式为jsonp
success:function(data){
console.log(data);
}
});
【注】返回结果和原生实现返回的一样。使用jsonp很方便也很简单,但有一个缺点就是只能发送get请求,AJAX设置post方法也是发送get请求。
二、跨域资源共享 CORS
CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。它允许浏览器向跨源(协议 + 域名 + 端口)服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同域使用的限制。
CORS需要浏览器和服务器同时支持。它的通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX/Fetch通信没有差别,代码完全一样。浏览器一旦发现请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。因此,实现CORS通信的关键是服务器。只要服务器端实现了CORS接口,就可以跨域请求。
后端CORS接口案例:
@CrossOrigin(origins = “*”)
@PostMapping(value = “/find”)
@ApiOperation(value = “根据id获取用户信息”, notes = “根据id查询用户信息”)
public User find(Integer id){
return userService.findById(id);
}
在SpringMVC中可以直接使用注解@CrossOrigin来解决跨域接口的问题。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
最后
基础知识是前端一面必问的,如果你在基础知识这一块翻车了,就算你框架玩的再6,webpack、git、node学习的再好也无济于事,因为对方就不会再给你展示的机会,千万不要因为基础错过了自己心怡的公司。前端的基础知识杂且多,并不是理解就ok了,有些是真的要去记。当然了我们是牛x的前端工程师,每天像背英语单词一样去背知识点就没必要了,只要平时工作中多注意总结,面试前端刷下题目就可以了。
什么?你问面试题资料在哪里,这不是就在你眼前吗(滑稽
端一面必问的,如果你在基础知识这一块翻车了,就算你框架玩的再6,webpack、git、node学习的再好也无济于事,因为对方就不会再给你展示的机会,千万不要因为基础错过了自己心怡的公司。前端的基础知识杂且多,并不是理解就ok了,有些是真的要去记。当然了我们是牛x的前端工程师,每天像背英语单词一样去背知识点就没必要了,只要平时工作中多注意总结,面试前端刷下题目就可以了。
什么?你问面试题资料在哪里,这不是就在你眼前吗(滑稽