proxyie,有什么计算机经典书籍推荐

伏羲号

proxyie,有什么计算机经典书籍推荐?

朋友,你渴望力量么。机械工业引进的黑皮书系列,你值得收藏。这些板砖书无论是用来垫显示器还是桌子腿,都是非常好的选择。

proxyie,有什么计算机经典书籍推荐

当然啃下来比较吃力。评论区有些杠说这些不适合初学者,题目问题的是计算机经典书籍,这些书很多都是评价颇高的名校本科和研究生教材,笔者并没有答非所问。

多看看老外写的书跟上人家的教育水平还是很好的,国内很多计算机教材相比老外的书差距不是一点半点。国内有些高校应该也用到了美帝大学的一些教材。国内很多用谭浩强的入门教材学习 C,说真的,他的书错误百出,代码风格非常不好,一看就是没做过工程的,你应付一下考试还行。相比之下《C primer plus》《K & R》c/unix 之父合著的 c 语言书是比较经典的。

老外的书有时候很厚,看着吓人,但其实很多还是比较深入浅出的,算法导论之类的网上有免费公开课,就是算导的作者讲的,可以看看。如果有畏难心理,可以坚持每天或者每周看一本书的几小节或者一个章节,慢慢啃啃长期坚持下来也是能消化不少的。

(列举了这么多,俺没有一本能认真读完的)。以下是笔者分类整理的计算机科学/工程领域的经典书籍(可以参考豆瓣评分),你可以针对自己想要从事的方向来挑选一些经典书籍看看。

C语言:

C程序设计语言(原书第2版·新版 典藏版)

C Primer Plus 第6版 中文版

c++:

C++ Primer(中文版 第5版)

C++程序设计语言特别版十周年中文纪念版

Java:

Java四大名著四册套 java编程思想

Python:

流畅的Python [巴西]卢西亚诺·拉马略(Luciano Ra*lho)

Go:

Go程序设计语言

算法与数据结构:

算法导论(原书第3版) 华章图书 计算机科学丛书

算法(第4版)

数据库(Mysql):

数据库系统概念(原书第6版)

高性能MySQL

编译原理:

计算机科学丛书:计算机程序的构造和解释

计算机科学丛书:编译原理(第2版)

计算机组成原理/体系结构:

深入理解计算机系统(原书第3版)

计算机体系结构精髓(原书第2版)

操作系统:

现代操作系统(原书第4版)

计算机网络:

计算机网络:自顶向下方法(原书第7版)

TCP/IP详解 卷1:协议(原书第2版)

UNIX 网络编程:第3版

分布式系统:

分布式系统:概念与设计(原书第5版)

数据密集型应用系统设计

软件工程/设计模式:

代码大全(第2版)

设计模式:可复用面向对象软件的基础(典藏版)

实际上前边列举的书籍很多是世界名校的本科/研究生教材或者工程领域的经典书籍。但是可能因为不同的人基础不同,学习实践方法不同,学习难度和收获也不一样。比如你想看 c 语言之父合著的《C 程序设计语言》,里边有一些涉及到命令行操作,可能就需要你有一定的 unix/linux 操作系统的基础知识(比如命令行工具 gcc 等的基本使用)等。

学完了python能做什么工作?

发现大家对python了解不是特别多,因此总结了python的5大用处,帮助你python学习之后,能正确选择方向。

1、Web开发

提到web开发,大家脑海中闪现的一定是当前主流的开发语言Java,但你可能想不到的是python也可以做web开发,他由于开发迅速、部署飞快,变更起容易,代码量小深受开发者的喜爱,并且还有强大的框架来进行web开发。最经典的Django、Flask、Tornado,使程序员快速开发复杂的代码和应用,开发高质量的web程序。我们的金主知乎、豆瓣、Google、YouTube等企业均将python作为主要的开发语言,怎么样强大吧!!!

2、自动化运维

随着公司的发展、业务需求的持续并快速地增长,往往一个运维工程师通常要管理成百上千台服务器,运维工作变得重复、繁杂。那么将运维工作自动化,把运维工程师从服务器的管理中解放出来,让运维工作变得简单、快速、准确,这是使用python来做的持续高效的事,那么为什么选择Python呢,一来,大部分的开源运维工具都是由纯Python编写的,如Celery、ansible、Paramiko、airflow等,二来,Python与其他语言相比,更加优雅、明确和简单。

3、数据分析/可视化

作为数据分析的一大利器--Python,除了自身语言简洁高效易上手的优点,还有许多强大的功能。

支持非常多的库用于分析需求:Pandas:一个强大的分析结构化数据的工具集,基础是 Numpy(提供高性能的矩阵运算);可以从各种文件格式比如 CSV、JSON、SQL、Microsoft Excel 导入数据;可以对各种数据进行运算操作,比如归并、再成形、选择,还有数据清洗和数据加工特征。NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。NumPy 是一个运行速度非常快的数学库,主要用于数组计算,包含:一个强大的N维数组对象 ndarray;广播功能函数;整合 C/C++/Fortran 代码的工具;线性代数、傅里叶变换、随机数生成等功能。Matplotlib 是 Python 的绘图库。 它可与 NumPy 一起使用,提供了一种有效的方法 MatLab 开源替代方案。 它也可以和图形工具包一起使用,如 PyQt 和 wxPython。

4、网络爬虫

浏览网页时,发现好多对我们有用的数据,但怎样从互联网上抓取对于我们有价值的信息呢,这个时候我们需要一款利器—python,比如:豆瓣的推荐电影列表、社区留言、音乐软件评论等

5、机器学习

机器学习是一类算法的总称,这些算法企图从大量历史数据中挖掘出其中隐含的规律,并用于预测或者分类,更具体地说,机器学习可以看作是寻找一个函数,输入是样本数据,输出是期望的结果,只是这个函数过于复杂,以至于不太方便形式化表达,机器学习的算法包括神经网络、深度学习、支持向量机及随机森林,基本道理和上述相似,应用场景很多:例如推荐系统、人脸识别及语音识别等。

对于机器学习库和Python框架,scikit-learn和TensorFlow算是两个比较热门的。下面是scikit-learn中文学习网站,大家可以访问学习

如何高效阅读源代码?

下面是之前写的一篇文章:《如何快速阅读源码》

本文探讨在需要了解一个开源项目时,如何快速的理清开源项目的代码逻辑!

以下是个人认为行之有效的方法:

先「跑起来」自顶向下拆解深入细节延伸改进

本文以Mybatis为例来进行演示!

先“跑起来”

程序界有个老传统,学习新技术时都是从「Hello World」开始的!无论是学习新语言时,打印「Hello World」;还是学习新框架时编写个demo!那为什么这里的「跑起来」要打个引号呢?

实际上,当你想要阅读一个开源项目的源码时,绝大部分情况下,你已经能够使用这个开源项目了!所以这里的“跑起来”就不是写个「Hello World」,也不是能跑起来的程序了!而是能__在你的脑子里「跑起来」__!什么意思?

Mybatis你会用了吧?那么请问Mybatis是如何执行的呢?仔细想想,你能否用完整的语句把它描述出来?

这里是Mybatis的官方入门文章!你是如何看这篇文章的?读一遍就行了吗?还是跟着文章跑一遍就够了吗?从这篇文章里你能获得多少信息?

我们来理一下:

安装如何在项目中引入Mybatis?Mybatis的groupId是什么?artifactId又是什么?目前最新版本是多少?从 XML 中构建 SqlSessionFactorySqlSessionFactoryBuilder可以通过xml或者Configuration来构建SqlSessionFactory,那是如何构建的呢?xml配置了哪些信息?既然使用了xml,那肯定有xml解析,用什么方式解析的?xml里的标签都是什么意思:configuration,environments,transactionManager,dataSource,mappers。以及这些标签的属性分别是什么意思?SqlSessionFactory的作用是什么?不使用 XML 构建 SqlSessionFactoryBlogDataSourceFactory,DataSource,TransactionFactory,Environment,Configuration这些类的作用是什么?*Mapper的作用是什么?为什么提供基于XML和Java的两种配置方式?这两种配置方式的优缺点是什么?从 SqlSessionFactory 中获取 SqlSessionSqlSession的作用是什么?selectOne和getMapper的执行方式有什么区别?探究已映射的 SQL 语句*Mapper.xml的配置是什么?命名空间,id的作用是什么?*Mapper.xml是如何和*Mapper.java进行匹配的?匹配规则是什么?基于注解的映射配置如何使用?为什么提供基于XML和基于注解的两种映射配置?有什么优劣?作用域(Scope)和生命周期SqlSessionFactoryBuilder应该在哪个作用域使用?为什么?SqlSessionFactory应该在哪个作用域使用?为什么?SqlSession应该在哪个作用域使用?为什么?Mapper实例应该在哪个作用域使用?为什么?

回答出了上面这些问题!你也就基本能在脑子里把Mybatis「跑起来」了!之后,你才能正真的开始阅读源码!

当你能把一个开源项目「跑起来」后,实际上你就有了对开源项目最初步的了解了!就像「书的索引」一样!基于这个索引,我们一步步的进行拆解,来细化出下一层的结构和流程,期间可能需要深入技术细节,考量实现,考虑是否有更好的实现方案!也就是说后面的三步并不是线性的,而是__不断交替执行__的一个过程!最终就形成一个完整的源码执行流程!

自顶向下拆解

继续通过Mybatis来演示(限于篇幅,我只演示一个大概流程)!我们现在已经有了一个大概的流程了:

SqlSessionFactoryBuilder通过xml或者Configuration构建出SqlSessionFactory可以从SqlSessionFactory中获取SqlSessionSqlSession则是真正执行sql的类

虽说每个点都可以往下细化,但是也分个轻重缓急!

我们是先了解怎么构建SqlSessionFactory呢?还是了解如何获取SqlSession呢?还是了解SqlSession如何执行sql的呢?

很明显,SqlSession去执行 sql才是Mybatis的核心!我们先从这个点入手!

首先,你当然得先下载Mybatis的源码了(请自行下载)!

我们直接去看SqlSession!它是个接口,里面有一堆执行sql的方法!

这里只列出了一部分方法:

SqlSession就是通过这些方法来执行sql的!我们直接看我们常用的,也是Mybatis推荐的用法,就是基于Mapper的执行!也就是说「SqlSession通过Mapper来执行具体的sql」!上面的流程也就细化成了:

SqlSessionFactoryBuilder通过xml或者Configuration构建出SqlSessionFactory可以从SqlSessionFactory中获取SqlSessionSqlSession则是真正执行sql的类SqlSession获取对应的Mapper实例Mapper实例来执行相应的sql

那SqlSession是如何获取Mapper的呢?Mapper又是如何执行sql的呢?

深入细节

我们来看SqlSession的实现!SqlSession有两个实现类SqlSessionManager和DefaultSqlSession!通过IDE的引用功能可以查看两个类的使用情况。你会发现SqlSessionManager实际并没有使用!而DefaultSqlSession是通过DefaultSqlSessionFactory构建的!所以我们来看DefaultSqlSession是如何构建Mapper的!

它直接委托给了Configuration的getMapper方法!

Configuration又委托给了MapperRegistry类的getMapper方法!

在MapperRegistry类的getMapper中:

通过type从knownMappers中获取对应的MapperProxyFactory实例如果不存在则抛出异常如果存在则调用mapperProxyFactory.newInstance(sqlSession)创建对应的Mapper

在这里knowMappers是什么?MapperProxyFactory又是什么?mapperProxyFactory.newInstance(sqlSession)具体做了什么?

其实很简单,knowMappers是个Map,里面包含了class与对应的MapperProxyFactory的对应关系!MapperProxyFactory通过newInstance来构建对应的Mapper(实际上是Mapper的代理)!

快接近真相了,看mapperProxyFactory.newInstance(sqlSession)里的代码:

这里干了什么?

通过sqlSession,mapperInterface和methodCache构建了一个MapperProxy对象然后通过Java的动态代理,来生成了Mapper的代理类将Mapper方法的执行都委托给了MapperProxy去执行如果是Object里的方法则直接执行否则执行MapperMethod的execute方法

最终实际还是委托给了sqlSession去执行具体的sql!后面具体怎么实现的就自行查看吧!

延伸改进

现在我们的流程大概是这样的一个过程:

SqlSessionFactoryBuilder通过xml或者Configuration构建出SqlSessionFactory可以从SqlSessionFactory中获取SqlSessionSqlSession则是真正执行sql的类SqlSession获取对应的Mapper实例DefaultSqlSession.getMapperConfiguration.getMapperMapperRegistry.getMappermapperProxyFactory.newInstance(sqlSession)通过sqlSession,mapperInterface和methodCache构建了一个MapperProxy对象然后通过Java的动态代理,来生成了Mapper的代理类Mapper实例来执行相应的sql将Mapper方法的执行都委托给了MapperProxy去执行如果是Object里的方法则直接执行否则执行MapperMethod的execute方法最终还是委托给sqlSession去执行sql

现在我们大概知道了:

为什么Mapper是个接口了Mybatis基于这个接口做了什么

那么,

什么是动态代理(基础哦)?为什么使用动态代理来处理?基于动态代理有什么优点?又有什么缺点?除了动态代理,还有其它什么实现方式吗?比如说cglib?如果是其它语言的话,有没有什么好的实现方式呢?......

这个问题列表可以很长,可以按个人需要去思考并尝试回答!可能最终这些问题已经和开源项目本身没有什么关系了!但是你思考后的收获要比看源码本身要多得多!

再循环

一轮结束后,可以再次进行:

自顶向下拆解深入细节延伸改进

不断的拆解->深入->改进,最终你能__通过一个开源项目,学习到远比开源项目本身多得多的知识__!

最重要的是,你的流程是完整的。无论是最初的大致流程:

SqlSessionFactoryBuilder通过xml或者Configuration构建出SqlSessionFactory可以从SqlSessionFactory中获取SqlSessionSqlSession则是真正执行sql的类

还是到最终深入的细枝末节,都是个完整的流程!

这样的好处是,你的时间能自由控制:

你是要花个半天时间,了解大致流程还是花个几天理解细节流程还是花个几周,几个月来深入思考,不断延伸你都可以从之前的流程中快速进行下去!

而不像debug那样的方式,需要一下子花费很长的时间去一步步的理流程,费时费力、收效很小,而且如果中断了就很难继续了!

总结

本文通过梳理Mybatis源码的一个简单流程,来讲述一个个人认为比较好的阅读源码的方式,并阐述此方法与传统debug方式相比的优势。

win7桌面工具栏如何不让文件夹叠着?

方法一:

右击任务栏空白处,弹出菜单选择“属性”。

在窗口中的任务栏按钮右边选择“从不合并”。

点击“确定”完成操作。

方法二:

1、使用快捷键“windows+R”(windows键就是键盘上带有“windows窗口图标”的键),出现“运行”,输入“cmd”,点击确定(注意:你必须拥有管理员权限)。

2、弹出“命令行窗口”界面。

3、在命令行中输入:regsvr32 "%SystemRoot%\System32\actxprxy.dll",然后点击回车键,在出现:DllRegisterServer在C:\WINDOWS\System32\actxprxy.dll已成功。

4、在命令行中再输入:regsvr32 "%ProgramFiles%\Internet Explorer\ieproxy.dll",然后点击回车键,出现:DllRegisterServer在C:\ProgramFiles\Internet Explorer\ieproxy.dll已成功。

5、重新打开文件夹,就可以在同一个窗口打开了。

跨域的实现方式有哪些?

一、什么是跨域?1.什么是同源策略及其限制内容?同源策略是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSRF等攻击。所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源。同源策略限制内容有:

Cookie、LocalStorage、IndexedDB 等存储性内容DOM 节点AJAX 请求发送后,结果被浏览器拦截了但是有三个标签是允许跨域加载资源:

<img src=XXX><link href=XXX><script src=XXX>2.常见跨域场景当协议、子域名、主域名、端口号中任意一个不相同时,都算作不同域。不同域之间相互请求资源,就算作“跨域”。

特别说明两点:

第一:如果是协议和端口造成的跨域问题“前台”是无能为力的。

第二:在跨域问题上,仅仅是通过“URL的首部”来识别而不会根据域名对应的IP地址是否相同来判断。“URL的首部”可以理解为“协议, 域名和端口必须匹配”。

这里你或许有个疑问:请求跨域了,那么请求到底发出去没有?

跨域并不是请求发不出去,请求能发出去,服务端能收到请求并正常返回结果,只是结果被浏览器拦截了。你可能会疑问明明通过表单的方式可以发起跨域请求,为什么 Ajax 就不会?因为归根结底,跨域是为了阻止用户读取到另一个域名下的内容,Ajax 可以获取响应,浏览器认为这不安全,所以拦截了响应。但是表单并不会获取新的内容,所以可以发起跨域请求。同时也说明了跨域并不能完全阻止 CSRF,因为请求毕竟是发出去了。

二、跨域解决方案1.jsonp1) JSONP原理利用 <script> 标签没有跨域限制的漏洞,网页可以得到从其他来源动态产生的 JSON 数据。JSONP请求一定需要对方的服务器做支持才可以。

2) JSONP和AJAX对比JSONP和AJAX相同,都是客户端向服务器端发送请求,从服务器端获取数据的方式。但AJAX属于同源策略,JSONP属于非同源策略(跨域请求)

3) JSONP优缺点JSONP优点是简单兼容性好,可用于解决主流浏览器的跨域数据访问的问题。缺点是仅支持get方法具有局限性,不安全可能会遭受XSS攻击。

4) JSONP的实现流程声明一个回调函数,其函数名(如show)当做参数值,要传递给跨域请求数据的服务器,函数形参为要获取目标数据(服务器返回的data)。创建一个<script>标签,把那个跨域的API数据接口地址,赋值给script的src,还要在这个地址中向服务器传递该函数名(可以通过问号传参:?callback=show)。服务器接收到请求后,需要进行特殊的处理:把传递进来的函数名和它需要给你的数据拼接成一个字符串,例如:传递进去的函数名是show,它准备好的数据是show('我不爱你')。最后服务器把准备的数据通过HTTP协议返回给客户端,客户端再调用执行之前声明的回调函数(show),对返回的数据进行操作。在开发中可能会遇到多个 JSONP 请求的回调函数名是相同的,这时候就需要自己封装一个 JSONP函数。

上面这段代码相当于向http://localhost:3000/say?wd=Iloveyou&callback=show这个地址请求数据,然后后台返回show('我不爱你'),最后会运行show()这个函数,打印出'我不爱你'

5) jQuery的jsonp形式JSONP都是GET和异步请求的,不存在其他的请求方式和同步请求,且jQuery默认就会给JSONP的请求清除缓存。

2.corsCORS 需要浏览器和后端同时支持。IE 8 和 9 需要通过 XDomainRequest 来实现。

浏览器会自动进行 CORS 通信,实现 CORS 通信的关键是后端。只要后端实现了 CORS,就实现了跨域。

服务端设置Access-Control-Allow-Origin 就可以开启 CORS。 该属性表示哪些域名可以访问资源,如果设置通配符则表示所有网站都可以访问资源。

虽然设置 CORS 和前端没什么关系,但是通过这种方式解决跨域问题的话,会在发送请求时出现两种情况,分别为简单请求和复杂请求。

1) 简单请求只要同时满足以下两大条件,就属于简单请求

条件1:使用下列方法之一:

GETHEADPOST条件2:Content-Type 的值仅限于下列三者之一:

text/plainmultipart/form-dataapplication/x-www-form-urlencoded请求中的任意 XMLHttpRequestUpload 对象均没有注册任何事件监听器; XMLHttpRequestUpload 对象可以使用 XMLHttpRequest.upload 属性访问。

2) 复杂请求不符合以上条件的请求就肯定是复杂请求了。复杂请求的CORS请求,会在正式通信之前,增加一次HTTP查询请求,称为"预检"请求,该请求是 option 方法的,通过该请求来知道服务端是否允许跨域请求。

我们用PUT向后台请求时,属于复杂请求,后台需做如下配置:

接下来我们看下一个完整复杂请求的例子,并且介绍下CORS请求相关的字段

上述代码由http://localhost:3000/index.html向http://localhost:4000/跨域请求,正如我们上面所说的,后端是实现 CORS 通信的关键。

3.postMessagepostMessage是HTML5 XMLHttpRequest Level 2中的API,且是为数不多可以跨域操作的window属性之一,它可用于解决以下方面的问题:

页面和其打开的新窗口的数据传递多窗口之间消息传递页面与嵌套的iframe消息传递上面三个场景的跨域数据传递postMessage()方法允许来自不同源的脚本采用异步方式进行有限的通信,可以实现跨文本档、多窗口、跨域消息传递。

otherWindow.postMessage(message, targetOrigin, [transfer]);

message: 将要发送到其他 window的数据。targetOrigin:通过窗口的origin属性来指定哪些窗口能接收到消息事件,其值可以是字符串"*"(表示无限制)或者一个URI。在发送消息的时候,如果目标窗口的协议、主机地址或端口这三者的任意一项不匹配targetOrigin提供的值,那么消息就不会被发送;只有三者完全匹配,消息才会被发送。transfer(可选):是一串和message 同时传递的 Transferable 对象. 这些对象的所有权将被转移给消息的接收方,而发送一方将不再保有所有权。接下来我们看个例子:http://localhost:3000/a.html页面向http://localhost:4000/b.html传递“我爱你”,然后后者传回"我不爱你"。

4.websocketWebsocket是HTML5的一个持久化的协议,它实现了浏览器与服务器的全双工通信,同时也是跨域的一种解决方案。WebSocket和HTTP都是应用层协议,都基于 TCP 协议。但是 WebSocket 是一种双向通信协议,在建立连接之后,WebSocket 的 server 与 client 都能主动向对方发送或接收数据。同时,WebSocket 在建立连接时需要借助 HTTP 协议,连接建立好了之后 client 与 server 之间的双向通信就与 HTTP 无关了。

原生WebSocket API使用起来不太方便,我们使用Socket.io,它很好地封装了webSocket接口,提供了更简单、灵活的接口,也对不支持webSocket的浏览器提供了向下兼容。

我们先来看个例子:本地文件socket.html向localhost:3000发生数据和接受数据

5. Node中间件代理(两次跨域)实现原理:同源策略是浏览器需要遵循的标准,而如果是服务器向服务器请求就无需遵循同源策略。代理服务器,需要做以下几个步骤:

接受客户端请求 。将请求 转发给服务器。拿到服务器 响应 数据。将 响应 转发给客户端。我们先来看个例子:本地文件index.html文件,通过代理服务器http://localhost:3000向目标服务器http://localhost:4000请求数据。

上述代码经过两次跨域,值得注意的是浏览器向代理服务器发送请求,也遵循同源策略,最后在index.html文件打印出{"title":"fontend","password":"123456"}

6.nginx反向代理实现原理类似于Node中间件代理,需要你搭建一个中转nginx服务器,用于转发请求。

使用nginx反向代理实现跨域,是最简单的跨域方式。只需要修改nginx的配置即可解决跨域问题,支持所有浏览器,支持session,不需要修改任何代码,并且不会影响服务器性能。

实现思路:通过nginx配置一个代理服务器(域名与domain1相同,端口不同)做跳板机,反向代理访问domain2接口,并且可以顺便修改cookie中domain信息,方便当前域cookie写入,实现跨域登录。

先下载nginx,然后将nginx目录下的nginx.conf修改如下:

最后通过命令行nginx -s reload启动nginx

7.window.name + iframewindow.name属性的独特之处:name值在不同的页面(甚至不同域名)加载后依旧存在,并且可以支持非常长的 name 值(2MB)。

其中a.html和b.html是同域的,都是http://localhost:3000;而c.html是http://localhost:4000

b.html为中间代理页,与a.html同域,内容为空。

总结:通过iframe的src属性由外域转向本地域,跨域数据即由iframe的window.name从外域传递到本地域。这个就巧妙地绕过了浏览器的跨域访问限制,但同时它又是安全操作。

8.location.hash + iframe实现原理: a.html欲与c.html跨域相互通信,通过中间页b.html来实现。 三个页面,不同域之间利用iframe的location.hash传值,相同域之间直接js访问来通信。

具体实现步骤:一开始a.html给c.html传一个hash值,然后c.html收到hash值后,再把hash值传递给b.html,最后b.html将结果放到a.html的hash值中。同样的,a.html和b.html是同域的,都是http://localhost:3000;而c.html是http://localhost:4000

9.document.domain + iframe该方式只能用于二级域名相同的情况下,比如 a.test.com 和 b.test.com 适用于该方式。只需要给页面添加 document.domain ='test.com' 表示二级域名都相同就可以实现跨域。

实现原理:两个页面都通过js强制设置document.domain为基础主域,就实现了同域。

我们看个例子:页面a.zf1.cn:3000/a.html获取页面b.zf1.cn:3000/b.html中a的值

三、总结CORS支持所有类型的HTTP请求,是跨域HTTP请求的根本解决方案JSONP只支持GET请求,JSONP的优势在于支持老式浏览器,以及可以向不支持CORS的网站请求数据。不管是Node中间件代理还是nginx反向代理,主要是通过同源策略对服务器不加限制。日常工作中,用得比较多的跨域方案是cors和nginx反向代理

发表评论

快捷回复: 表情:
AddoilApplauseBadlaughBombCoffeeFabulousFacepalmFecesFrownHeyhaInsidiousKeepFightingNoProbPigHeadShockedSinistersmileSlapSocialSweatTolaughWatermelonWittyWowYeahYellowdog
评论列表 (暂无评论,78人围观)

还没有评论,来说两句吧...