跨域原理及实现

简介:

跨域

在讲跨域之前,先介绍一个概念—同源策略源(origin)指的是协议、域名、端口号,同源指的是在url中协议、域名、端口号均相同。那么同源策略是浏览器的一个安全功能,不同源的脚本在没有明确授权的情况下,不能读写对方资源。
跨域,是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript实施的安全限制,那么只要协议、域名、端口有任何一个不同,都被当作是不同的域。

常见跨域场景

URL 说明 是否允许通信
http://www.alibaba-inc.com/a.jshttp://www.alibaba-inc.com/b.js 同一域名 允许通信
http://www.alibaba-inc.com/a.jshttp://www.alihealth.com/a.js 主域不同 跨域,不允许通信
http://abc.alibaba-inc.com/a.jshttp://def.alibaba-inc.com/a.js 子域不同 跨域,不允许通信
http://www.alibaba-inc.com:8080/a.jshttp://www.alibaba-inc.com/a.js 端口不同 跨域,不允许通信
http://www.alibaba-inc.com/a.jshttps://www.alibaba-inc.com/a.js 协议不同 跨域,不允许通信

模拟跨域失败场景

根据同源策略,在某个服务器下的界面是无法获取到该服务器以外的数据的,基于此我们通过中间件平台生成两个tddl demo,这两个demo分别对应的url为:http://localhost:7001以及http://localhost:8080。在端口为8080的服务中通过AJAX调用端口为7001的服务:向数据库中插入name为ajax123的一条记录。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <script>
        function loadXMLDoc()
        {
            var xmlhttp;
            if (window.XMLHttpRequest)
            {
                //  IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码
                xmlhttp=new XMLHttpRequest();
            }
            else
            {
                // IE6, IE5 浏览器执行代码
                xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
            }
            xmlhttp.onreadystatechange=function()
            {
                if (xmlhttp.readyState==4 && xmlhttp.status==200)
                {
                    document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
                }
            }
            xmlhttp.open("GET","http://localhost:7001/mybatis/insert?name=ajx123",true);
            xmlhttp.send();
        }
    </script>
</head>
<body>

<div id="myDiv"><h2>使用 AJAX 请求</h2></div>
<button type="button" onclick="loadXMLDoc()">请求</button>

</body>
</html>

上述程序在运行的时候会报如下的错误:
avatar

因此通过AJAX进行跨域时是没有权限进行访问的,此时我们从数据库中也不能查找到name为ajax123的记录。

AJAX跨域方案—JSONP

JSONP(JSON with Padding) 是JSON的一种"使用模式",可以让网页从别的域名(网站)那获取资料,即跨域读取数据。
JSONP的基本原理是:在html页面中通过相应的标签从不同域名下加载静态资源文件是被浏览器允许的,所以我们可以通过这个“犯罪漏洞”来进行跨域。一般,允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。那么客户端的代码如下:

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <script type="text/javascript">
        var callFunction = function(data){
            alert(data.id + " " + data.name);
        };
    </script>

</head>
<body>
<script src="http://localhost:7001/mybatis/name?callback=callFunction"></script>
</body>
</html>

相对应的服务端需要改写控制层相对应的方法:

@RequestMapping(value = "/mybatis/name", method = RequestMethod.GET)
public @ResponseBody String queryByMyBatis(String callback) {
    Name queryResult = mybatisDemo.query();
    Gson gson = new Gson();
    return callback+"("+gson.toJson(queryResult)+")";
}

由此我们可以看到JSONP由两部分组成:回调函数和数据。回调函数是当响应到来时应该在页面中调用的函数。回调函数的名字一般是在请求中指定的。而数据就是传入回调函数中的 JSON 数据。
那么通过该方案最后运行结果会显示出查询数据库表单中的一条记录。
avatar----

