Ajax&Fetch学习笔记 03、跨域问题

本文涉及的产品
.cn 域名,1个 12个月
简介: Ajax&Fetch学习笔记 03、跨域问题

一、认识跨域


1.1、介绍跨域(含示例)


跨域:向一个域发送请求,如果要请求的域和当前域是不同域即为跨域。不同域之间的骑牛,就是跨域请求。


示例:


<script>
    //访问本地资源实际就是同域:http://localhost:5500/main.css
    // const url = "./main.css";  
    //下面这个请求就是不同域,若是我们在本地向改地址发送一个ajax请求,就会出现跨域问题!
    const url = "https://blog.csdn.net/cl939974883";
    const xhr = new XMLHttpRequest();
    xhr.onreadystatechange = () => {
        if (xhr.readyState != 4) return;
        if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) {
            console.log(xhr.responseText);
        }
    }
    xhr.open("GET", url, true);
    xhr.send(null);
</script>




1.2、同域与不同域区别


一般一个请求地址为:https://www.imooc.com:443/course/list


组成:https(协议)://www.imooc.com(域名):443(端口号)/course/list(路径)

协议、域名、端口号、路径。

不同域指的是协议、域名、端口号只要其中一个不一样就是不同域!!!对于只是路径不一样的话是同域。




1.3、跨域请求为什么被阻止?


原因:阻止跨域请求,其实是浏览器本身的一种安全策略—同源策略!!!实际上本质后端也是响应过来的,只是浏览器在接收解析响应时会对响应的内容就是检查,若是不安全就会直接将其丢弃,才会出现这样的现象!


解决方案(后端来进行解决):①CORS跨域资源共享。②JSONP


优先使用CORS跨域资源共享,如果浏览器不支持CORS的话,再使用JSONP。


二、两种解决方案


方案1:CORS(IE10及以上选择)

认识CORS以及进行测试


CORS:简而言之就是后端发送响应前,给响应头设置Access-Control-Allow-Origin: *(也可指定单个地址,这里指的是所有地址允许)即可,浏览器接收到响应解析了到就会放行认为其是安全的。


测试:


由于需要后端来设置响应头的内容才能够实现CORS,所以这里来使用慕课网的接口来进行测试:https://www.imooc.com/api/http/search/suggest?words=js,这是慕课网的一个关键词接口,我们通过1.1中的ajax来发送请求。


成功响应:



响应头信息:




Access-Control-Allow-Origin说明


兼容性:IE10及以上版本的浏览器可以使用CORS。若是要适配IE10以下的只能使用JSONP。


Access-Control-Allow-Origin: *:表名允许所有的域名来跨域请求它,*是通配符,没有任何限制。


Access-Control-Allow-Origin: http://127.0.0.1:5500:只允许指定域名的跨域请求。(允许单个)


CORS跨域过程(核心重点):


1、浏览器发送请求。


2、后端在响应头中添加Access-Control-Allow-Origin头信息。


3、浏览器接收到响应。


4、如果是同域下的请求(比对发出的请求),浏览器不会额外做任何事情。前后端通信成功!


5、如果是跨域请求(不同域请求),浏览器会从响应头中查找是否允许跨域访问。


6、如果允许跨域(根据响应头中的Access-Control-Allow-Origin),前后端通信成功!


7、如果没找到或不包含想要跨域的域名,就会丢弃响应结果。


核心就是如果向不同域的后端发送请求,浏览器在拿到响应结果后会去解析响应头中是否有对应的Access-Control-Allow-Origin,若是该键值对为允许跨域的域名,此时通信成功!



方案2:JSONP(IE10以下选择方案)

实现方式:同样需要后端来实现JSONP,加载JSONP接口需要使用前端的script标签。


浏览器测试


我们依旧使用慕课的一个接口:https://www.imooc.com/api/http/jsonp?callback=handleResponse,其中callback=后面的可以任意设置名称。



此时前端需要通过调用指定后面跟着的函数名得到指定对象!



前端静态与动态加载JSONP接口


静态加载:其中script标签必须放在最后引用才有效


<script>
    // 2、使用指定callback=xxx,后面的xxx函数来接收data对象
    const handleResponse = (data) => {
        console.log(data);
        console.log(typeof data);
    }
