JSONP解释

在解释JSONP之前,我们需要了解下”同源策略“这个概念,这对理解跨域有帮助。基于安全的原因,浏览器是存在同源策略机制的,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载额文档的属性。有点绕,说的简单点就是浏览器限制脚本只能和同协议、同域名、同端口的脚本进行交互。

JSONP就是为了解决这一问题的,JSONP是英文JSON with Padding的缩写,是一个非官方的协议。他允许服务端生成script tags返回值客户端,通过javascript callback的形式来实现站点访问。JSONP是一种script tag的注入,将server返回的response添加到页面是实现特定功能。

简而言之,JSONP本身不是复杂的东西,就是通过scirpt标签对javascript文档的动态解析绕过了浏览器的同源策略。

JSONP原理及实现

接下来,来实际模拟一个跨域请求的解决方案。后端为Spring MVC架构的,前端则通过Ajax进行跨域访问。

1、首先客户端需要注册一个callback(服务端通过该callback(jsonp)可以得到js函数名(jsonpCallback)),然后以JavaScript语

法的方式,生成一个function

2、接下来,将JSON数据直接以入参的方式,放置到function中,这样就生成了一段js语法文档,返回给客户端。

3、最后客户端浏览器动态的解析script标签,并执行返回的JavaScript语法文档片段,此时数据作为参数传入到了预先定义好的

回调函数里(动态执行回调函数)。

这种动态解析js文档和eval函数是类似的。

经过一番努力,解决如下:

SpringMVC端:

  1. @RequestMapping("/get")
  2. public void get(HttpServletRequest req,HttpServletResponse res) {
  3. res.setContentType("text/plain");
  4. String callbackFunName =req.getParameter("callbackparam");//得到js函数名称
  5. try {
  6. res.getWriter().write(callbackFunName + "([ { name:\"John\"}])"); //返回jsonp数据
  7. } catch (IOException e) {
  8. e.printStackTrace();
  9. }
  10. }
  11. @RequestMapping("/getJsonp")
  12. @ResponseBody
  13. public JSONPObject getJsonp(String callbackparam){
  14. Company company=new Company();
  15. company.setAddress("北大青鸟大学城校区");
  16. company.setEmail("123456@qq.com");
  17. company.setName("广州讯动网络可以有限公司");
  18. company .setPhone("12345678912");
  19. return new JSONPObject(callbackparam, company);
  20. }

AJAX端:

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <script src="http://code.jquery.com/jquery-2.1.3.min.js"></script>
    6. <script>
    7. $(document).ready(function(){
    8. $("#but1").click(function(){
    9. $.ajax({
    10. url:'http://127.0.0.1:8080/DevInfoWeb/get',
    11. type: "get",
    12. async: false,
    13. dataType: "jsonp",
    14. jsonp: "callbackparam", //服务端用于接收callback调用的function名的参数
    15. jsonpCallback: "success_jsonpCallback", //callback的function名称,服务端会把名称和data一起传递回来
    16. success: function(json) {
    17. alert(json);
    18. },
    19. error: function(){alert('Error');}
    20. });
    21. });
    22. $("#but2").click(function(){
    23. $.ajax({
    24. url:'http://127.0.0.1:8080/DevInfoWeb/getJsonp',
    25. type: "get",
    26. async: false,
    27. dataType: "jsonp",
    28. jsonp: "callbackparam", //服务端用于接收callback调用的function名的参数
    29. jsonpCallback: "success_jsonpCallback", //callback的function名称,服务端会把名称和data一起传递回来
    30. success: function(json) {
    31. alert(json);
    32. },
    33. error: function(){alert('Error');}
    34. });
    35. });
    36. });
    37. </script>
    38. </head>
    39. <body>
    40. <div id="div1"><h2>使用 jQuery AJAX 来改变文本</h2></div>
    41. <button id="but1">按钮1</button> <br/>
    42. <button id="but2">按钮2</button>
    43. </body>
    44. </html>

