当前位置: 首页 > Web前端 > HTML

jsonp跨域获取数据实现百度搜索

时间:2023-04-02 12:54:59 HTML

本菜鸡最近写页面请求数据报如下错误。无法加载https://...:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此不允许访问来源“http://127.0.0.1:7070”。了解原因后得知是跨域请求导致的。了解了跨域和同源策略后,写了个demo来玩玩说说跨域。要理解跨域,首先要理解浏览器同源策略,然后下来搬运一些大神总结下什么是同源策略?同源策略/SOP(Sameoriginpolicy)是Netscape于1995年向浏览器引入的约定。它是浏览器最核心、最基本的安全功能。没有同源策略,浏览器容易受到XSS、CSFR等攻击。所谓同源,就是“协议+域名+端口”是相同的,即使两个不同的域名指向同一个IP地址,也不是同源的。同源策略限制了以下行为:1.无法读取Cookie、LocalStorage和IndexDB2.无法获取DOM和Js对象3.无法发送AJAX请求假设没有同源策略,那么我在A下的cookie网站可以是任何网站获取;那么这个网站的拥有者就可以使用我的cookie(也就是我的身份)在A网站下进行操作。同源策略可以说是Web前端安全的基石。如果没有同源策略,浏览器将毫无安全可言。同源策略的限制非常严格,但是在实际场景中,确实有很多地方需要突破同源策略的限制,也就是我们常说的跨域。跨域的方法有很多(比如接下来要玩的jsonp跨域,还有cors跨域资源共享,反向代理等)。使用jsonp跨域由于同源策略,一般来说,位于server1.example.com的网页无法与server1.example.com以外的服务器通信,HTML的元素的这种开放策略,网页可以获取其他来源动态生成的JSON数据,这种使用模式称为JSONP。使用JSONP捕获的数据不是JSON,而是任意JavaScript,使用JavaScript解释器执行,而不是使用JSON解析器解析。代码示例callback=handleResponse'document.body.insertBefore(script,document.body.firstChild)这里的callback回调函数很重要,在body中动态添加的script标签可以使用加载的文件与html下的其他js文件共享一个文件全局范围。也就是说,标签加载的资源是可以被全局范围内的函数使用的!玩玩,写一个百度搜索框百度有一个对外暴露的数据接口:https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTANF6hhy/su?wd=1在chrome浏览器中打开百度首页,打开百度首页在netkwork中的开发者工具中可以发现我们可以直接使用。通过jsonp,我们可以实现跨域获取输入框内容相关的热点数据,点击跳转。具体实现请参考Github项目源码。实现效果:页面结构很简单,如图:jsonp跨域实现代码document.onkeyup=function(){varval=text.valuevarscript=document.createElement('script')script.src=`https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=${val}&cb=dosomething`;document.body.appendChild(script)}functiondosomething(data){varoUl=document.querySelector('#listsul')oUl.innerHTML=''data.s.map(function(html){varoLi=document.createElement('li')oLi.innerHTML=htmloLi.onclick=function(){window.location.href=`http://www.baidu.com/s?wd=${html}`}oUl.appendChild(oLi)})}只是一个使用jsonp实现跨域的简单demo,方便我这种新手学习。其他结构和样式文件就不一一列举了。你可以从我这里下载。我的完整项目查看完整项目地址:Github:baidu_demo参考文章:前端常见跨域解决方案(全)JSONP和CORS实现跨域请求,再也不用学AJAX了!(3)跨域获取资源②——JSONP&CORSjsonp跨域请求详解——由繁入简