资讯专栏INFORMATION COLUMN

【跨域】跨域的简易实现和测试

ninefive / 1812人阅读

摘要:前言由于自己平时只做做,并没有遇到太多跨域问题,今天通过几个样例模拟实现了几种跨域方式。

前言

由于自己平时只做做demo,并没有遇到太多跨域问题,今天通过几个样例模拟实现了几种跨域方式。原文地址 传送门

本文所有样例静态服务器基于nodejs实现,代码亲测可用。测试步骤如下:

1.为了实现跨域访问的效果,需要下载http-server 作为一个服务器 npm install http-server。用来挂载静态页面 index.html 。(访问http://127.0.0.1:8080 显示index.html页面)
2.运行node创建的静态服务器node server (node搭建静态服务向下翻)

JSONP跨域 JSONP实现跨域原理

说道跨域可能最先想到就时 jsonp ,实现原理为:同源策略只限制浏览器的行为而不限制js,所以可以将请求写到 script 标签中。关键代码如下:


前端发出跨域请求数据后,服务端去解析该请求:

const data={...}
const callback = req.parse(req.url,true).query.callback
res.writeHead(200)

//最关键的一步,拼接回调函数和作为函数参数的数据data
res.end(`${callback}(${JSON.stringfy(data)})`)

浏览器接收到服务端返回的响应,由于发起请求的是script,相当于直接调用方法并传入参数

具体实现案例

(服务端代码,node.js)

const url = require("url");

require("http").createServer((req, res) => {
    const data = {
        x: 10
    };
    const callback = url.parse(req.url, true).query.callback
    res.writeHead(200);
    //回调原页面上函数处理返回结果
    res.end(`${callback}(${JSON.stringify(data)})`);

}).listen(3000, "127.0.0.1");
console.log("服务器已启动...");

(前端)



    
        
        
    
    
        
        
    
 
JSONP解决Ajax跨域问题

如果是采用js原生,可以参考传送门

CORS跨域

实现CORS跨域的思想为:CORS通信和Ajax同源请求没有区别,关键在于服务端的配置。要想实现CORS通信,服务端必须要设置一个自定义头Access-Control-Origin:""来允许跨域访问

(样例仅做了一个最简单的GET请求demo服务端代码)

require("http").createServer((req,res)=>{
    res.writeHead(200,{
        "Access-Control-Allow-Origin":"http://127.0.0.1:8080"
    })
    res.end("这是来自端口3000的信息,收好了~")
}).listen(3000,"127.0.0.1")

(前端代码)



    
        
        
    
    
    
    

cors实现跨域的优点是不但能实现 GET , POST 等简单请求,还能实现 PUT 等非简单请求跨域

ServerProxy服务器代理

ServerProxy服务器代理实现跨域的核心思想是:将跨域请求操作发送给服务端,由服务端代为请求,然后将请求结返回过来
这里以获取 CNode:Node.js专业中文社区 论坛上一些数据为场景。如通过 https://cnodejs.org/api/v1/to...,当时因为不同域,所以你可以将请求后端,让其对该请求代为转发。

const url = require("url")
const http = require("http")
const https = require("https")

const server = http.createServer((req,res)=>{
    const path = url.parse(req.url).path.slice(1)
    if(path==="topics"){
        https.get("https://cnodejs.org/api/v1/topics", (resp) => {
            let data=""
            resp.on("data",chunk=>{
                data+=chunk
            })
            resp.on("end",()=>{
                res.writeHead(200,{
                    "Content-Type":"application/json;charset=utf-8"
                })
                res.end(data)
            })
        })
    }
}).listen(3000,"127.0.0.1")

console.log("服务器已启动...");
postMessage

postMessage是HTML5新增的一项功能,postMessage() 方法允许来自不同源的脚本采用异步方式进行有限通信可以实现跨文本文档,多窗口,跨域消息传递。
利用postMessage不能和服务端交换数据,只能在两个窗口

(创建recieve.html文件)



    
        
        
    
    
        
    

安全性: postMessage 采用的是 双向安全机制 。发送方发送数据时,会确认接收方的源,而监听方监听到 message 事件后,也可以用 event.origin 判断是否来自于正确可靠的发送方

webSocket实现跨域

websocket是一中全双工通信协议,该协议不实行同源政策,只要服务器支持,就可以通过它进行跨源通信
websocket的应用实例:https://segmentfault.com/a/11...

document.domain

对于主域相同跨子域的情况,可以通过设置 document.domain 来解决。具体做法是在 example.com/a.html 和 sub.example.com/b.html 两个文件分别加上 document.domain = example.com
然后通过a.html 文件创建一个iframe,去控制iframe的 window,从而进行交互

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/91801.html

相关文章

  • 前端跨域方法论

    摘要:说明是否允许通讯同一域名允许同一域名下的不同文件夹允许不同端口号不允许不同协议不允许不同域名不允许主域相同,子域不同不允许跨域解决方案由于浏览器同源策略是允许标签这样的跨域资源嵌套的,所以标签的资源不受同源策略的限制。 前言 本着学习和总结的态度写的技术输出,文中有任何错误和问题,请大家指出。更多的技术输出可以查看我的 github博客。 整理了一些前端的学习资源,希望能够帮助到有需要...

    leejan97 评论0 收藏0
  • javaweb服务端跨域支持

    摘要:跨域是浏览器拦截了服务器端返回的相应,不是拦截了请求。通过来实现跨域使用来实现跨域可以解决下不能跨域的问题,仅仅支持请求服务端多加一个参数,在返回数据时用把具体的数据包裹起来,传回前端。 项目开发为了支持web浏览器ajax的直接请求,涉及到了跨域的需求,通过学习对跨域有了更深入的认识,现在总结一下: 1.跨域说明 跨域指请求和服务的域不一致,浏览器和H5的ajax请求有影响,而对服务...

    kycool 评论0 收藏0
  • javaweb服务端跨域支持

    摘要:跨域是浏览器拦截了服务器端返回的相应,不是拦截了请求。通过来实现跨域使用来实现跨域可以解决下不能跨域的问题,仅仅支持请求服务端多加一个参数,在返回数据时用把具体的数据包裹起来,传回前端。 项目开发为了支持web浏览器ajax的直接请求,涉及到了跨域的需求,通过学习对跨域有了更深入的认识,现在总结一下: 1.跨域说明 跨域指请求和服务的域不一致,浏览器和H5的ajax请求有影响,而对服务...

    dadong 评论0 收藏0
  • zuul实现Cors域的两种方式(https)

    摘要:大家都知道可以通过实现跨域。第一种方式在服务下添加一个实现跨域,实现起来方便。前端服务和后端服务在同一台服务器上,服务调用服务时,服务通过负载均衡进入服务时时,服务的请求跨域成功,时,服务的请求跨域失败。 大家都知道spring boot 可以通过@CrossOrigin实现跨域。但是在spring cloud 里,如果要粒度那么细的去控制跨域,这个就太繁琐了,所以一般来说,会在路由z...

    wuaiqiu 评论0 收藏0
  • AJAX 跨域解析

    摘要:这里只讲解了两种常见的跨域方式,因为存在一些弊端,因此推荐使用等方式来解决跨域问题。 一、什么是 AJAX 跨域问题 同源策略规定,AJAX 请求(XMLHttpRequest)只能发给同源的网址,否则就会出错。所谓的同源策略是指 3 个相同:协议相同、域名相同、端口相同。 比如 http://www.example.com/index.html 这个网址,协议是http ,域名是 w...

    tinylcy 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<