springmvc 的@ResponseBody 如何使用JSONP?的更多相关文章

  1. 解决SpringMVC的@ResponseBody返回中文乱码

    SpringMVC的@ResponseBody返回中文乱码的原因是SpringMVC默认处理的字符集是ISO-8859-1,在Spring的org.springframework.http.conve ...

  2. [转]SpringMVC使用@ResponseBody时返回json的日期格式、@DatetimeFormat使用注意

    一.SpringMVC使用@ResponseBody时返回json的日期格式 前提了解: @ResponseBody 返回json字符串的核心类是org.springframework.http.co ...

  3. SpringMVC使用@ResponseBody时返回json的日期格式、@DatetimeFormat使用注意

    一.SpringMVC使用@ResponseBody时返回json的日期格式 前提了解: @ResponseBody 返回json字符串的核心类是org.springframework.http.co ...

  4. SpringMVC使用@ResponseBody注解返回中文字符串乱码的问题

    先说一下我的经历,以及解决问题的而过程. 在使用SpringMVC的时候,最开始的时候在配置文件中使用<mvc:annotation-driven />去自动注册DefaultAnnota ...

  5. SpringMVC的@ResponseBody返回JSON,中文乱码问题的解决.

    SpringMVC的@ResponseBody,返回json,如果有中文显示乱码的解决办法. 在SpringMVC的配置文件中 <bean class="org.springframe ...

  6. spring mvc 返回乱码SpringMVC使用@ResponseBody注解返回中文字符串乱码的问题

    原文地址:https://www.cnblogs.com/fzj16888/p/5923232.html 先说一下我的经历,以及解决问题的而过程. 在使用SpringMVC的时候,最开始的时候在配置文 ...

  7. SpringMvc返回@ResponseBody中文乱码

    使用SpringMvc的@ResponseBody返回指定数据的类型做为http体向外输出,在浏览器里返回的内容里有中文,会出现乱码,项目的编码.tomcat编码等都已设置成utf-8,如下返回的是一 ...

  8. springMVC使用@ResponseBody返回json

    json格式:{"totle":22,"rows":"sss"} map格式:{totle=22, rows=sss} 一.springMV ...

  9. springMVC的@ResponseBody、@RequestBody使用需要注意的地方

    springMVC我觉得比struts2好的其中一个原因就是可以使用注解解析json数据,方便快捷.但是,即使如此,还是有需要注意的地方. 1.返回的地方设置@ResponseBody,请求的对象参数 ...

随机推荐

  1. JS中获得指定日期前或后几天对应的日期

    var d = new Date(); d.setDate(d.getDate() - 2); console.log(d.toString()); // First of month var c = ...

  2. 因为AI,所以爱

    作为技术驱动型公司 自我颠覆的核心就是技术上有所突破 2019技术奇点大会上,创始人行在提出 「未来,大数据和人工智能 将成为商业升级的智能发动机」 这与我们的使命不谋而合 时间退回到2016年的冬天 ...

  3. 吴裕雄--天生自然python学习笔记:python下载安装各种模块的whl文件网址

    python下载安装各种模块的whl文件网址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml

  4. 对Java8新的日期时间类的学习(二)

    示例11 在Java中如何判断某个日期是在另一个日期的前面还是后面 这也是实际项目中常见的一个任务.你怎么判断某个日期是在另一个日期的前面还是后面,或者正好相等呢?在Java 8中,LocalDate ...

  5. python面试--转载

    一, 面的是一家上海的创业公司,地址比较偏远,找了半天,过去的时候还发现他们在搬家,心想,创业公司真不容易啊,什么都要自己来. 期间他问到了我的Python基础知识,我答得支支吾吾,各种不确定,还有被 ...

  6. TPO1-3 Timberline Vegetation on Mountains

    Wind velocity also increase with altitude and may cause serious stress for trees,as is made evident ...

  7. python使用geopandas和shapely处理shp文件

    一.环境搭建 所需库:geopandas (以及前置库)  doc:http://geopandas.org/ shapely(以及前置库)  doc: 二.数据预处理 1.将shp文件进行切片 2. ...

  8. 16)用了session会话技术

    为什么用session会话技术? 因为假如你进入后台,不可能随意进入,即使你的验证通过了,那么还需要一个变量来存一个标志,假如标志的值是yes,那么我们可以直接进入后台的首页,无需验证,但是,标志是n ...

  9. 用JSON报的一个错误java.lang.ClassNotFoundException: org.apache.commons.lang.exception.NestableRuntimeExcep

    以前在做项目的时候就曾接触过JSON的技术,但那个时候是项目经理把所有该配制的都配了,工具类也提供了,如何使用也跟我们说了,那个时候只是觉得很好用,倒没有研究过. 今天自己写了一个JSON的例子,可以 ...

  10. fiddler模拟返回响应数据

    通过find查找修改指定内容 选择find a file 保存后重新发起请求