同源政策与jsonp封装

63 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天,点击查看活动详情

同源政策

如果两个页面有相同的协议,域名和端口,那么这两个页面就属于同一个源

目的: 为了保证用户信息的安全,防止恶意的网站

在非同源地址发送ajax请求,如果请求,就会报错

 

使用jsonp解决同源限制问题

1.将不同源的服务器端的请求地址写在script标签的src熟悉性中

2.服务器端响应数据必须是一个函数的调用,真正要发送给客户端的数据需要作为函数调用的参数

const data = 'fn({name: "张三", age: "10"})';

res.send(data);

3.在客户端全局作用域下定义函数fn, 内部对服务器返回的数据进行处理

function fn (data) {

console.log(data);

}

 

jsonp代码优化

前端

//创建script标签

var script = document.createElement('body');

//设置src属性

script.src = 'https://localhost:3000/better?callback=fn';

//将script标签追加到页面中

doucment.body.appendChild(script);

//为scrript标签添加onload事件

script.onload = function () {

//将body中的script标签删除掉

document.body.removeChild(script)

}

后端

//接受客户端传递过来的函数的名称

const fnName = req.query.callback;

//将函数名称对应的函数调用代码返回给客户端

const result = fnName + '({name: "张三"})'

res.send(result)

 

176.封装jsonp

function jsonp (options) {

//动态创建script标签

var script = document.createElement('script);

//拼接字符串的变量

var params = '';

for(var attr in options.data) {

params += '&' + attr + '=' + options.data[attr];

}

va fnName ='myJsonp' + Math.random().toString().replace('.','')

//它不是一个全局函数,我们把它变成全局函数

window[fnName ]= options.success

//为script标签添加src属性

script.src = options.ur + '?callback=' + fnName + params ;

//将script标签追加到页面中

document.body.appendChild(script)

//为script标签添加onload事件

script.onload = function () {

document.body.removeChild(script)

}

}

 

json({

//请求地址

url: 'http: //localhost:3000/better',

data: {

name: 'lisi',

age: 30

}

success: function(data) {

console.log(data)

}

 

})

 

res.jsonp({name: 'lisi', age: 20})

 

 

cors跨域资源共享

cors 跨域资源共享,允许浏览器向跨域服务器发送Ajax请求,克服了Ajax只能同源使用的限制

Access-Control-Allow-Orign: 'http://localhost:3000'

Access-Control-Allow-origin: '*'

 

.serialize方法

作用: 将表单中的数据自动拼接成字符串类型的参数

var params = $('#form').serialize();

//name=zhangsan&age=30