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. mysql挖掘与探索------第2章 索引1-1

    1索引作用 说起提高数据库性能,索引是最物美价廉的东西了.不用加内存,不用改程序,不用调sql,只要执行个正确的’create index’,查询速度就可能提高百倍千倍,这可真有诱惑力.可是天下没有免 ...

  2. [SDOI2006] 线性方程组

    洛谷 P2455 传送门 刚开始写了个消成上三角的,结果狂wa. 后来经过研究发现,消成上三角那种不能直接判断无解或无穷多解,需要其它的操作. 所以干脆学了个消成对角线的,写了一发A了. 其实两种消元 ...

  3. 吴裕雄--天生自然python学习笔记:Python3 迭代器与生成器

    迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退 ...

  4. Java - 面向对象练习 - market

    Marketpackage market; public class Market {    private String marname;    private Product[] producta ...

  5. 几个简单又实用的PHP函数

    简单方便使用: /** * 将多维数组转为一维数组 * @param array $arr * @return array */ function ArrMd2Ud($arr) { #将数值第一元素作 ...

  6. Scarpy框架安装教程

    在一切之前,建议升级pip,如果版本太低,安装会失败 升级pip命令: python -m pip install --upgrade pip 如果上面的命令不能用,用下面这个 easy_instal ...

  7. SpringMVC之请求响应(上)

    1.OutPutController package com.tz.controller; import java.util.Map; import org.springframework.stere ...

  8. CentOS7使用firewalld管理防火墙与端口

    firewalld的基本使用 启动: systemctl start firewalld 关闭: systemctl stop firewalld 查看状态: systemctl status fir ...

  9. js数组中重复的对象去重

    var arr = [{ "name": "ZYTX", "age": "Y13xG_4wQnOWK1QwJLgg11d0pS4h ...

  10. Simplifying Conditional Expressions(简化条件表达式)

    1.Decompose Conditional(分解条件表达式) 2.Consolidate Conditional Expressions(合并条件表达式) 3.Consolidate Duplic ...