美文网首页
jsonp原理

jsonp原理

作者: wanggs | 来源:发表于2018-06-09 23:21 被阅读0次

模拟jsonp原理

<%@ page import="java.util.List" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>

<script type="text/javascript">
    function callback(user) {
        alert("hello,"+user.name)
    }
</script>
<script type="text/javascript" src="/jsonp?method=callback"></script>
</body>
</html>

servlet

package com.wanggs.web.jq;


/**
 * @author Wgs
 * @version 1.0
 * @create:2018/06/04
 */
@WebServlet("/jsonp")
public class JsonpServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("application/json;charset=UTF-8");
       String method = req.getParameter("method");

        User user = new User("tom",12);
        String json = JSON.toJSONString(user);
        Writer out = resp.getWriter();
        out.append(method+"("+json+")");
        out.flush();
        out.close();

    }
}

测试

http://localhost/jq/jsonp.jsp

callback({"age":12,"name":"tom"})

JSONP

<%@ page import="java.util.List" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>

<button id="btn">JSONP</button>

<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>


<script>
    $("#btn").click(function () {
        $.getJSON("/jsonp?method=?").done(function (data) {
            alert(data.name)
        }).error(function () {
            alert("系统错误!")

        });

    });
</script>

</body>
</html>

<%@ page import="java.util.List" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>

<button id="btn">JSONP</button>

<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>


<script>
    $("#btn").click(function () {



        $.ajax({
            url     : '/jsonp?method=?',
            type    : 'GET',
            dataType: 'jsonp', // 表示要用 JSONP 进行跨域访问
            success : function(data) {
                alert(data.name)
            }
        });
    });
</script>
</body>
</html>
image.png image.png

jsonp调用有道api

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
<input type="text" id="word"> <button id="btn">翻译</button>
<div id="result"></div>
<script src="/static/js/jquery-1.11.3.min.js"></script>
<script>
    $(function(){
        $("#btn").click(function () {
            $("#result").html("");

            var word = $("#word").val();
            var url = "http://fanyi.youdao.com/openapi.do?keyfrom=kaishengit&key=1587754017&type=data&doctype=jsonp&callback=?&version=1.1&q="+word;
            $.getJSON(url).done(function(data){
                var array = data.basic.explains;
                for(var i =0;i< array.length;i++) {
                    $("<p></p>").text(array[i]).appendTo($("#result"));
                }
            }).error(function(){
                alert("服务器异常");
            });

        });
    });
</script>
</body>
</html>

fastJson JSONPObject

package com.wanggs.web.jq;


/**
 * @author Wgs
 * @version 1.0
 * @create:2018/06/04
 */
@WebServlet("/jsonp")
public class JsonpServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("application/json;charset=UTF-8");

        // 必须是callback: jQuery33101920591678805521_1528275197482
        String method = req.getParameter("callback");
        User user = new User("tom",12);
        JSONPObject jsonp = new JSONPObject(method);
        jsonp.addParameter(user);
        Writer out = resp.getWriter();
        out.append(jsonp.toJSONString());
        out.flush();
        out.close();

    }
}

image.png

script

       $.ajax({
            url     : '/jsonp',
            type    : 'GET',
            dataType: 'jsonp', // 表示要用 JSONP 进行跨域访问
            success : function(data) {
                alert(data.name+"--->>"+data.age)
            }
        });

SpringMvc

服务器端:

  • 使用 produces 设置响应的 Content-Type
  • 返回 JSONP 格式的字符串,例如jQuery21107523536464367151_1492668511201("Goo")
import com.alibaba.fastjson.JSONPObject;
@GetMapping(value="/jsonp-test", produces="application/javascript;charset=UTF-8")
@ResponseBody
public String jsonpTest(@RequestParam String callback) {
    JSONPObject jsonp = new JSONPObject(callback);
    jsonp.addParameter("Goo"); // 或则 Object
    return jsonp.toString();
}

浏览器端

$.ajax({
    url     : 'http://127.0.0.1:8080/jsonp-test',
    type    : 'GET',
    dataType: 'jsonp', // 表示要用 JSONP 进行跨域访问
    success : function(data) {
        console.log(data);
    }
});

相关文章

网友评论

      本文标题:jsonp原理

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