jsonp解决跨域
同源策略:浏览器的安全策略,指协议、域名、端口完全相同。同源或不同源指的是两个地址间的关系。
默认,只有同源的地址之间才能相互进行ajax请求。不同源之间的请求称为跨域请求。
jsonp解决跨域:https://bob.ippoli.to/archives/2005/12/05/remote-json-jsonp/
jsonp:json with padding的缩写,是一种借助<script>标签发送跨域请求的技术。
jsonp原理:通过<script>标签发送跨域请求,请求响应一段javascript代码,
服务端响应的这一段javascript代码是:一个方法名,包裹一个json对象(所以叫json with padding)。
浏览器接收到javascript代码后立即执行,相当于调用了一个函数。所以,我们需要预先定义好这个函数。
jsonp必须是get请求。
jsonp操作1:
<script type="text/javascript"> // 本地定义一个函数 function fun1(data) { alert(data.name); } </script> <script type="text/javascript" src="http://其他域名/js/json.js"></script>
<script type="text/javascript" src="http://其他域名/js/json.js"></script>这个标签作用:
当浏览器解析到该元素时,会暂停浏览器的渲染,直到该资源加载完毕。src指向的内容会嵌入到文档中当前标签所在的位置。
这个标签的作用也就相当于:
<script type="text/javascript">
// 这里是src="http://其他域名/js/json.js"响应的内容
fun1({"name":"张三","age":10});
<script>
浏览器接收到javascript代码后立即执行,调用方法 fun1({"name":"张三","age":10});
所以,上面代码的本质是:
<script type="text/javascript"> // 本地定义一个函数 function fun1(data) { alert(data.name); } </script> <script type="text/javascript"> fun1({"name":"张三","age":10}); </script>
jsonp操作2:
<script type="text/javascript"> function fun1(data) { alert(data.name + "-" + data.age); } var script = document.createElement("script"); script.src = "http://localhost/Demo01/jsonResult?jsonp=fun1"; document.body.appendChild(script); </script>
通过javascript代码,动态发送跨域请求,"?jsonp=fun1"表示回调函数名为fun1,服务端响应的数据格式为:fun1(json对象);
服务端代码:
@RequestMapping("/jsonResult") @ResponseBody public String fun1(String jsonp) { if(jsonp.length() > 0) { // jsonp请求 return jsonp + "(" + "{\"name\":\"张三\",\"age\":10}" + ")"; } else { return "{\"name\":\"张三\",\"age\":10}"; } }
posted on 2019-02-28 20:03 wenbin_ouyang 阅读(202) 评论(0) 编辑 收藏 举报