美文网首页
Jsonp学习笔记

Jsonp学习笔记

作者: 青年心路 | 来源:发表于2019-08-03 10:23 被阅读0次
一、Jsonp简介
1.什么是Jsonp

Jsonp(JSON with Padding)是json的一种“使用模式”,可以让网页从别的域名(网站)获取资料,即跨域读取数据。
为什么从不同的域名(网站)访问数据需要Jsonp呢?,这是因为同源策略的存在。

2.什么是跨域

跨域是指一个域(网站)下的文档或脚本试图去请求另一个域(网站)下的资源


image.png
3.同源策略

同源策略/SOP(Same origin policy)是一种规定,由Netscape公司在1995年引入浏览器,它是浏览器最核心也是最基本的安全功能,现在所有支持JavaScript的浏览器都会使用这个策略。如果缺少了同源策略,浏览器很容易收到XSS、CSFR等攻击。所谓同源是指”协议+域名+端口“三者相同,即便两个不同的域名指向同一个ip地址,也非同源。

3.1 非同源策略限制以下几种行为:
  • Cookie、LocalStorage 和 IndexDB 无法读取
  • DOM和JS对象无法获得
  • AJAX请求不能发送
4.常见跨域场景
image.png
5.解决跨域方案
  • 通过jsonp跨域
  • document.domain + iframe跨域
  • location.hash + iframe
  • window.name + iframe 跨域
  • postMessage 跨域
  • 跨域资源共享(CORS)
  • nginx 代理跨域
  • nodejs 中间件代理跨域
  • WebSocket 协议跨域
6.Jsonp的优缺点
优点:

它不像XMLHttpRequest对象实现的Ajax请求那样受同源策略限制,它的兼容性很好,不需要 XMLHttpRequest 或ActiveX 的支持;并且在请求完毕后可以通过调用 callback 的方式回传结果。

缺点:

它只支持 GET 请求而不支持 POST 等其它类型的 HTTP 请求。它只支持跨域 HTTP 请求这种情况,不能解决不同域的两个页面之间如何进行 JavaScript 调用的问题。

二、Jsonp的使用
1.搭建跨域场景
1.1 需求
  • 创建两个web工程,名为jsonDemo1(8080)、jsonDemo2(9090)
  • jsonDemo1 中提供一个 index.jsp。
  • 在 jsonDemo1 的 index.jsp 中通过 jQuery 的 Ajax 跨域请求 jsonDemo2
  • jsonDemo2 中使用 springMVC 处理请求,返回一个 json 对象
  • 在 jsonDemo1 中将返回的结果插入到 index.jsp 中
1.2 创建项目

jsonDemo1


image.png

jsonDemo2


image.png
2.使用jsonp解决跨域
2.1 常见跨域异常
image.png
2.2 ajax请求要改变
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script src="js/jquery.js"></script>
    <script>
        $(function () {
            $('#btn').click(function () {

                $.ajax({
                    type:'get',
                    url:'http://localhost:9090/user/findUser',
                    dataType:'jsonp',
                    jsonp:'callback',
                    success:function (data) {
                        var str = "";
                        for (var i = 0; i < data.length; i++) {
                            str += data[i].userId +" "+ data[i].userName +" "+data[i].userAge + "  ";
                        }
                        console.log(str);
                        $('#show').html(str);
                    }
                });
            })
        })
    </script>
</head>
<body>
    <span id="show">
        <input type="button" value="ok" id="btn">
    </span>
</body>
</html>
2.3 Controller也要改变
@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/findUser")
    @ResponseBody
    public String findUser(String callback){
        User user1 = new User(1,"admin",20);
        User user2 = new User(2,"tom",22);
        User user3 = new User(3,"alice",21);
        List<User> list = new ArrayList<>();
        list.add(user1);
        list.add(user2);
        list.add(user3);
        String json = JsonUtils.objectToJson(list);
        //callback({id:1,name:admin.age:20})
        return callback + "("+json+")";
    }
}
3.SpringMVC对Jsonp的支持
注意:需要导入jackson的jar包
    @RequestMapping("/findUser")
    @ResponseBody
    public Object findUser(String callback){
        User user1 = new User(1, "admin", 20);
        User user2 = new User(2, "tom", 22);
        User user3 = new User(3, "alice", 21);
        List<User> list = new ArrayList<>();
        list.add(user1);
        list.add(user2);
        list.add(user3);
        //json 转换
        MappingJacksonValue mv = new MappingJacksonValue(list);
        mv.setJsonpFunction(callback);

        return mv;
    }

相关文章

  • Jsonp学习笔记

    一、Jsonp简介 1.什么是Jsonp Jsonp(JSON with Padding)是json的一种“使用模...

  • JSONP学习笔记

    1. parseInt(n,10) 以10进制的方式把字符串n转换为整型 2. git 回到以前的状态 3. 随机...

  • 2019-02-20

    关于跨域总结 学习笔记 成长必要条件 -jsonp -cors 后端提供 res.setHeader('Acce...

  • 2018-11-19

    ### JsonP学习

  • jsonp原理学习笔记

    一、什么是jsonp 1)浏览器的同源策略:浏览器出于安全考虑具有跨域的安全限制,即限制从一个源加载的文档或脚本与...

  • CORS & JSONP 学习笔记一

    什么是跨域? 首先,现代浏览器为了安全,做了一个同源限制. 也就是所谓的同源安全策略. 本质上,其实是不存在所谓的...

  • JSONP、JQuery发送AJAX、JSONP请求

    1.JSONP 2.JQuery发送AJAX、JSONP请求 1.JSONP JSONP利用JavaScript...

  • JS-18day

    1、jsonp公开接口 2、jQuery-jsonp 3、jsonp

  • 2018-12-10

    节点操作 ajax jsonp jQuery-jsonp jsonp公开接口

  • jsonp原理

    模拟jsonp原理 servlet 测试 http://localhost/jq/jsonp.jsp JSONP ...

网友评论

      本文标题:Jsonp学习笔记

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