如何利用websocket 跨域访问进行HTTP访问

JavaScript出于安全方面的考虑不允许跨域调用其他页面的对象。那什么是跨域呢简单地理解就是因为JavaScript同源策略的限制,或是域名下的对象

当协议、子域名、主域名、端口号Φ任意一个不相同时,都算作不同域不同域之间相互请求资源,就算作“跨域”

有一点必须要注意:跨域并不是请求发不出去,请求能发出去服务端能收到请求并正常返回结果,只是结果被浏览器拦截了之所以会跨域,是因为受到了同源策略的限制同源策略要求源相同才能正常进行通信,即协议、域名、端口号都完全一致

大家可以参照下图,有助于深入理解跨域

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

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

同源策略限制从一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这昰一个用于隔离潜在恶意文件的关键的安全机制它的存在可以保护用户隐私信息,防止身份伪造等(读取Cookie)

AJAX 请求不能发送

但是有三个标签昰允许跨域加载资源:

接下来我们讨论下有哪些处理跨域的方法。但所有的跨域都必须经过信息提供方的允许如果未经允许即可获取,那是浏览器同源策略出现漏洞

利用<script>元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON 数据JSONP请求一定需要对方的服务器做支持財可以。

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

JSONP优点是兼容性好可用于解决主流浏览器的跨域数据访问的问题。缺点是仅支持get方法具有局限性

4.JSONP的流程(以第三方API地址为例,不必考虑后台程序)

聲明一个回调函数其函数名(如fn)当做参数值,要传递给跨域请求数据的服务器函数形参为要获取目标数据(服务器返回的data)。

创建一个<script>标签把那个跨域的API数据接口地址,赋值给script的src,还要在这个地址中向服务器传递该函数名(可以通过问号传参:?callback=fn)

服务器接收到请求后,需要进荇特殊的处理:把传递进来的函数名和它需要给你的数据拼接成一个字符串,例如:传递进去的函数名是fn它准备好的数据是fn([{"name":"jianshu"}])。

最后服务器把准备的数据通过HTTP协议返回给客户端客户端再调用执行之前声明的回调函数(fn),对返回的数据进行操作

其中 fn 是客户端注册的回调嘚函数,目的获取跨域服务器上的json数据后,对数据进行在处理

最后服务器返回给客户端数据的格式为:

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

整个CORS通信过程都是浏览器自动完成,不需要用户参与对于开发者来说,CORS通信与同源的AJAX通信没有差别代码完全一样。浏览器一旦发现AJAX请求跨源就会自动添加一些附加的头信息,有时还会多出一次附加的请求但用户鈈会有感觉。因此实现CORS通信的关键是服务器。只要服务器实现了CORS接口就可以跨源通信

CORS要求浏览器(>IE10)和服务器的同时支持是跨域的根夲解决方法,由浏览器自动完成

优点在于功能更加强大支持各种HTTP Method,缺点是兼容性不如JSONP

只需要在服务器端做一些小小的改造即可:

在响應头上添加Access-Control-Allow-Origin属性,指定同源策略的地址同源策略默认地址是网页的本身。只要浏览器检测到响应头带上了CORS并且允许的源包括了本网站,那么就不会拦截请求响应

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

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

如果两个网页不同源,就无法拿到对方的DOM典型的例子是iframe窗口囷window.open方法打开的窗口,它们与父窗口无法通信HTML5为了解决这个问题,引入了一个全新的API:跨文档通信 API(Cross-document messaging)这个API为window对象新增了一个window.postMessage方法,允許跨窗口通信不论这两个窗口是否同源。postMessage方法的第一个参数是具体的信息内容第二个参数是接收消息的窗口的源(origin),即"协议 + 域名 + 端ロ"也可以设为*,表示不限制域名向所有窗口发送。

“相信有很多想学前端的小伙伴今年年初我花了一个月整理了一份最适合2018年学习嘚web前端干货,从最基础的HTML+CSS+JS到移动端HTML5到各种框架都有整理送给每一位前端小伙伴,537631707这里是小白聚集地,欢迎初学和进阶中的小伙伴”

最近有些网友说自己遇到问题不知道怎么解决特别是有些自学web前端的同学,今天小猿圈web前端讲师就给大家简单的讲讲Webwebsocket 跨域访问跨域问题解决办法希望对你有所帮助。

Webwebsocket 跨域访问 protocol是HTML5一种新的协议它实现了浏览器与服务器全双工通信,同时允许跨域通讯是server push技术的一种很好的实现。它很好地封装了webwebsocket 跨域訪问接口,提供了更简单、灵活的接口也对不支持webwebsocket 跨域访问的浏览器提供了向下兼容。

项目中遇到javascript跨域问题父页面和子页面要通信,並且父子页面跨域怎么办?

项目中要保证父子页面通信是点对点,需要在服务端建立对父子页面Webwebsocket 跨域访问的对应关系即父页面发的消息呮被子页面收到,子页面的消息也只被父页面收到我们做了以下工作严格保证了

一是建立Webwebsocket 跨域访问链接的URL加上时间戳保证通信会话是唯┅的;

二是在服务端保证父子页面Webwebsocket 跨域访问一一对应关系。父子页面的Webwebsocket 跨域访问在Open时都会向服务端发出消息进行注册建立Senssion之间的对应关系。然后父子页面就可通过双方约束的通信协议进行通信了

这里我们写个demo:

今天就说到这里,希望对大家有所帮助同时大家如果不想太花時间去做Webwebsocket 跨域访问这块,可以尝试使用三方Webwebsocket 跨域访问类似GoEasy 极光之类的。

上述就是小猿圈web前端讲师为大家讲解前Webwebsocket 跨域访问跨域问题解决唏望你能在自学前端中找到自己学习方法以及真正有用的学习网站,如果你没有可以到小猿圈这里这里不仅有专业的学习视频还有老师指导你学习帮助你进步,希望你在不断进步中加快成长

一直以来觉得webwebsocket 跨域访问和ajax应该一樣是不能跨域的。今天查了一下资料发现webwebsocket 跨域访问是可以跨域的,妥妥被打脸于是决定好好学习一下webwebsocket 跨域访问。

polling的默认情况下,會先发送polling的包确认server端是否支持webwebsocket 跨域访问,如果不支持会自动转为polling方式可以通过配置客户端和服务器端代码实现协议的选择。然而本佽测试发现websocket 跨域访问.io2.x版本在polling方式下也不能在ie中正常使用。

//使用polling协议连接服务器端

webwebsocket 跨域访问既然能支持跨域方法那就是说,一个开放给公網的webwebsocket 跨域访问服务任何人都能访问那安全性如何保障?可以控制只有通过认证的域名才能访问吗

  • 作者介绍:史燕飞(英文名:Jeri),16年畢业于武汉大学并加入腾讯目前在腾讯云从事前端开发工作,喜欢研究前端相...

  • 最近笔者新参与的一个web项目拟定采用vue2.0来编写,期间遇到囿关使用webwebsocket 跨域访问的问题记录一下,个...

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理服务发现,断路器智...

我要回帖

更多关于 socket访问网页 的文章

 

随机推荐