jsonp无X-Requested-With 及其深扒
事件背景交代
事情的起因是:A和B站都得调A站的接口,然后前端把请求写成jsonp的,又因为js是在CDN上,A和B是公用相同的js。然后就出现了A站调接口出现前端无法解析的问题,B站调A站接口却正常。出现无法解析的问题是因为callback被包了两层,即callback(callback("result"))
问题分析
既然是返回的内容出现了问题,那就是后端的代码问题,二话不说看代码。看了好长时间,果然拦截器的代码写的有问题:有两个拦截器,
一个是调用接口类所在包的拦截器(局域拦截器),针对这个包下面的每一个请求判断是否jsonp,是jsonp就自动给返回内容包一层callback;
另外一个是全局的拦截器中,对每个请求都进行了判断,如果请求中带有callback参数且请求类型是ajax,那就自动给返回内容包上一层callback。
显然,A站调A站自己的接口,是符合两个拦截器的条件的,所以,返回内容被callback包了两次,出现了返回内容无法被解析的问题;而B站调A站接口却是只符合局域拦截器的,所以返回内容是正常的,可以被解析。
问题总结
这里总结一下,其实前端和后端代码都有问题:
前端代码有问题是A站调A站,怎么用jsonp呢(从技术的角度是可以实现的,但是,逻辑上是错误的),只需要普通的ajax即可;
后端的代码有问题是在判断请求是否jsonp的同时又判断请求类型是否ajax,这两个条件不可能同时满足的,因为jsonp不是ajax,虽然我们是通过jquery的ajax设置dataType为jsonp来实现jsonp的,但是,jsonp是普通的请求。
问题深扒
为什么jsonp是普通请求而不是ajax呢?这里说下,ajax请求是肯定带有X-Requested-With请求头的,而普通的请求是不会有X-Requested-With请求头,所以我们一般判断是ajax还是普通请求是通过这个X-Requested-With头来判断的。
正好有时间就深扒了下这个问题。因为浏览器受到同源策略限制,A源(域名)下的资源,只可以访问A源的接口,如果不做处理的话,A源访问B源的接口,会出现也就是我们所常说的跨域问题了。
处理跨域问题,有哪几种方案呢?一般来说,有三个方案
jsonp
jsonp是根据img和script等是通过src属性来下载资源的,而src的方式是不受跨域的影响的。jquery的jsonp是通过动态生成script标签带上参数和callback去向服务器请求资源,然后请求返回后,根据callback调用指定的方法,再把生成的script标签给删除。
两次请求的方式
第一次调自己的服务端的接口,第二次在服务端调“其他源”的接口(跨域是针对浏览器的,对服务器来说是没有什么跨域不跨域的)
CORS
假如A站要调B站的接口,在不做处理之前肯定是http 403的,要用CORS的方式,需要在B站写个过滤器/拦截器/甚至AOP,拦截请求,在每个请求中加上 response.setHeader("Access-Control-Allow-Origin", "*"); 表示该资源可以被任意的外域访问
参考:
http://www.cnblogs.com/digdeep/p/4170059.html
http://blog.csdn.net/puma_dong/article/details/51395976
jsonp无X-Requested-With 及其深扒相关推荐
- (转)当AI变成宣传武器:继续深扒大数据公司Cambrige Analytica
当AI变成宣传武器:继续深扒大数据公司Cambrige Analytica 原创 2017-02-27 造就 造就 导语:2016年美国大选已然结束,但武器化的AI宣传机器只是刚刚兴起,它代表的是一个 ...
- 大赛导师教程:冷风——商战王参考图片法,深扒光感氛围展现
本周要发布的教程是来自明星导师冷风的整理分享,冷风老师也是渲云杯全国空间表现大赛的熟面孔了,从第一届一直到现在,每年都担纲重磅导师阵容的一员.此前渲云团队也对冷风老师的企业团队做过深度人物专访:[北玄 ...
- 荣耀猎人游戏本亮点有哪些?看我来深扒一下
今年应该是游戏玩家最快乐的一年了,产品不断推新,可选择的产品也越来越多,而且性能个个的在线,优中选优的对比一番来说,荣耀猎人游戏本V700脱颖而出.今天来深扒一下它的亮点,看看是不是你们的菜. 1. ...
- steam上传头像出现服务器错误_steam功能深扒:个人主页装扮好,开黑好友不会少...
不知不觉已经拖更将近一星期了. 今天省钱君就继续之前的话题,跟大家再深扒一下steam社交功能里面的个人主页功能,简单教大家装扮自己的steam个人主页(关于花里胡哨的gif展柜功能,省钱君自己也目前 ...
- 深扒现今大学计算机专业七宗罪---第一罪“错误的入门指导”
欢迎阅读我的周日深夜栏目<唱唱反调> 大家好!我是失落的爱.欢迎大家阅读我的新栏目<唱唱反调-深扒现今大学计算机专业七宗罪>,本栏目为周更,每周日深夜更新,带大家深入扒一扒大学 ...
- 抓取百万数据,我们深扒了风口上的OYO酒店
声明:本文调查方法采用"增长工程学"理论框架.该调查与第三方均无任何利益关系,为增长黑盒独立完成,仅用于行业研究参考和学术交流. 大家好,我是增长黑盒团队的新成员Miao.最近,经 ...
- 凉凉!深扒那个有点“咪蒙”的阿里美女高管!
没有伟大的意志力,就不可能有雄才大略. --巴尔扎克 中国软件网每日精选文集 自媒体人中流量最高.名气最响. 吸金能力最强的"咪蒙" 终于有接班人了, 她不是咪蒙大弟子杨乐多 而 ...
- ie6下 jsonp无响应的问题
场景:有一个a标签 <a href="javascript:void(0)" />给这个a标签绑定了事件,调用jsonp请求数据,ie6下无响应 解决方案:javasc ...
- 助特朗普胜选、英国脱欧,深扒FB丑闻背后的神秘数据公司如何玩转人心
美国时间 3月19日,星期一,Facebook股价暴跌7%,一天内市值蒸发近400亿美元.在"数据泄露丑闻"发酵之下,这一暴跌并不意外. 上周五,特朗普(Donald Trump) ...
最新文章
- java 常用方法_Java常用方法总结(持续更新中)
- apache bench linux,linux – 如何在CentOS上安装Apache Benchmark?
- 人脸识别屡遭非议 会成为“潘多拉魔盒”吗
- JDK 源码 Integer解读之一(toString)
- 【正一专栏】共享单车那些事儿
- 状态码202_HTTP状态码大全
- .NET西安社区 [拥抱开源,又见 .NET] 第二次活动简报
- SSM框架原理及使用方法
- Windows安装镜像下载
- 安装pdf虚拟打印机驱动失败的解决办法(addprinterdriver找不到指定模块)
- 云服务器win10系统初始密码,win10忘记系统密码?教你重置-
- 怎么计算中国股市分红最高的股票?什么是股息率?--使用python和tushare获取分红最高的股票
- 云脉文档管理系统高效管理海量纸质文档
- testflight测试的直播软件,TestFlight - Apple
- 新研究调查Masimo ORi™(氧储备指数)能否用作避免全麻期间高氧状态的指数
- 菜孔孔学python--字典
- Shiro(一)之shiro简介与工作原理
- 文献阅读(73)AAAI2022-SAIL: Self Augmented Graph Contrastive Learning
- SCALABILITY可伸缩性和EXTENSIBILITY可扩展性的区别
- c# datatable分类汇总
热门文章
- 游戏开发中的复杂度与银弹
- java识别汉字个数_统计字符串中汉字的个数
- JAVA程序设计:赛车(LeetCode:818)
- css相对位置之两个同级div下一个div相对上一个div的位置
- Error parsing HTTP request header...java.lang.IllegalArgumentException: Invalid character found in m
- PAT乙级1040:有几个PAT (25)
- IOS证书申请最新版2021
- 谷歌chrome浏览器设置成深色(护眼)模式
- Android 数字显示带E(科学计数法)
- 计算机硬盘分区信息,你知道电脑硬盘分区Guid格式和MBR格式有什么区别吗?来看看!...