博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jsonp跨域资源引起CORB
阅读量:5985 次
发布时间:2019-06-20

本文共 2634 字,大约阅读时间需要 8 分钟。

一、jsonp的使用

jsonp是实现跨域请求数据的一种方式,解决了由于浏览器同源策略带来的安全限制;虽然浏览器有同源策略的限制,但对于一些特殊的dom元素却可引用非同源资源,例如<img src=""/> <script src=""/>等,下面结合例子说明:

  • jquery直接发起ajax调用

服务端代码

@RequestMapping(value = "/load/data")public void loadData2(@RequestParam("callback") String callback,                     HttpServletResponse response) throws IOException {    Map
data = new HashMap<>(); data.put("name", "xudj"); data.put("age", "18"); // 转json String jsonData = JSON.toJSONString(data); //用回调函数名称包裹返回数据 String result = callback + "(" + jsonData + ")"; response.getWriter().write(result);}

客户端代码

    
跨域测试

调用结果

cors跨域
如上,当在localhost:9090站点访问localhost:8080的接口资源时,出现跨域错误。

如错误提示,可在服务器端代码中设置响应头“Access-Control-Allow-Origin”实现允许跨域
  • script解决跨域问题

服务端代码

如上不变

客户端代码

    
script解决跨域

调用结果

script解决cprs

  • jsonp解决跨域

服务端代码

如上不变

客户端代码

    
jsonp解决跨域

调用结果

jsonp解决跨域

通过指定ajax的dataType为“jsonp”,jsonp指定服务端返回jsonp格式数据;请求会自动带上参数callback=?

二、CORB问题的由来

当服务端代码中添加安全响应头时:

服务端代码

@RequestMapping(value = "/load/data")    public void loadData2(@RequestParam("callback") String callback,                         HttpServletResponse response) throws IOException {        // 安全响应头        response.addHeader("X-Content-Type-Options", "nosniff");        response.setContentType("text/html;charset=UTF-8");        Map
data = new HashMap<>(); data.put("name", "xudj"); data.put("age", "18"); // 转json String jsonData = JSON.toJSONString(data); //用回调函数名称包裹返回数据 String result = callback + "(" + jsonData + ")"; response.getWriter().write(result); }
如上所示,代码中多出
// 安全响应头
response.addHeader("X-Content-Type-Options", "nosniff");
response.setContentType("text/html;charset=UTF-8");

导致使用jsonp解决跨域的请求出现如下错误:

jsonp出现CORB

如上,如果服务端代码没有指定ContentType时,则出现如下错误:

jsonp拒绝执行script

以上均是由response.addHeader("X-Content-Type-Options", "nosniff");导致的浏览器执行script时通过对MIME类型检测过滤掉不安全的文件或请求。

三、原因分析

CORB(Cross-Origin Read Blocking):浏览器在加载可以跨域资源时,在将资源载入页面时对其进行识别与拦截等一系列处理。X-Content-Type-Options(:nosniff):相当于一个提示标志,被服务器用来提示客户端须遵循在Content-Type首部中对MIME类型的设定,不能对其进行修改。从而禁用了客户端(浏览器)的MIME类型嗅探行为(即把不可执行的MIME类型转变为可执行的MIME类型)。指定值为nosniff时,会拒绝以下两种请求:
  • 请求类型:style,MIME类型不是“text/css”
  • 请求类型:script,MIME类型不是“Javascript类型”,Javascript类型有text/javascript、application/javascript、application/x-javascript等

所以,当服务端出现response.addHeader("X-Content-Type-Options", "nosniff");安全相应头,且未指定Content-Type为Javascript类型类型时,jsonp请求跨域资源时变出现如上CORB或拒绝解析的问题。

四、解决办法

根据第三步问题原因的分析中可知,修改方法有如下两种:

  1. 去除服务端response.addHeader("X-Content-Type-Options", "nosniff");的配置,但可能造成一些安全上的问题,笔者这里不做扩展,有兴趣的同学可以留言讨论
  2. 服务指定Content-Type为Javascript类型的一种即可
  3. 启用jsonp,将跨域的数据请求转到本站服务器,由本站服务器去做跨域请求,即跳过浏览器同源策略的限制

转载地址:http://ctylx.baihongyu.com/

你可能感兴趣的文章
Ubuntu 系统下安装gcc-arm-none-eabi编译STM32工程
查看>>
Python3找出List中最大/最小的N个数及索引
查看>>
C# GetType与typeof
查看>>
Eclipse下配置主题颜色
查看>>
Form表单的action和onSubmit示例介绍
查看>>
Centos7下安装部署MXNET
查看>>
.net初学之定义委托、事件
查看>>
[对抗训练]“中国菜刀”安装,20180222
查看>>
关于进程和线程的问题
查看>>
PHP中foreach用法详细讲解
查看>>
PHP如何进阶,提升自己
查看>>
谈一谈URL
查看>>
Create Custom Instruments
查看>>
C#写文本日志帮助类(支持多线程)
查看>>
ThreadPool.QueueUserWorkItem的用法
查看>>
【小游戏】C++手工制作贪吃蛇
查看>>
poj 1050 To the Max
查看>>
SQL Server三种表连接原理
查看>>
Linux修改时间
查看>>
centos6.8服务器配置之vsftpd配置
查看>>