在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

Spring 4.1+JSONP的使用指南

2016-7-29 15:37| 发布者: zhangjf| 查看: 619| 评论: 0

摘要: JSONP就是为了解决这一问题的,JSONP是英文JSON with Padding的缩写,是一个非官方的协议。他允许服务端生成script tags返回值客户端,通过javascript callback的形式来实现站点访问。JSONP是一种script tag的注入,将se ...

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

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

如今的巨石应用已经越来越不行了,很多互联网在后期都会在用分布式的架构

那么在页面上不同的服务调用不同域名下的json是有问题的

(跨域:不同域名,相同域名但是不同端口)

JavaScript规范中提到的json是不能直接跨域调用,为了安全,但是能调用js片段

所以把json包装为一个js片段,也就是jsonp那么就能够跨域请求

在spring4.1后,提供了新的方法可以作为jsonp的调用

例:

  1. @RequestMapping(value="/list")
  2. @ResponseBody
  3. public Object getItemCatList(String callback) {
  4. ItemCatResult result = itemCatService.getItemCatList();
  5. if (StringUtils.isBlank(callback)) {
  6. //需要把result转换成字符串
  7. return result;
  8. }
  9. //如果字符串不为空,需要支持jsonp调用 spring4.1 以上可用
  10. MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(result);
  11. mappingJacksonValue.setJsonpFunction(callback);
  12. return mappingJacksonValue;
  13. }
复制代码

如图,这就是jsonp

那么只要在js需要调用jsonp的地方稍加处理就能够跨域调用数据了~

做了个例子,用来在页面上展示jsonp:

(js写的丑了点,本人后端出生,前端大侠们轻拍~)

  1. var Menu = function () {
  2. return {
  3. getMenuData: function (json) {
  4. console.log(json);
  5. var data = json.data;
  6. var html = "";
  7. for (var i = 0 ; i < data.length ; i ++) {
  8. var url = data[i].u;
  9. var name = data[i].n;
  10. var sub = data[i].i;
  11. html += "";
  12. html += "<li class='dropdown-submenu'>";
  13. html += "<a href='" + url + "'>" + name;
  14. html += "<span class='c-arrow c-toggler'></span>";
  15. html += "</a>";
  16. html += "<ul class='dropdown-menu c-pull-right'>";
  17. for (var j = 0 ; j < sub.length ; j ++) {
  18. var url = sub[j].u;
  19. var name = sub[j].n;
  20. var node = sub[j].i;
  21. html += "<li class='dropdown-submenu'>";
  22. html += "<a href='" + url + "'>" + name;
  23. html += "<span class='c-arrow c-toggler'></span>";
  24. html += "</a>";
  25. html += "<ul class='dropdown-menu c-pull-right'>";
  26. for (var k = 0 ; k < node.length ; k ++) {
  27. // debugger
  28. var name = node[k];
  29. var last = name.split("|");
  30. html += "<li>";
  31. html += "<a href='" + last[0] + "'>" + last[1] + "</a>";
  32. html += "</li>";
  33. }
  34. html += "</ul>";
  35. html += "</li>";
  36. }
  37. html += "</ul>";
  38. html += "</li>";
  39. }
  40. $("#itemCatMenu").html(html);
  41. },
  42. getJSONP: function (serverUrl, callbackFun) {
  43. $.ajax({
  44. type: "get",
  45. url: serverUrl,
  46. dataType: "jsonp",
  47. jsonp: "callback",
  48. jsonpCallback: callbackFun,
  49. success: function(json){
  50. // console.log(json);
  51. },
  52. error: function(e){
  53. if (e.status != "200") {
  54. console.log(e);
  55. }
  56. }
  57. });
  58. }
  59. };
  60. }();
  61. $(document).ready(function()
  62. {
  63. var serverUrl = "http://localhost:8088/rest/menu/list";
  64. Menu.getJSONP(serverUrl, "Menu.getMenuData");
  65. });
复制代码

展示的效果:


最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-5-6 10:13

Copyright 2015-2025 djqfx

返回顶部