什么是 JsonP
Jsonp(JSON with Padding) 是 json 的一种"使用模式",可以让网页从别的域名(网站)那获取资料,即跨域读取数据。为什么我们从不同的域(网站)访问数据需要一个特殊的技术(JSONP )呢?这是因为同源策略.
什么是跨域?
跨域是指一个域(网站)下的文档或脚本试图去请求另一个域(网站)下的资源。
什么是同源策略?
同源策略/SOP(Same origin policy)是一种约定,由 Netscape 公司 1995 年引入浏览器,它是浏览器最核心也最基本的安全功能,现在所有支持 JavaScript 的浏览器都会使用这个策略。如果缺少了同源策略,浏览器很容易受到 XSS、CSFR 等攻击。所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个 ip 地址,也非同源。
非同源策略限制以下几种行为:
1.) Cookie、LocalStorage 和 IndexDB 无法读取
2.) DOM 和 Js 对象无法获得
3.) AJAX 请求不能发送
跨域解决方案
1) 通过 jsonp 跨域
2) document.domain + iframe 跨域
3) location.hash + iframe
4) window.name + iframe 跨域
5) postMessage 跨域
6) 跨域资源共享(CORS)
7) nginx 代理跨域
8) nodejs 中间件代理跨域
9) WebSocket 协议跨域
JsonP 优缺点
JSONP 的优点是:它不像 XMLHttpRequest 对象实现的 Ajax 请求那样受到同源策略的限制;它的兼容性更好,在更加古老的浏览器中都 可以运行,不需要 XMLHttpRequest 或ActiveX 的支持;并且在请求完毕后可以通过调用 callback 的方式回传结果.
JSONP 的缺点则是:它只支持 GET 请求而不支持 POST 等其它类型的 HTTP 请求;它只支持跨域 HTTP 请求这种情况,不能解决不同域的两个页面之间如何进行 JavaScript 调用的问题。
使用 JsonP 解决跨域
Jsp页面发送ajax请求,请求中指定数据参数
dataType:"jsonp"//表示使用jsonP
jsonp:"callback",//表示jsonp返回数据的前缀,在服务器端,需要将前缀拼接到json字串前,一并返回
请求页面代码:
服务器端,响应代码:
SpringMVC 对 JsonP 的支持
在SpringMvc中,可以直接使用MappingJacksonValue对象进行返回数据,使用方法如下:
MappingJacksonValue mv = new MappingJacksonValue(返回的数据);
mv.setJsonpFunction(JsonP指定的前缀);
return mv;
注意:需要依赖 Jackson 的 jar
代码示例: