zoukankan      html  css  js  c++  java
  • javascript jsonp

    ajax在使用中会受到同源策略限制,当目标url的协议,域名,端口之一与脚本所在文档不一致时就不能访问并获取数据。解决这一问题的方案有很多:

    1. 服务器端代理
    2. 跨域资源共享
    3. 通过含有src属性的元素请求资源:,<script>,<iframe>,<img>

    其中jsonp属于第三种。主要思路是:

    1. 在请求文档中编写好对请求数据进行处理的回调函数
    2. 通过<script>请求需要的数据并以参数形式告知服务器,支持jsonp的服务器在响应时返回以json作为参数的函数调用表达式
    3. 在服务器端接收回调函数名并生成对应字符串
    4. 客户端收到服务器返回的字符串然后调用

    下面是一个简单的例子。服务器端使用普通jsp文件

     1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
     2 
     3 <%
     4     String users = "[{"name": "zhao", "age": "24"},"
     5                   + "{"name": "qian", "age": "24"},"
     6                   + "{"name": "sun",  "age": "24"},"
     7                   + "{"name": "li",   "age": "24"}"
     8                                 +"]";
     9     String callback = request.getParameter("callback");
    10     
    11     if (callback == null)
    12     {
    13         out.println(users);
    14     } // end if
    15     else
    16     {
    17         out.println(callback + "(" + users + ")");
    18     } // end else
    19 
    20 %>

    客户端使用普通html

     1 <!doctype html>
     2 <html lang="zh">
     3 <head>
     4     <meta charset="utf-8">
     5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     6     <meta name="description" content="">
     7     <meta name="author" content="">
     8     
     9     <title>Template Index</title>
    10     
    11 </head>
    12 <body>
    13 <h1 id="jsonp">json-p</h1>
    14 <div id="container">
    15 </div>
    16   <script>
    17     var showUsers = function (list)
    18     {
    19       var container = document.getElementById("container");
    20       list.forEach(function (d, i) {
    21         var item = document.createElement("p");
    22         item.innerHTML = "id: " + i + "  name:  " +d.name + " age: " + d.age;
    23         container.appendChild(item);
    24       });
    25     }; // end showUsers()
    26     
    27     window.addEventListener("load", function () {
    28       var url = "http://localhost:8080/ajax/userList.jsp"; // 根据实际url设置
    29       var jsonp = document.getElementById("jsonp");
    30       
    31       jsonp.addEventListener("click", function () {
    32         var script = document.createElement("script");
    33         script.src = url + "?callback=showUsers";
    34         var head = document.getElementsByTagName("body")[0];
    35         head.appendChild(script);
    36       });
    37     });
    38 
    39   </script>
    40 </body>
    41 </html>

    相比跨源资源共享和服务器端代理jsonp相对简单,也存在一定缺点:

    1. script标签的局限性使得只支持GET方法
    2. 缺少对传输的状态控制
  • 相关阅读:
    分析存储过程重编译的起因以及避免
    存储过程重编译的优点、缺点、确定引发语句
    运用计划缓冲的建议
    查询计划Hash和查询Hash
    执行计划的重用
    执行计划组件、组件、老化
    执行计划的生成
    统计的基本操作语法 <第五篇>
    javascript 之 location.href、跨窗口调用函数
    git 删除远程分支和本地分支
  • 原文地址:https://www.cnblogs.com/qiudeqing/p/3434047.html
Copyright © 2011-2022 走看看