-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
浏览器跨域问题 #30
Comments
JSONP利用 JSONP 优点是简单兼容性好,可用于解决主流浏览器的跨域数据访问的问题。缺点是仅支持 JSONP 实现流程:
// index.html
function jsonp({ url, params, callback }) {
return new Promise((resolve, reject) => {
let script = document.createElement('script')
// 把要执行的函数名传递到服务端,服务端回传一个对该函数的调用(同时附带需要处理的参数)
window[callback] = function(data) {
resolve(data)
document.body.removeChild(script)
}
params = { ...params, callback } // wd=b&callback=show
let arrs = []
for (let key in params) {
arrs.push(`${key}=${params[key]}`)
}
script.src = `${url}?${arrs.join('&')}`
document.body.appendChild(script)
})
}
jsonp({
url: 'http://localhost:3000/say',
params: { wd: 'Iloveyou' },
callback: 'show'
}).then(data => {
console.log(data)
}) // server.js
const url = require('url')
const http = require('http')
const app = http.createServer((req, res) => {
const urlObj = url.parse(req.url)
console.log('urlObj', urlObj)
const query = urlObj.query.split('&').map(v => ({ [v.split('=')[0]]: v.split('=')[1] }))
console.log('query', query)
// 服务端返回 show('a cat '),这样浏览器就会执行在浏览器中注册的函数
res.end(`${query[1].callback}('a cat ')`)
})
app.listen(3333)
console.log('listening')
// urlObj Url {
// protocol: null,
// slashes: null,
// auth: null,
// host: null,
// port: null,
// hostname: null,
// hash: null,
// search: '?wd=Iloveyou&callback=show',
// query: 'wd=Iloveyou&callback=show',
// pathname: '/say',
// path: '/say?wd=Iloveyou&callback=show',
// href: '/say?wd=Iloveyou&callback=show' }
// query [ { wd: 'Iloveyou' }, { callback: 'show' } ] |
CORS(跨域资源共享)简单请求浏览器将 CORS 请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)。 只要符合下面条件的都是简单请求:
对于简单请求,浏览器直接发出CORS请求。具体来说,就是在头信息之中,增加一个Origin字段。
如果Origin指定的域名在许可范围内,服务器返回的响应,会多出几个头信息字段。
withCredentials上面说到,CORS请求默认不发送Cookie和HTTP认证信息。如果要把Cookie发到服务器,一方面要服务器同意,指定
另一方面,开发者必须在AJAX请求中打开
如果要发送Cookie, 非简单请求非简单请求是那种对服务器有特殊要求的请求,比如请求方法是 非简单请求的CORS请求,会在正式通信之前,增加一次HTTP查询请求,称为"预检"请求(preflight)。 浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些HTTP动词和头信息字段。只有得到肯定答复,浏览器才会发出正式的XMLHttpRequest请求,否则就报错。 "预检"请求用的请求方法是
CORS与JSONP的使用目的相同,但是比JSONP更强大。 JSONP只支持 |
websocketWebSocket 和HTTP都是应用层协议,都基于 TCP 协议。但是 WebSocket 是一种双向通信协议,在建立连接之后,WebSocket 的 server 与 client 都能主动向对方发送或接收数据。同时,WebSocket 在建立连接时需要借助 HTTP 协议,连接建立好了之后 client 与 server 之间的双向通信就与 HTTP 无关了。 服务端 // app.js
const WebSocket = require('ws')
const wss = new WebSocket.Server({ port: 3333 })
wss.on('connection', function(ws) {
console.log('connection')
ws.on('message', function(data) {
console.log('message')
console.log(data)
ws.send('我不爱你')
ws.send(JSON.stringify({ name: 'lxfriday' }))
})
})
console.log('listening 3333') 页面 <script>
let socket = new WebSocket('ws://localhost:3333')
socket.onopen = function() {
socket.send('我爱你') // 向服务器发送数据
}
socket.onmessage = function(e) {
console.log(e)
console.log(e.data) //接收服务器返回的数据
}
</script> |
postMessage
otherWindow.postMessage(message, targetOrigin, [transfer]);
<iframe src="http://localhost:5000/b.html" frameborder="0" id="frame" onload="load()"></iframe> //等它加载完触发一个事件
<script>
function load() {
let frame = document.getElementById('frame')
frame.contentWindow.postMessage('我爱你', 'http://localhost:5000') //发送数据
window.onmessage = function(e) {
//接受返回数据
console.log(e.data) // 我不爱你
}
}
</script>
<script>
// b.html
window.onmessage = function(e) {
console.log(e)
console.log(e.data) // 我爱你
// e.origin => http://localhost:53355
e.source.postMessage('我不爱你', e.origin)
}
</script> |
二次代理 |
No description provided.
The text was updated successfully, but these errors were encountered: