跨域的三种解决方式

跨域问题

跨域问题对于WEB前端工程师来说是比较重要的一个问题,因为我们时常需要去解决这样的问题,在其他类型的前端开发来说,他们并没有跨域问题

跨域问题的产生

因为浏览器有同源策略:只有在同域名,同端口,同协议的情况下才可以进行数据交互;

有的时候,例如,在公司开发项目的时候,前端开发的服务器可能和后端服务器不是同一个,因为可能是通过gulp、webpack搭建的开发服务器,就需要解决跨域问题,再例如,在大公司有,数据服务器不只有一个,所以跨域问题也必然存在

解决方法

jsonp

是一种前后端结合的跨域方式,原理就是通过script标签的src属性来进行数据请求,因为其不受同源策略的影响,故而能请求到数据,需要注意的是,数据处理需要通过回调函数来进行,而本质上,我们把回调函数的名字告诉后端,后端将数据放入到回调函数里,所以说需要告知后端,回调函数是什么,这也就是为什么说是前后端结合的方式。

注意:一个script只能请求一次,多次请求应该去动态的创建script,回调函数也只能使用一次,所以也需要动态创建 ,使用完成后移除,避免污染全局空间

缺点:只能get请求

nodejs:

app.get(‘/data‘, function (req, res) {

//后端的任务,就是把数据放到前端的那个函数里并给它执行一下

//直接返回这个操作的js字符串,因为这个字符串会被script当成js代码来运行

//前端回调函数的名字

let fn = req.query[‘callback‘]

var content = fs.readFileSync(‘./datas/data.json‘)+‘‘

//返回给前端函数数据

res.send(fn+‘(‘+content+‘)‘);

});

js:

Jsonp({

url:"http://localhost:3000/data",

success(results){

console.log(results)

}

})

function Jsonp({url,success}) {

//动态创建script标签

let $script = $("<script>")

//随机函数名字

var random_name = ‘random_fn_‘+Date.now()

//创建的随机全局函数

window[random_name] = function(data){

success(data)

//处理完数据之后,将script删掉,函数delete掉

$script.remove()

delete window[random_name]

}

$script[0].src = url+‘?callback=‘+random_name

$("body").append($script)

}

cors

纯后端的解决方式,每次请求都会有一个origin信息被后端捕捉,后端可以通过设置对这个origin的域允许访问来解决跨域问题

node:

app.get("/data_cors",(req,res)=>{

//此次请求的源信息

var reqOrigin = req.header("origin");

//如果源信息存在,且源是运行访问的

if(reqOrigin !=undefined && reqOrigin.indexOf("http://localhost:9000") > -1){

//设置允许 http://localhost:3000 这个域响应

res.header("Access-Control-Allow-Origin", "http://localhost:9000");  //允许这个域访问

res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");  //允许的请求方法

res.header("Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With");

}

res.send(‘123‘)

})

js:

$.ajax({

url:"http://localhost:3000/data_cors",

success(results){

console.log(results)

}

})

服务端代理proxy

因为服务器间的数据交互没有跨域限制,所以我们可以通过一个中间代理服务器来请求目标服务器的数据,也就是开发服务器发送请求到代理服务器,代理服务器再请求目标服务器,将数据返回给开发服务器

目标服务器接口 3000:

app.get("/data_proxy",(req,res)=>{

//此次请求的源信息

res.send(‘proxy‘)

})

代理服务器1234:

app.get("/to3000",(req,res)=>{

//代理服务器1234对9000做跨域处理

var reqOrigin = req.header("origin");

//如果源信息存在,且源是运行访问的

if(reqOrigin !=undefined && reqOrigin.indexOf("http://localhost:9000") > -1){

//设置允许 http://localhost:3000 这个域响应

res.header("Access-Control-Allow-Origin", "http://localhost:9000");  //允许这个域访问

res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");  //允许的请求方法

res.header("Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With");

}

//获取到9000真正要调用的3000目标服务器的接口

var url = req.query[‘url‘]

let _res = res

//代理服务器1234像目标服务器3000发送请求(没有跨域限制)

http.get(url,(res)=>{

let result=‘‘

res.on("data",(chunk)=>{

result+=chunk

})

res.on("end",()=>{

console.log(result)

//代理服务器1234将请求到的目标服务器3000的数据返回给开发服务器9000

_res.send(result)

})

})

})

app.listen(1234);

开发服务器9000:

//当前服务器9000向代理服务器1234发送请求

$.ajax({

url:"http://localhost:1234/to3000",

data:{

url:"http://localhost:3000/data_proxy"

},

success(results){

console.log(results)

}

})

时间: 2024-10-11 18:37:44

跨域的三种解决方式的相关文章

AJAX实现跨域的三种方法

转 由于在工作中需要使用AJAX请求其他域名下的请求,但是会出现拒绝访问的情况,这是因为基于安全的考虑,AJAX只能访问本地的资源,而不能跨域访问. 比如说你的网站域名是aaa.com,想要通过AJAX请求bbb.com域名中的内容,浏览器就会认为是不安全的,所以拒绝访问. 会出现跨域问题的几种情况: 后台在百度上寻找解决方案解决了这个问题,一共总结出三种方案:代理.JSONP.XHR2(XMLHttpRequest Level 2). 第一种方法 代理:这种方式是通过后台(ASP.PHP.Ja

相对URL:协议名跨域的一种处理方式

问题现象 当页面地址协议与页面内请求地址协议不一致(不都是https或不都是http)时,往往请求会被拦截.控制台提示: 原因 浏览器对于JavaScript的同源策略的限制,简言之就是我们常说的跨域. 处理 处理跨域的方式有很多,对于前端而言,JSONP是不错的选择.但现阶段,大多数第三方平台会同时提供https和http两种协议下的可访问资源地址,尤其是CDN资源,那么处理这种这种跨域的简单方法来了:相对URL.相对URL使用更加模糊的语法,如:  1 <script src='//xxx.

GET方式提交中文编码问题以及三种解决方式

GET方式提交在WEB中是非常常用的方式,有时候我们在使用GET方式提交请求不得不提交中文,但是TOMCAT等容器对于GET方式的编码问题总是让人折腾. 先说说流程吧: 我们的内容使用GET方式发送,就会在URL后面带上内容,在游览器发来的请求经过了游览器的URI编码,发送到服务器这边,如果是struts2会经过拦截器进行URI解码,并且使用"iso8859-1"进行编码,因为传输过程是二进制的. 这时候想解决中文编码问题有三种方式 假设: url:http://localhost:8

什么是跨域 &amp; 跨域的3种解决方案

所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)端口号(port) 同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源. 同源策略是浏览器安全的基石 同源策略会阻止一个域的 javascript 脚本和另外一个域的内容进行交互.例如办公内外网环境,当我们访问外网一个恶意网站的时候,恶意网站就会利用我们的主机向内网的 url 发送 ajax 请求,破坏或盗取数据 一.浏览器的非同源限制以及3种解决思路 非同源限制 无

Ajax跨域请求以及乱码解决

Ajax跨域请求2种解决方法 1 ) 什么叫跨域请求,协议,域名,端口号,其中一样不同都称跨域; 第一种:使用script标签发送请求; //创建一个script标签; var v_element=document.createElement("script"); //设置script的type 属性; v_element.type="text/javascript"; //设置src属性; v_element.src="http://127.0.0.1:

解决浏览器跨域的几种方式

1.什么是跨域问题 在页面中使用js访问其他网站的数据时,就会出现跨域问题,比如在网站中使用ajax请求其他网站的天气.快递或者其他数据接口时,以及hybrid app中请求数据,浏览器会提     示一下错误: XMLHttpRequest cannot load http://你请求的域名. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://当前页的域  

vue开发环境和生产环境里面解决跨域的几种方法

  跨域指浏览器不允许当前页面的所在的源去请求另一个源的数据.源指协议,端口,域名.只要这个3个中有一个不同就是跨域. 这里列举一个经典的列子: #协议跨域 http://a.baidu.com访问https://a.baidu.com: #端口跨域 http://a.baidu.com:8080访问http://a.baidu.com:80: #域名跨域 http://a.baidu.com访问http://b.baidu.com:   现在很多公司都是采用前后分离的方式开发.那么出现经常和会

php跨域的几种方式

PHP实现跨域的几种形式 1.JSONP(JSON with padding)原理 利用html里面script标签可以加载其他域下的js这一特性,使用script src的形式来获取其他域下的数据,但是,因为是通过标签引入的,所以,会将请求到的JSON格式的数据作为js去运行处理,显然这样运行是不行的. 因此,就需要提前将返回的数据包装一下,封装成函数进行运行处理,函数名通过接口传参的方式传给后台,后台解析到函数名后在原始数据上包裹这个函数名,发送给前端.(JSONP 需要对应接口的后端的配合

ASP.NET中Cookie跨域的问题及解决代码

ASP.NET中Cookie跨域的问题及解决代码 http://www.liyumei.net.cn/post/share18.html Cookies揭秘  http://www.cnblogs.com/zhangziqiu/archive/2009/08/06/cookies-javascript-aspnet.html 最近在项目开发中遇到一个很棘手的问题,一个用户在顶级域名登录后,跳转到自己所拥有的二级域名下管理二级网站时,cookie丢失了,一直找解决办法找了整整两天,百度谷歌一大堆,