</script>
<!-- 1、使用script标签来进行加载资源(必须放置在最后) -->
<script src="https://www.imooc.com/api/http/jsonp?callback=handleResponse"></script>



动态加载:就是使用js来动态创建一个dom元素并将其挂载到dom树上


<script>
    // 1、创建script标签并进行挂载
    var s = document.createElement("script");
    s.src = "https://www.imooc.com/api/http/jsonp?callback=handleResponse";
    document.body.appendChild(s);
    // 2、使用指定callback=xxx,后面的xxx函数来接收data对象
    const handleResponse = (data) => {
        console.log(data);
        console.log(typeof data);
    }
</script>


相关文章
|
2月前
|
前端开发 API UED
Python后端与前端交互新纪元:AJAX、Fetch API联手,打造极致用户体验!
Python后端与前端交互新纪元:AJAX、Fetch API联手,打造极致用户体验!
86 2
|
13天前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
28 1
|
1月前
|
前端开发 API 开发者
深度剖析:AJAX、Fetch API如何成为Python后端开发者的最佳拍档!
深度剖析:AJAX、Fetch API如何成为Python后端开发者的最佳拍档!
37 4
|
1月前
|
前端开发 JavaScript API
惊呆了!学会AJAX与Fetch API,你的Python Web项目瞬间高大上!
在Web开发领域,AJAX与Fetch API是提升交互体验的关键技术。AJAX(Asynchronous JavaScript and XML)作为异步通信的先驱,通过XMLHttpRequest对象实现了局部页面更新,提升了应用流畅度。Fetch API则以更现代、简洁的方式处理HTTP请求,基于Promises提供了丰富的功能。当与Python Web框架(如Django、Flask)结合时,这两者能显著增强应用的响应速度和用户体验,使项目更加高效、高大上。
50 2
|
1月前
|
前端开发 API 开发者
从零到精通,AJAX与Fetch API让你的Python Web前后端交互无所不能!
从零到精通,AJAX与Fetch API让你的Python Web前后端交互无所不能!
42 3
|
2月前
|
JSON 资源调度 JavaScript
Vue框架中Ajax请求的实现方式:使用axios库或fetch API
选择 `axios`还是 `fetch`取决于项目需求和个人偏好。`axios`提供了更丰富的API和更灵活的错误处理方式,适用于需要复杂请求配置的场景。而 `fetch`作为现代浏览器的原生API,使用起来更为简洁,但在旧浏览器兼容性和某些高级特性上可能略显不足。无论选择哪种方式,它们都能有效地在Vue应用中实现Ajax请求的功能。
42 4
|
1月前
|
前端开发 API 数据格式
颠覆传统!AJAX、Fetch API与Python后端,开启Web开发新篇章!
在Web开发领域,技术的快速迭代推动着应用不断进化。传统前后端交互方式已无法满足现代Web应用对高效、实时性和用户体验的需求。AJAX作为异步通信的先驱,使页面无需刷新即可更新部分内容,显著提升用户体验;尽管XML曾是其主要数据格式,但如今JSON已成为主流。Fetch API则以其简洁、灵活的特点成为AJAX的现代替代品,基于Promises的异步请求让开发更加高效。与此同时,Python后端凭借高效稳定和丰富的库支持,成为众多开发者的首选,无论是轻量级的Flask还是全功能的Django,都能为Web应用提供强大的支撑。
37 0
|
1月前
|
XML 前端开发 API
惊艳全场的秘诀!AJAX、Fetch API与Python后端,打造令人惊叹的Web应用!
惊艳全场的秘诀!AJAX、Fetch API与Python后端,打造令人惊叹的Web应用!
26 0
|
1月前
|
前端开发 JavaScript API
告别繁琐!AJAX与Fetch API,让你的前后端沟通畅通无阻,项目效率飙升!
在Web开发中,前后端的顺畅沟通至关重要。传统方法常需频繁刷新页面,影响体验与效率。AJAX和Fetch API的出现简化了这一过程。AJAX利用XMLHttpRequest实现局部页面更新,提升用户体验;Fetch API则以更简洁的语法和强大的功能,进一步优化异步请求处理。两者均能显著提高开发效率,简化代码结构,让项目迭代更快速。拥抱这些技术,让Web开发之路更加顺畅。
26 0
|
3月前
|
XML 前端开发 JavaScript
Ajax、Fetch、Axios
Ajax、Fetch、Axios
78 25