事件背景交代

事情的起因是: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 及其深扒相关推荐

  1. (转)当AI变成宣传武器:继续深扒大数据公司Cambrige Analytica

    当AI变成宣传武器:继续深扒大数据公司Cambrige Analytica 原创 2017-02-27 造就 造就 导语:2016年美国大选已然结束,但武器化的AI宣传机器只是刚刚兴起,它代表的是一个 ...

  2. 大赛导师教程:冷风——商战王参考图片法,深扒光感氛围展现

    本周要发布的教程是来自明星导师冷风的整理分享,冷风老师也是渲云杯全国空间表现大赛的熟面孔了,从第一届一直到现在,每年都担纲重磅导师阵容的一员.此前渲云团队也对冷风老师的企业团队做过深度人物专访:[北玄 ...

  3. 荣耀猎人游戏本亮点有哪些?看我来深扒一下

    今年应该是游戏玩家最快乐的一年了,产品不断推新,可选择的产品也越来越多,而且性能个个的在线,优中选优的对比一番来说,荣耀猎人游戏本V700脱颖而出.今天来深扒一下它的亮点,看看是不是你们的菜. 1. ...

  4. steam上传头像出现服务器错误_steam功能深扒:个人主页装扮好,开黑好友不会少...

    不知不觉已经拖更将近一星期了. 今天省钱君就继续之前的话题,跟大家再深扒一下steam社交功能里面的个人主页功能,简单教大家装扮自己的steam个人主页(关于花里胡哨的gif展柜功能,省钱君自己也目前 ...

  5. 深扒现今大学计算机专业七宗罪---第一罪“错误的入门指导”

    欢迎阅读我的周日深夜栏目<唱唱反调> 大家好!我是失落的爱.欢迎大家阅读我的新栏目<唱唱反调-深扒现今大学计算机专业七宗罪>,本栏目为周更,每周日深夜更新,带大家深入扒一扒大学 ...

  6. 抓取百万数据,我们深扒了风口上的OYO酒店

    声明:本文调查方法采用"增长工程学"理论框架.该调查与第三方均无任何利益关系,为增长黑盒独立完成,仅用于行业研究参考和学术交流. 大家好,我是增长黑盒团队的新成员Miao.最近,经 ...

  7. 凉凉!深扒那个有点“咪蒙”的阿里美女高管!

    没有伟大的意志力,就不可能有雄才大略. --巴尔扎克  中国软件网每日精选文集 自媒体人中流量最高.名气最响. 吸金能力最强的"咪蒙" 终于有接班人了, 她不是咪蒙大弟子杨乐多 而 ...

  8. ie6下 jsonp无响应的问题

    场景:有一个a标签 <a href="javascript:void(0)" />给这个a标签绑定了事件,调用jsonp请求数据,ie6下无响应 解决方案:javasc ...

  9. 助特朗普胜选、英国脱欧,深扒FB丑闻背后的神秘数据公司如何玩转人心

    美国时间 3月19日,星期一,Facebook股价暴跌7%,一天内市值蒸发近400亿美元.在"数据泄露丑闻"发酵之下,这一暴跌并不意外. 上周五,特朗普(Donald Trump) ...

最新文章

  1. java 常用方法_Java常用方法总结(持续更新中)
  2. apache bench linux,linux – 如何在CentOS上安装Apache Benchmark?
  3. 人脸识别屡遭非议 会成为“潘多拉魔盒”吗
  4. JDK 源码 Integer解读之一(toString)
  5. 【正一专栏】共享单车那些事儿
  6. 状态码202_HTTP状态码大全
  7. .NET西安社区 [拥抱开源,又见 .NET] 第二次活动简报
  8. SSM框架原理及使用方法
  9. Windows安装镜像下载
  10. 安装pdf虚拟打印机驱动失败的解决办法(addprinterdriver找不到指定模块)
  11. 云服务器win10系统初始密码,win10忘记系统密码?教你重置-
  12. 怎么计算中国股市分红最高的股票?什么是股息率?--使用python和tushare获取分红最高的股票
  13. 云脉文档管理系统高效管理海量纸质文档
  14. testflight测试的直播软件,TestFlight - Apple
  15. 新研究调查Masimo ORi™(氧储备指数)能否用作避免全麻期间高氧状态的指数
  16. 菜孔孔学python--字典
  17. Shiro(一)之shiro简介与工作原理
  18. 文献阅读(73)AAAI2022-SAIL: Self Augmented Graph Contrastive Learning
  19. SCALABILITY可伸缩性和EXTENSIBILITY可扩展性的区别
  20. c# datatable分类汇总

热门文章

  1. 游戏开发中的复杂度与银弹
  2. java识别汉字个数_统计字符串中汉字的个数
  3. JAVA程序设计:赛车(LeetCode:818)
  4. css相对位置之两个同级div下一个div相对上一个div的位置
  5. Error parsing HTTP request header...java.lang.IllegalArgumentException: Invalid character found in m
  6. PAT乙级1040:有几个PAT (25)
  7. IOS证书申请最新版2021
  8. 谷歌chrome浏览器设置成深色(护眼)模式
  9. Android 数字显示带E(科学计数法)
  10. 计算机硬盘分区信息,你知道电脑硬盘分区Guid格式和MBR格式有什么区别吗?来看看!...