IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 跨域解决方案之—JSONP -> 正文阅读

[大数据]跨域解决方案之—JSONP

JSONP, JSON with Padding,是前端解决跨域的方案,  利用<script> 的src没有跨域限制的例外来实现跨域访问。

跨域禁止的模拟示例

  • 安装两个tomcat, 端口分别是8080和9090
  • 在两个tomcat 的webapps下分别创建一个应用目录"jsonp",在8080端口的页面访问9090端口的页面, 因为端口不同, 属于跨域状况。
    步骤:
  1. 在8080端口创建jsonp目录, 在该目录创建index.html, 内容如下:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8">
  <title>JSONP</title>
  <script  type="text/javascript">
    function handleClick(){

       var url = "http://localhost:9090/jsonp/index.jsp";
       var xhr = new XMLHttpRequest();
       xhr.onreadystatechange = function() {
            if (xhr.readyState == 4 && xhr.status == 200) {
                    alert( xhr.responseText );
            }
        };
        xhr.open('get', url, true);
        xhr.send(); 
    }
  </script>
  </head>
  <body>
      <button id="btn" onclick="handleClick()">Click Me</button>
  </body>
</html>

在该页面中,点击按钮使用Ajax调用9090的某个页面。

  1. 在9090端口创建jsonp目录, 在该目录创建index.jsp, 内容如下:
<%
     String callbackfunc = request.getParameter("callbackfunc");
     out.print(callbackfunc+"([{ name:'Oscar999',age:'18'}]);");
     out.flush();
%>

这里的jsp页面返回一个字符串。

  1. 运行的效果如下:
    在这里插入图片描述

如预期, 因为跨域,所以不能访问。

JSONP的解决示例

因为<script> 的src没有跨域限制,将8080端口的index.html 修改如下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8">
  <title>JSONP</title>
  <script type="text/javascript">  
    function myCallBackFunc(result){   
       alert(result[0].name);   
    }   
    </script>
    <script type="text/javascript" src="http://localhost:9090/jsonp/index.jsp?callbackfunc=myCallBackFunc"></script>
  </head>
  <body>
  </body>
</html>

因为http://localhost:9090/jsonp/index.jsp?callbackfunc=myCallBackFunc 返回的字符串是myCallBackFunc([{ name:'Oscar999',age:'18'}]);, 所以上面的

<script type="text/javascript" src="http://localhost:9090/jsonp/index.jsp?callbackfunc=myCallBackFunc">
</script>

其实也就等效于:

<script type="text/javascript">
myCallBackFunc([{ name:'Oscar999',age:'18'}]);
</script>

myCallBackFunc()这个函数是在index.html定义的一个函数, 上面的JavaScript代码其实就是用后端返回的JSON格式数据作为参数, 执行这个函数, 执行的效果如下:

在这里插入图片描述

本篇示例代码和环境

本篇演示的环境和示例代码可以到以下地址下载:

https://download.csdn.net/download/oscar999/83976534

步骤是:
1. 解压上面压缩档
2. 进入tomcat9-1的bin目录,点击startup.bat启动服务器1
3. 进入tomcat9-2的bin目录,点击startup.bat启动服务器2
4. 进入 http://localhost:8080/jsonp/index.html 演示跨域访问禁止
5. 进入http://localhost:8080/jsonp/index2.html 演示JSONP实现跨域访问

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-03-10 22:36:15  更:2022-03-10 22:39:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 8:27:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码