目录
相关文章
|
人工智能 搜索推荐
写歌词的技巧和方法:塑造完美歌词结构的艺术,妙笔生词AI智能写歌词软件
歌词是音乐的灵魂,其结构艺术至关重要。开头需引人入胜,主体部分无论是叙事还是抒情,都应层次分明、情感丰富,结尾则需升华或留白,给人以深刻印象。《妙笔生词智能写歌词软件》提供多种AI辅助功能,助你轻松创作完美歌词,成为音乐创作的得力助手。
|
8月前
|
存储 人工智能 分布式计算
阿里云服务器实例规格选择参考:如何根据业务场景选择适合自己的实例规格
在我们购买阿里云服务器的时候,阿里云提供了众多的云服务器实例规格,满足了不同行业、不同业务场景的多样化需求。然而,面对众多的实例选择,如何根据自身的业务特性,挑选出最合适的云服务器实例规格,成为了众多用户,尤其是新手用户比较关心的问题。本文旨在通过深入剖析阿里云服务器的各类实例规格,结合具体的业务场景,为您提供一份详尽的实例规格选择指南,以供参考和选择。
|
10月前
|
安全 开发工具 git
git分布式版本控制系统及在码云上创建项目并pull和push
通过本文的介绍,我们详细讲解了Git的基本概念和工作流程,并展示了如何在码云上创建项目及进行pull和push操作。Git作为一种分布式版本控制系统,为开发者提供了强大的工具来管理代码变更和协作开发。希望本文能帮助您更好地理解和使用Git及码云,提高开发效率和代码质量。
317 16
|
运维 监控 物联网
物联网卡:如何选择物联网卡流量套餐
选择物联网卡(IoT SIM卡)的流量套餐时,需要根据设备的具体使用场景、数据需求量、成本预算以及长期扩展性等多方面因素进行综合考虑。以下是一些建议步骤,帮助你做出合适的选择:
|
小程序 算法 前端开发
微信小程序---授权登录
微信小程序---授权登录
329 0
|
数据采集 机器学习/深度学习 人工智能
阿里云魔搭社区发起ModelScope-Sora开源计划
阿里云魔搭社区在2024全球开发者先锋大会上启动ModelScope-Sora开源计划,聚焦中国多模态大模型研究,推出一站式工具链和Data-Juicer多模态数据处理系统,提升处理效率与质量。该计划还包括基础类Sora模型开源及沙盒实验室,以支持开发者迭代与训练。面对数据质量、安全、商业平衡及算力挑战,魔搭社区致力于推动AI创新,已汇聚众多模型与开发者。
1495 1
阿里云魔搭社区发起ModelScope-Sora开源计划
|
JavaScript 前端开发 API
Vue3+Vite+TypeScript常用项目模块详解
现在无论gitee还是github,越来越多的前端开源项目采用Vue3+Vite+TypeScript+Pinia+Elementplus+axios+Sass(css预编译语言等),其中还有各种项目配置比如eslint 校验代码工具配置等等,而我们想要进行前端项目的二次开发,就必须了解会使用这些东西,所以作者写了这篇文章进行简单的介绍。
382 0
Vue3+Vite+TypeScript常用项目模块详解
|
SQL 存储 OLAP
腾讯音乐基于阿里云数据库 SelectDB 版内核 Apache Doris + 大模型构建全新智能数据服务平台
Apache Doris 助力腾讯音乐构建查询高效、实时统一分析的 OLAP 引擎,为用户提供个性化、实时化、灵活化的智能数据服务平台。
1011 0
腾讯音乐基于阿里云数据库 SelectDB 版内核 Apache Doris + 大模型构建全新智能数据服务平台
|
存储 算法 JavaScript
Vue3渲染器之快速Diff算法
Vue3渲染器之快速Diff算法
424 0
感知偶然性(perceived contingency,PC)量表。
感知偶然性(perceived contingency,PC)量表。感知偶然性(Perceived Contingency,PC)量表是一种用于评估个体对事件之间关系的认知程度的量表。
383 0