美文网首页我爱编程
【黑马程序员济南中心】jsonp解决跨域访问问题的实现过程

【黑马程序员济南中心】jsonp解决跨域访问问题的实现过程

作者: b06ee9db5ac0 | 来源:发表于2018-05-14 15:40 被阅读0次

使用jQuery的ajax一步请求调用百度LBS云服务会出现跨域问题,解决方案是使用$.getJSON('LBS云服务请求路径&callback=?',function(json){})来完成请求发的发起和响应接收,本文通过几个简单的示例来说明JSONP的基本原理。

    我们在通过ajax异步请求跨域请求json数据都会出现跨域报错,但是通过标签访问远程资源却不会出现跨域报错问题,那么,是否可以使用模拟标签请求方式将json数据从远程服务器上加载过来并提供给本地js代码使用?下面来做个演示:

    提前准备好一个web项目作为远程服务数据提供方,项目访问端口为9004,项目目录如下:

    准备其他项目作为客户端请求方(本文中我使用几个静态页面作为客户访问端)

    【演示一】使用标签测试远程加载服务端car1目录下的js文件

    服务端blueCar.js的代码仅有一行:

alert("我是蓝色的车");

    客户端加载服务端js代码如下:

    <script type="text/javascript"   src="http://localhost:9004/bos_map_jsonp/car1/blueCar.js"></script>

当在浏览器中打开该静态页面(直接访问页面路径 /bos_map/src/main/webapp/jsonP/jsonp_demo1.html)代码,会弹出窗口如下,

也就是说,我们在客户端jsonp_demo1.html中通过script标签加载的远程服务端js代码被执行了,那么,可以想象,能否让远程服务端的js代码把json数据传过来呢?

    【演示二】利用json被js原生支持,从远程服务端加载json数据

我们先来看一下客户端代码:

<script type="text/javascript">

function myOwnFun(data){

                    alert("从jsonp项目请求的数据:" + data.id + "-" + data.value);

            }

</script>

<script type="text/javascript" src="http://localhost:9004/bos_map_jsonp/car2/redCar.js"></script>

在代码中,通过script标签加载远程服务器的redCar.js文件,在代码中还有一个JS函数,其中有一个data参数,下面我们来准备远程服务端的代码:

myOwnFun({"id":1,"value":"我是红色的车"})

这样,我们就可以通过script表现远程访问服务端的响应数据了,只需要远程服务器将函数名和数据拼接成字符串交给客户端的script标签加载即可

    【演示三】访问远程服务端的servlet

准备客户端代码如下:

<script type="text/javascript">

function myOwnFun(data){

                    alert("从jsonp项目请求的数据:" + data.id + "-" + data.value);

            }</script>

<script type="text/javascript" src="http://localhost:9004/bos_map_jsonp/carInfo?callback=myOwnFun></script>

观察代码,准备了一个函数,名为myOwnFun,同时向服务端发送了一个script标签的src路径,传递了一个参数callback,值为myOwnFun,与函数名同名。

在服务端准备servlet,只需要servlet能够将类似【演示二】中的数据返回给本次src请求即可。

服务端servlet处理如下:

public class JsonpServlet extends HttpServlet{

        @Override

        protected void doGet(HttpServletRequest req, HttpServletResponse resp)

                        throws ServletException, IOException {

                String callback = req.getParameter("callback");

                String resultStr = callback + "({\"id\":2,\"value\":\"我是兰博基尼车\"})";

                //myOwnFun({id:2,value:我是兰博基尼})

                resp.setCharacterEncoding("utf-8");

                resp.getWriter().write(resultStr);

        }

}

在serlvet中,读取callback参数值,并拼接成字符串响应给请求,我们来看客户端页面访问效果:

发现数据也被传递过来了

    【演示四】通过jQuery的jsonp请求方式请求数据。

客户端代码如下:

          //依旧请求demo3中的请求路径

            $.getJSON("http://localhost:9004/bos_map_jsonp/carInfo?callback=?",

                            {},

                            function(data){

                    alert(data.id + data.value);

            });

和【演示三】一样,都可以获取远程服务端的数据。

其实,jQuery的 getJSON函数就是模仿【演示三】的效果,只不过在callback后的?会被jQuery自动替换为随机的函数名。

OK,jsonp的基本实现过程演示完毕。

相关文章

  • 【黑马程序员济南中心】jsonp解决跨域访问问题的实现过程

    使用jQuery的ajax一步请求调用百度LBS云服务会出现跨域问题,解决方案是使用$.getJSON('LBS云...

  • 解决ajax跨域问题

    Jsonp解决ajax跨域问题 CORS解决ajax跨域问题

  • ajax跨域请求

    ajax跨域请求(jsonp) 利用JSONP解决AJAX跨域问题的原理与jQuery解决方案JSONP jQue...

  • 浏览器跨域问题,教你手写实现jsonp跨域

    跨域概述为什么会有跨域跨域解决办法:1、jsonp;2、后台代理手写实现jsonp跨域(包括服务器端代码) 跨域问...

  • JSONP原理探究

    介绍   JSONP是一直种解决跨域问题的方案,实现的原理来自于页面中的 标签能够跨域请求资源。要通过JSONP实...

  • JW-JSONP

    去年学习React时碰到过JS跨域访问的问题,当时尝试的解决方案有Jsonp、服务器允许跨域、设置Content-...

  • JSONP跨域

    JSONP 全称:JSON with Padding,可用于解决主流浏览器的跨域数据访问的问题。 通过script...

  • 跨域访问

    参考文献:jsonp解决跨域问题 . cors解决跨域问题 . (java+前端小白)第一次碰到跨域问题,小伙伴们...

  • 跨域

    ??JSONP只能解决GET请求跨域,不能解决POST请求跨域问题,XHR2可以解决GET,POST方式的请求跨域...

  • 结合Promise 封装JSONP方法

    jsonp jsonp是一种前端开发中跨域的解决方案。利用了script 标签可以跨域请求的特性。实现步骤: 1....

网友评论

    本文标题:【黑马程序员济南中心】jsonp解决跨域访问问题的实现过程

    本文链接:https://www.haomeiwen.com/subject/mofjdftx.html