±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚjobbole£¬±¾ÎÄÏêϸ½éÉÜÁËʲôÊÇ¿çÓò£¬³£¼û¿çÓò³¡¾°£¬ÒÔ¼°ÓÐÄļ¸ÖÖ¿çÓò·½Ê½µÈÏà¹ØÖªÊ¶¡£ |
|
ǰÑÔ
ǰºó¶ËÊý¾Ý½»»¥¾³£»áÅöµ½ÇëÇó¿çÓò£¬Ê²Ã´ÊÇ¿çÓò£¬ÒÔ¼°ÓÐÄļ¸ÖÖ¿çÓò·½Ê½£¬ÕâÊDZ¾ÎÄҪ̽ÌÖµÄÄÚÈÝ¡£
Ò»¡¢Ê²Ã´ÊÇ¿çÓò£¿
1.ʲôÊÇͬԴ²ßÂÔ¼°ÆäÏÞÖÆÄÚÈÝ£¿
ͬԴ²ßÂÔÊÇÒ»ÖÖÔ¼¶¨£¬ËüÊÇä¯ÀÀÆ÷×îºËÐÄÒ²×î»ù±¾µÄ°²È«¹¦ÄÜ£¬Èç¹ûȱÉÙÁËͬԴ²ßÂÔ£¬ä¯ÀÀÆ÷ºÜÈÝÒ×Êܵ½XSS¡¢CSFRµÈ¹¥»÷¡£ËùνͬԴÊÇÖ¸¡±ÐÒé+ÓòÃû+¶Ë¿Ú¡±ÈýÕßÏàͬ£¬¼´±ãÁ½¸ö²»Í¬µÄÓòÃûÖ¸Ïòͬһ¸öipµØÖ·£¬Ò²·ÇͬԴ¡£

ͬԴ²ßÂÔÏÞÖÆÄÚÈÝÓУº
Cookie¡¢LocalStorage¡¢IndexedDB µÈ´æ´¢ÐÔÄÚÈÝ
DOM ½Úµã
AJAX ÇëÇó·¢Ëͺ󣬽á¹û±»ä¯ÀÀÆ÷À¹½ØÁË
µ«ÊÇÓÐÈý¸ö±êÇ©ÊÇÔÊÐí¿çÓò¼ÓÔØ×ÊÔ´
<img src=XXX>
<link href=XXX>
<script src=XXX>
2.³£¼û¿çÓò³¡¾°
µ±ÐÒé¡¢×ÓÓòÃû¡¢Ö÷ÓòÃû¡¢¶Ë¿ÚºÅÖÐÈÎÒâÒ»¸ö²»Ïàͬʱ£¬¶¼Ëã×÷²»Í¬Óò¡£²»Í¬ÓòÖ®¼äÏ໥ÇëÇó×ÊÔ´£¬¾ÍËã×÷¡°¿çÓò¡±¡£³£¼û¿çÓò³¡¾°ÈçÏÂͼËùʾ£º

ÌØ±ð˵Ã÷Á½µã£º
µÚÒ»£ºÈç¹ûÊÇÐÒéºÍ¶Ë¿ÚÔì³ÉµÄ¿çÓòÎÊÌ⡰ǰ̨¡±ÊÇÎÞÄÜΪÁ¦µÄ¡£
µÚ¶þ£ºÔÚ¿çÓòÎÊÌâÉÏ£¬½ö½öÊÇͨ¹ý¡°URLµÄÊײ¿¡±À´Ê¶±ð¶ø²»»á¸ù¾ÝÓòÃû¶ÔÓ¦µÄIPµØÖ·ÊÇ·ñÏàͬÀ´Åжϡ£¡°URLµÄÊײ¿¡±¿ÉÒÔÀí½âΪ¡°ÐÒé,
ÓòÃûºÍ¶Ë¿Ú±ØÐëÆ¥Å䡱¡£
ÕâÀïÄã»òÐíÓиöÒÉÎÊ£ºÇëÇó¿çÓòÁË£¬ÄÇôÇëÇóµ½µ×·¢³öȥûÓУ¿
¿çÓò²¢²»ÊÇÇëÇó·¢²»³öÈ¥£¬ÇëÇóÄÜ·¢³öÈ¥£¬·þÎñ¶ËÄÜÊÕµ½ÇëÇó²¢Õý³£·µ»Ø½á¹û£¬Ö»Êǽá¹û±»ä¯ÀÀÆ÷À¹½ØÁË¡£Äã¿ÉÄÜ»áÒÉÎÊÃ÷Ã÷ͨ¹ý±íµ¥µÄ·½Ê½¿ÉÒÔ·¢Æð¿çÓòÇëÇó£¬ÎªÊ²Ã´
Ajax ¾Í²»»á?ÒòΪ¹é¸ù½áµ×£¬¿çÓòÊÇΪÁË×èÖ¹Óû§¶ÁÈ¡µ½ÁíÒ»¸öÓòÃûϵÄÄÚÈÝ£¬Ajax ¿ÉÒÔ»ñÈ¡ÏìÓ¦£¬ä¯ÀÀÆ÷ÈÏΪÕâ²»°²È«£¬ËùÒÔÀ¹½ØÁËÏìÓ¦¡£µ«ÊÇ±íµ¥²¢²»»á»ñȡеÄÄÚÈÝ£¬ËùÒÔ¿ÉÒÔ·¢Æð¿çÓòÇëÇó¡£Í¬Ê±Ò²ËµÃ÷ÁË¿çÓò²¢²»ÄÜÍêÈ«×èÖ¹
CSRF£¬ÒòΪÇëÇó±Ï¾¹ÊÇ·¢³öÈ¥ÁË¡£
¶þ¡¢¿çÓò½â¾ö·½°¸
1.jsonp
1) JSONPÔÀí
ÀûÓÃ<script> ±êǩûÓпçÓòÏÞÖÆµÄ©¶´£¬ÍøÒ³¿ÉÒԵõ½´ÓÆäËûÀ´Ô´¶¯Ì¬²úÉúµÄ JSON
Êý¾Ý¡£JSONPÇëÇóÒ»¶¨ÐèÒª¶Ô·½µÄ·þÎñÆ÷×öÖ§³Ö²Å¿ÉÒÔ¡£
2) JSONPºÍAJAX¶Ô±È
JSONPºÍAJAXÏàͬ£¬¶¼Êǿͻ§¶ËÏò·þÎñÆ÷¶Ë·¢ËÍÇëÇ󣬴ӷþÎñÆ÷¶Ë»ñÈ¡Êý¾ÝµÄ·½Ê½¡£µ«AJAXÊôÓÚͬԴ²ßÂÔ£¬JSONPÊôÓÚ·ÇͬԴ²ßÂÔ£¨¿çÓòÇëÇó£©
3) JSONPÓÅȱµã
JSONPÓŵãÊǼòµ¥¼æÈÝÐԺ㬿ÉÓÃÓÚ½â¾öÖ÷Á÷ä¯ÀÀÆ÷µÄ¿çÓòÊý¾Ý·ÃÎʵÄÎÊÌ⡣ȱµãÊǽöÖ§³Öget·½·¨¾ßÓоÖÏÞÐÔ,²»°²È«¿ÉÄÜ»áÔâÊÜXSS¹¥»÷¡£
4) JSONPµÄʵÏÖÁ÷³Ì
ÉùÃ÷Ò»¸ö»Øµ÷º¯Êý£¬Æäº¯ÊýÃû(Èçshow)µ±×ö²ÎÊýÖµ£¬Òª´«µÝ¸ø¿çÓòÇëÇóÊý¾ÝµÄ·þÎñÆ÷£¬º¯ÊýÐβÎΪҪ»ñȡĿ±êÊý¾Ý(·þÎñÆ÷·µ»ØµÄdata)¡£
´´½¨Ò»¸ö<script>±êÇ©£¬°ÑÄǸö¿çÓòµÄAPIÊý¾Ý½Ó¿ÚµØÖ·£¬¸³Öµ¸øscriptµÄsrc,»¹ÒªÔÚÕâ¸öµØÖ·ÖÐÏò·þÎñÆ÷´«µÝ¸Ãº¯ÊýÃû£¨¿ÉÒÔͨ¹ýÎʺŴ«²Î:?callback=show£©¡£
·þÎñÆ÷½ÓÊÕµ½ÇëÇóºó£¬ÐèÒª½øÐÐÌØÊâµÄ´¦Àí£º°Ñ´«µÝ½øÀ´µÄº¯ÊýÃûºÍËüÐèÒª¸øÄãµÄÊý¾ÝÆ´½Ó³ÉÒ»¸ö×Ö·û´®,ÀýÈ磺´«µÝ½øÈ¥µÄº¯ÊýÃûÊÇshow£¬Ëü×¼±¸ºÃµÄÊý¾ÝÊÇshow('ÎÒ²»°®Äã')¡£
×îºó·þÎñÆ÷°Ñ×¼±¸µÄÊý¾Ýͨ¹ýHTTPÐÒé·µ»Ø¸ø¿Í»§¶Ë£¬¿Í»§¶ËÔÙµ÷ÓÃÖ´ÐÐ֮ǰÉùÃ÷µÄ»Øµ÷º¯Êý£¨show£©£¬¶Ô·µ»ØµÄÊý¾Ý½øÐвÙ×÷¡£
ÔÚ¿ª·¢ÖпÉÄÜ»áÓöµ½¶à¸ö 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)
}) |
ÉÏÃæÕâ¶Î´úÂëÏ൱ÓÚÏòhttp://localhost:3000/say?wd=Iloveyou&callback=showÕâ¸öµØÖ·ÇëÇóÊý¾Ý£¬È»ºóºǫ́·µ»Øshow('ÎÒ²»°®Äã')£¬×îºó»áÔËÐÐshow()Õâ¸öº¯Êý£¬´òÓ¡³ö¡¯ÎÒ²»°®Ä㡯
// server.js
let express = require('express')
let app = express()
app.get('/say', function(req, res) {
let { wd, callback } = req.query
console.log(wd) // Iloveyou
console.log(callback) // show
res.end(`${callback}('ÎÒ²»°®Äã')`)
})
app.listen(3000) |
5) jQueryµÄjsonpÐÎʽ
JSONP¶¼ÊÇGETºÍÒì²½ÇëÇóµÄ£¬²»´æÔÚÆäËûµÄÇëÇó·½Ê½ºÍͬ²½ÇëÇó£¬ÇÒjQueryĬÈÏ¾Í»á¸øJSONPµÄÇëÇóÇå³ý»º´æ¡£
$.ajax({
url:"http://crossdomain.com/jsonServerResponse",
dataType:"jsonp",
type:"get",//¿ÉÒÔÊ¡ÂÔ
jsonpCallback:"show",//->×Ô¶¨Òå´«µÝ¸ø·þÎñÆ÷µÄº¯ÊýÃû£¬¶ø²»ÊÇʹÓÃjQuery×Ô¶¯Éú³ÉµÄ£¬¿ÉÊ¡ÂÔ
jsonp:"callback",//->°Ñ´«µÝº¯ÊýÃûµÄÄǸöÐβÎcallback£¬¿ÉÊ¡ÂÔ
success:function (data){
console.log(data);}
}) |
2.cors
CORS ÐèÒªä¯ÀÀÆ÷ºÍºó¶Ëͬʱ֧³Ö¡£IE 8 ºÍ 9 ÐèҪͨ¹ý XDomainRequest À´ÊµÏÖ¡£
ä¯ÀÀÆ÷»á×Ô¶¯½øÐÐ CORS ͨÐÅ£¬ÊµÏÖ CORS ͨÐŵĹؼüÊǺó¶Ë¡£Ö»Òªºó¶ËʵÏÖÁË CORS£¬¾ÍʵÏÖÁË¿çÓò¡£
·þÎñ¶ËÉèÖà Access-Control-Allow-Origin ¾Í¿ÉÒÔ¿ªÆô CORS¡£ ¸ÃÊôÐÔ±íʾÄÄЩÓòÃû¿ÉÒÔ·ÃÎÊ×ÊÔ´£¬Èç¹ûÉèÖÃͨÅä·ûÔò±íʾËùÓÐÍøÕ¾¶¼¿ÉÒÔ·ÃÎÊ×ÊÔ´¡£
ËäÈ»ÉèÖà CORS ºÍǰ¶Ëûʲô¹ØÏµ£¬µ«ÊÇͨ¹ýÕâÖÖ·½Ê½½â¾ö¿çÓòÎÊÌâµÄ»°£¬»áÔÚ·¢ËÍÇëÇóʱ³öÏÖÁ½ÖÖÇé¿ö£¬·Ö±ðΪ¼òµ¥ÇëÇóºÍ¸´ÔÓÇëÇó¡£
1) ¼òµ¥ÇëÇó
ֻҪͬʱÂú×ãÒÔÏÂÁ½´óÌõ¼þ£¬¾ÍÊôÓÚ¼òµ¥ÇëÇó
Ìõ¼þ1£ºÊ¹ÓÃÏÂÁз½·¨Ö®Ò»£º
GET
HEAD
POST
Ìõ¼þ2£ºContent-Type µÄÖµ½öÏÞÓÚÏÂÁÐÈýÕßÖ®Ò»£º
text/plain
multipart/form-data
application/x-www-form-urlencoded
ÇëÇóÖеÄÈÎÒâ XMLHttpRequestUpload ¶ÔÏó¾ùûÓÐ×¢²áÈκÎʼþ¼àÌýÆ÷£» XMLHttpRequestUpload
¶ÔÏó¿ÉÒÔʹÓà XMLHttpRequest.upload ÊôÐÔ·ÃÎÊ¡£
2) ¸´ÔÓÇëÇó
²»·ûºÏÒÔÉÏÌõ¼þµÄÇëÇó¾Í¿Ï¶¨ÊǸ´ÔÓÇëÇóÁË¡£
¸´ÔÓÇëÇóµÄCORSÇëÇ󣬻áÔÚÕýʽͨÐÅ֮ǰ£¬Ôö¼ÓÒ»´ÎHTTP²éѯÇëÇ󣬳ÆÎª¡±Ô¤¼ì¡±ÇëÇó,¸ÃÇëÇóÊÇ option
·½·¨µÄ£¬Í¨¹ý¸ÃÇëÇóÀ´ÖªµÀ·þÎñ¶ËÊÇ·ñÔÊÐí¿çÓòÇëÇó¡£
ÎÒÃÇÓÃPUTÏòºǫ́ÇëÇóʱ£¬ÊôÓÚ¸´ÔÓÇëÇ󣬺ǫ́Ðè×öÈçÏÂÅäÖãº
// ÔÊÐíÄĸö·½·¨·ÃÎÊÎÒ
res.setHeader('Access-Control-Allow-Methods',
'PUT')
// Ô¤¼ìµÄ´æ»îʱ¼ä
res.setHeader('Access-Control-Max-Age', 6)
// OPTIONSÇëÇó²»×öÈκδ¦Àí
if (req.method === 'OPTIONS') {
res.end()
}
// ¶¨Òåºǫ́·µ»ØµÄÄÚÈÝ
app.put('/getData', function(req, res) {
console.log(req.headers)
res.end('ÎÒ²»°®Äã')
}) |
½ÓÏÂÀ´ÎÒÃÇ¿´ÏÂÒ»¸öÍêÕû¸´ÔÓÇëÇóµÄÀý×Ó£¬²¢ÇÒ½éÉÜÏÂCORSÇëÇóÏà¹ØµÄ×Ö¶Î
// index.html
let xhr = new XMLHttpRequest()
document.cookie = 'name=xiamen' // cookie²»ÄÜ¿çÓò
xhr.withCredentials = true // ǰ¶ËÉèÖÃÊÇ·ñ´øcookie
xhr.open('PUT', 'http://localhost:4000/getData',
true)
xhr.setRequestHeader('name', 'xiamen')
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
if ((xhr.status >= 200 && xhr.status
< 300) || xhr.status === 304) {
console.log(xhr.response)
//µÃµ½ÏìӦͷ£¬ºǫ́ÐèÉèÖÃAccess-Control-Expose-Headers
console.log(xhr.getResponseHeader('name'))
}
}
}
xhr.send() |
//server1.js
let express = require('express');
let app = express();
app.use(express.static(__dirname));
app.listen(3000); |
//server2.js
let express = require('express')
let app = express()
let whitList = ['http://localhost:3000'] //ÉèÖð×Ãûµ¥
app.use(function(req, res, next) {
let origin = req.headers.origin
if (whitList.includes(origin)) {
// ÉèÖÃÄĸöÔ´¿ÉÒÔ·ÃÎÊÎÒ
res.setHeader('Access-Control-Allow-Origin', origin)
// ÔÊÐíЯ´øÄĸöÍ··ÃÎÊÎÒ
res.setHeader('Access-Control-Allow-Headers',
'name')
// ÔÊÐíÄĸö·½·¨·ÃÎÊÎÒ
res.setHeader('Access-Control-Allow-Methods',
'PUT')
// ÔÊÐíЯ´øcookie
res.setHeader('Access-Control-Allow-Credentials',
true)
// Ô¤¼ìµÄ´æ»îʱ¼ä
res.setHeader('Access-Control-Max-Age', 6)
// ÔÊÐí·µ»ØµÄÍ·
res.setHeader('Access-Control-Expose-Headers',
'name')
if (req.method === 'OPTIONS') {
res.end() // OPTIONSÇëÇó²»×öÈκδ¦Àí
}
}
next()
})
app.put('/getData', function(req, res) {
console.log(req.headers)
res.setHeader('name', 'jw') //·µ»ØÒ»¸öÏìӦͷ£¬ºǫ́ÐèÉèÖÃ
res.end('ÎÒ²»°®Äã')
})
app.get('/getData', function(req, res) {
console.log(req.headers)
res.end('ÎÒ²»°®Äã')
})
app.use(express.static(__dirname))
app.listen(4000) |
ÉÏÊö´úÂëÓÉhttp://localhost:3000/index.htmlÏòhttp://localhost:4000/¿çÓòÇëÇó£¬ÕýÈçÎÒÃÇÉÏÃæËù˵µÄ£¬ºó¶ËÊÇʵÏÖ
CORS ͨÐŵĹؼü¡£
3.postMessage
postMessageÊÇHTML5 XMLHttpRequest Level 2ÖеÄAPI£¬ÇÒÊÇΪÊý²»¶à¿ÉÒÔ¿çÓò²Ù×÷µÄwindowÊôÐÔÖ®Ò»£¬Ëü¿ÉÓÃÓÚ½â¾öÒÔÏ·½ÃæµÄÎÊÌ⣺
Ò³ÃæºÍÆä´ò¿ªµÄд°¿ÚµÄÊý¾Ý´«µÝ
¶à´°¿ÚÖ®¼äÏûÏ¢´«µÝ
Ò³ÃæÓëǶÌ×µÄiframeÏûÏ¢´«µÝ
ÉÏÃæÈý¸ö³¡¾°µÄ¿çÓòÊý¾Ý´«µÝ
postMessage()·½·¨ÔÊÐíÀ´×Ô²»Í¬Ô´µÄ½Å±¾²ÉÓÃÒì²½·½Ê½½øÐÐÓÐÏÞµÄͨÐÅ£¬¿ÉÒÔʵÏÖ¿çÎı¾µµ¡¢¶à´°¿Ú¡¢¿çÓòÏûÏ¢´«µÝ¡£
otherWindow.postMessage(message, targetOrigin, [transfer]);
message: ½«Òª·¢Ë͵½ÆäËû windowµÄÊý¾Ý¡£
targetOrigin:ͨ¹ý´°¿ÚµÄoriginÊôÐÔÀ´Ö¸¶¨ÄÄЩ´°¿ÚÄܽÓÊÕµ½ÏûϢʼþ£¬ÆäÖµ¿ÉÒÔÊÇ×Ö·û´®¡±*¡±£¨±íʾÎÞÏÞÖÆ£©»òÕßÒ»¸öURI¡£ÔÚ·¢ËÍÏûÏ¢µÄʱºò£¬Èç¹ûÄ¿±ê´°¿ÚµÄÐÒé¡¢Ö÷»úµØÖ·»ò¶Ë¿ÚÕâÈýÕßµÄÈÎÒâÒ»ÏƥÅätargetOriginÌṩµÄÖµ£¬ÄÇôÏûÏ¢¾Í²»»á±»·¢ËÍ£»Ö»ÓÐÈýÕßÍêȫƥÅ䣬ÏûÏ¢²Å»á±»·¢ËÍ¡£
transfer(¿ÉÑ¡)£ºÊÇÒ»´®ºÍmessage ͬʱ´«µÝµÄ Transferable ¶ÔÏó. ÕâЩ¶ÔÏóµÄËùÓÐȨ½«±»×ªÒƸøÏûÏ¢µÄ½ÓÊÕ·½£¬¶ø·¢ËÍÒ»·½½«²»ÔÙ±£ÓÐËùÓÐȨ¡£
½ÓÏÂÀ´ÎÒÃÇ¿´¸öÀý×Ó£º http://localhost:3000/a.htmlÒ³ÃæÏòhttp://localhost:4000/b.html´«µÝ¡°ÎÒ°®Ä㡱,È»ºóºóÕß´«»Ø¡±ÎÒ²»°®Ä㡱¡£
// a.html
<iframe src="http://localhost:4000/b.html"
frameborder="0" id="frame"
onload="load()"></iframe> //µÈËü¼ÓÔØÍê´¥·¢Ò»¸öʼþ
//ÄÚǶÔÚhttp://localhost:3000/a.html <script>
function load() {
let frame = document.getElementById('frame')
frame.contentWindow.postMessage('ÎÒ°®Äã', 'http://localhost:4000')
//·¢ËÍÊý¾Ý
window.onmessage = function(e) { //½ÓÊÜ·µ»ØÊý¾Ý
console.log(e.data) //ÎÒ²»°®Äã
}
} </script> |
// b.html
window.onmessage = function(e) {
console.log(e.data) //ÎÒ°®Äã
e.source.postMessage('ÎÒ²»°®Äã', e.origin)
} |
4.websocket
WebsocketÊÇHTML5µÄÒ»¸ö³Ö¾Ã»¯µÄÐÒ飬ËüʵÏÖÁËä¯ÀÀÆ÷Óë·þÎñÆ÷µÄȫ˫¹¤Í¨ÐÅ£¬Í¬Ê±Ò²ÊÇ¿çÓòµÄÒ»ÖÖ½â¾ö·½°¸¡£WebSocketºÍHTTP¶¼ÊÇÓ¦ÓòãÐÒ飬¶¼»ùÓÚ
TCP ÐÒé¡£µ«ÊÇ WebSocket ÊÇÒ»ÖÖË«ÏòͨÐÅÐÒ飬ÔÚ½¨Á¢Á¬½ÓÖ®ºó£¬WebSocket µÄ
server Óë client ¶¼ÄÜÖ÷¶¯Ïò¶Ô·½·¢ËÍ»ò½ÓÊÕÊý¾Ý¡£Í¬Ê±£¬WebSocket ÔÚ½¨Á¢Á¬½ÓʱÐèÒª½èÖú
HTTP ÐÒ飬Á¬½Ó½¨Á¢ºÃÁËÖ®ºó client Óë server Ö®¼äµÄË«ÏòͨОÍÓë HTTP ÎÞ¹ØÁË¡£
ÔÉúWebSocket APIʹÓÃÆðÀ´²»Ì«·½±ã£¬ÎÒÃÇʹÓÃSocket.io£¬ËüºÜºÃµØ·â×°ÁËwebSocket½Ó¿Ú£¬ÌṩÁ˸ü¼òµ¥¡¢Áé»îµÄ½Ó¿Ú£¬Ò²¶Ô²»Ö§³ÖwebSocketµÄä¯ÀÀÆ÷ÌṩÁËÏòϼæÈÝ¡£
ÎÒÃÇÏÈÀ´¿´¸öÀý×Ó£º±¾µØÎļþsocket.htmlÏòlocalhost:3000·¢ÉúÊý¾ÝºÍ½ÓÊÜÊý¾Ý
// socket.html
<script>
let socket = new WebSocket('ws://localhost:3000');
socket.onopen = function () {
socket.send('ÎÒ°®Äã');//Ïò·þÎñÆ÷·¢ËÍÊý¾Ý
}
socket.onmessage = function (e) {
console.log(e.data);//½ÓÊÕ·þÎñÆ÷·µ»ØµÄÊý¾Ý
}
</script> |
// server.js
let express = require('express');
let app = express();
let WebSocket = require('ws');//¼ÇµÃ°²×°ws
let wss = new WebSocket.Server({port:3000});
wss.on('connection',function(ws) {
ws.on('message', function (data) {
console.log(data);
ws.send('ÎÒ²»°®Äã')
});
}) |
5. NodeÖмä¼þ´úÀí(Á½´Î¿çÓò)
ʵÏÖÔÀí£ºÍ¬Ô´²ßÂÔÊÇä¯ÀÀÆ÷ÐèÒª×ñѵıê×¼£¬¶øÈç¹ûÊÇ·þÎñÆ÷Ïò·þÎñÆ÷ÇëÇó¾ÍÎÞÐè×ñÑͬԴ²ßÂÔ¡£
´úÀí·þÎñÆ÷£¬ÐèÒª×öÒÔϼ¸¸ö²½Ö裺
½ÓÊܿͻ§¶ËÇëÇó ¡£
½«ÇëÇó ת·¢¸ø·þÎñÆ÷¡£
Äõ½·þÎñÆ÷ ÏìÓ¦ Êý¾Ý¡£
½« ÏìÓ¦ ת·¢¸ø¿Í»§¶Ë¡£

ÎÒÃÇÏÈÀ´¿´¸öÀý×Ó£º±¾µØÎļþindex.htmlÎļþ£¬Í¨¹ý´úÀí·þÎñÆ÷http://localhost:3000ÏòÄ¿±ê·þÎñÆ÷http://localhost:4000ÇëÇóÊý¾Ý¡£
// index.html(http://127.0.0.1:5500)
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
<script>
$.ajax({
url: 'http://localhost:3000',
type: 'post',
data: { name: 'xiamen', password: '123456' },
contentType: 'application/json;charset=utf-8',
success: function(result) {
console.log(result) // {"title":"fontend","password":"123456"}
},
error: function(msg) {
console.log(msg)
}
}) </script> |
// server1.js
´úÀí·þÎñÆ÷(http://localhost:3000)
const http = require('http')
// µÚÒ»²½£º½ÓÊܿͻ§¶ËÇëÇó
const server = http.createServer((request, response)
=> {
// ´úÀí·þÎñÆ÷£¬Ö±½ÓºÍä¯ÀÀÆ÷Ö±½Ó½»»¥£¬ÐèÒªÉèÖÃCORS µÄÊײ¿×Ö¶Î
response.writeHead(200, {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': '*',
'Access-Control-Allow-Headers': 'Content-Type'
})
// µÚ¶þ²½£º½«ÇëÇóת·¢¸ø·þÎñÆ÷
const proxyRequest = http
.request(
{
host: '127.0.0.1',
port: 4000,
url: '/',
method: request.method,
headers: request.headers
},
serverResponse => {
// µÚÈý²½£ºÊÕµ½·þÎñÆ÷µÄÏìÓ¦
var body = ''
serverResponse.on('data', chunk => {
body += chunk
})
serverResponse.on('end', () => {
console.log('The data is ' + body)
// µÚËIJ½£º½«ÏìÓ¦½á¹ûת·¢¸øä¯ÀÀÆ÷
response.end(body)
})
}
)
.end()
})
server.listen(3000, () => {
console.log('The proxyServer is running at http://localhost:3000')
}) |
// server2.js(http://localhost:4000)
const http = require('http')
const data = { title: 'fontend', password: '123456'
}
const server = http.createServer((request, response)
=> {
if (request.url === '/') {
response.end(JSON.stringify(data))
}
})
server.listen(4000, () => {
console.log('The server is running at http://localhost:4000')
}) |
ÉÏÊö´úÂë¾¹ýÁ½´Î¿çÓò£¬ÖµµÃ×¢ÒâµÄÊÇä¯ÀÀÆ÷Ïò´úÀí·þÎñÆ÷·¢ËÍÇëÇó£¬Ò²×ñÑͬԴ²ßÂÔ£¬×îºóÔÚindex.htmlÎļþ´òÓ¡³ö{"title":"fontend","password":"123456"}
6.nginx·´Ïò´úÀí
ʵÏÖÔÀíÀàËÆÓÚNodeÖмä¼þ´úÀí£¬ÐèÒªÄã´î½¨Ò»¸öÖÐתnginx·þÎñÆ÷£¬ÓÃÓÚת·¢ÇëÇó¡£
ʹÓÃnginx·´Ïò´úÀíʵÏÖ¿çÓò£¬ÊÇ×î¼òµ¥µÄ¿çÓò·½Ê½¡£Ö»ÐèÒªÐÞ¸ÄnginxµÄÅäÖü´¿É½â¾ö¿çÓòÎÊÌ⣬֧³ÖËùÓÐä¯ÀÀÆ÷£¬Ö§³Ösession£¬²»ÐèÒªÐÞ¸ÄÈκδúÂ룬²¢ÇÒ²»»áÓ°Ïì·þÎñÆ÷ÐÔÄÜ¡£
ʵÏÖ˼·£ºÍ¨¹ýnginxÅäÖÃÒ»¸ö´úÀí·þÎñÆ÷£¨ÓòÃûÓëdomain1Ïàͬ£¬¶Ë¿Ú²»Í¬£©×öÌø°å»ú£¬·´Ïò´úÀí·ÃÎÊdomain2½Ó¿Ú£¬²¢ÇÒ¿ÉÒÔ˳±ãÐÞ¸ÄcookieÖÐdomainÐÅÏ¢£¬·½±ãµ±Ç°ÓòcookieдÈ룬ʵÏÖ¿çÓòµÇ¼¡£
ÏÈÏÂÔØnginx£¬È»ºó½«nginxĿ¼ÏµÄnginx.confÐÞ¸ÄÈçÏÂ:
// proxy·þÎñÆ÷
server {
listen 80;
server_name www.domain1.com;
location / {
proxy_pass http://www.domain2.com:8080; #·´Ïò´úÀí
proxy_cookie_domain www.domain2.com www.domain1.com;
#ÐÞ¸ÄcookieÀïÓòÃû
index index.html index.htm;
# µ±ÓÃwebpack-dev-serverµÈÖмä¼þ´úÀí½Ó¿Ú·ÃÎÊnignxʱ£¬´ËʱÎÞä¯ÀÀÆ÷²ÎÓ룬¹ÊûÓÐͬԴÏÞÖÆ£¬ÏÂÃæµÄ¿çÓòÅäÖÿɲ»ÆôÓÃ
add_header Access-Control-Allow-Origin http://www.domain1.com;
#µ±Ç°¶ËÖ»¿çÓò²»´øcookieʱ£¬¿ÉΪ*
add_header Access-Control-Allow-Credentials true;
}
} |
×îºóͨ¹ýÃüÁîÐÐnginx -s reloadÆô¶¯nginx
// index.html
var xhr = new XMLHttpRequest();
// ǰ¶Ë¿ª¹Ø£ºä¯ÀÀÆ÷ÊÇ·ñ¶Áдcookie
xhr.withCredentials = true;
// ·ÃÎÊnginxÖеĴúÀí·þÎñÆ÷
xhr.open('get', 'http://www.domain1.com:81/?user=admin',
true);
xhr.send(); |
// server.js
var http = require('http');
var server = http.createServer();
var qs = require('querystring');
server.on('request', function(req, res) {
var params = qs.parse(req.url.substring(2));
// Ïòǰ̨дcookie
res.writeHead(200, {
'Set-Cookie': 'l=a123456;Path=/;Domain=www.domain2.com;HttpOnly'
// HttpOnly:½Å±¾ÎÞ·¨¶ÁÈ¡
});
res.write(JSON.stringify(params));
res.end();
});
server.listen('8080');
console.log('Server is running at port 8080...'); |
7.window.name + iframe
window.nameÊôÐԵĶÀÌØÖ®´¦£ºnameÖµÔÚ²»Í¬µÄÒ³Ãæ£¨ÉõÖÁ²»Í¬ÓòÃû£©¼ÓÔØºóÒÀ¾É´æÔÚ£¬²¢ÇÒ¿ÉÒÔÖ§³Ö·Ç³£³¤µÄ
name Öµ£¨2MB£©¡£
ÆäÖÐa.htmlºÍb.htmlÊÇͬÓòµÄ£¬¶¼ÊÇhttp://localhost:3000;¶øc.htmlÊÇhttp://localhost:4000
// a.html(http://localhost:3000/b.html)
<iframe src="http://localhost:4000/c.html"
frameborder="0" onload="load()"
id="iframe"></iframe> <script>
let first = true
// onloadʼþ»á´¥·¢2´Î£¬µÚ1´Î¼ÓÔØ¿çÓòÒ³£¬²¢Áô´æÊý¾ÝÓÚwindow.name
function load() {
if(first){
// µÚ1´Îonload(¿çÓòÒ³)³É¹¦ºó£¬Çл»µ½Í¬Óò´úÀíÒ³Ãæ
let iframe = document.getElementById('iframe');
iframe.src = 'http://localhost:3000/b.html';
first = false;
}else{
// µÚ2´Îonload(ͬÓòb.htmlÒ³)³É¹¦ºó£¬¶ÁȡͬÓòwindow.nameÖÐÊý¾Ý
console.log(iframe.contentWindow.name);
}
} </script> |
b.htmlΪÖмä´úÀíÒ³£¬Óëa.htmlͬÓò£¬ÄÚÈÝΪ¿Õ¡£
// c.html(http://localhost:4000/c.html)
<script>
window.name = 'ÎÒ²»°®Äã' </script> |
×ܽ᣺ͨ¹ýiframeµÄsrcÊôÐÔÓÉÍâÓòתÏò±¾µØÓò£¬¿çÓòÊý¾Ý¼´ÓÉiframeµÄwindow.name´ÓÍâÓò´«µÝµ½±¾µØÓò¡£Õâ¸ö¾ÍÇÉÃîµØÈÆ¹ýÁËä¯ÀÀÆ÷µÄ¿çÓò·ÃÎÊÏÞÖÆ£¬µ«Í¬Ê±ËüÓÖÊǰ²È«²Ù×÷¡£
8.location.hash + iframe
ʵÏÖÔÀí£º a.htmlÓûÓëc.html¿çÓòÏ໥ͨÐÅ£¬Í¨¹ýÖмäÒ³b.htmlÀ´ÊµÏÖ¡£ Èý¸öÒ³Ãæ£¬²»Í¬ÓòÖ®¼äÀûÓÃiframeµÄlocation.hash´«Öµ£¬ÏàͬÓòÖ®¼äÖ±½Ójs·ÃÎÊÀ´Í¨ÐÅ¡£
¾ßÌåʵÏÖ²½Ö裺һ¿ªÊ¼a.html¸øc.html´«Ò»¸öhashÖµ£¬È»ºóc.htmlÊÕµ½hashÖµºó£¬ÔÙ°ÑhashÖµ´«µÝ¸øb.html£¬×îºób.html½«½á¹û·Åµ½a.htmlµÄhashÖµÖС£
ͬÑùµÄ£¬a.htmlºÍb.htmlÊÇͬÓòµÄ£¬¶¼ÊÇhttp://localhost:3000;¶øc.htmlÊÇhttp://localhost:4000
// a.html
<iframe src="http://localhost:4000/c.html#iloveyou"></iframe>
<script>
window.onhashchange = function () { //¼ì²âhashµÄ±ä»¯
console.log(location.hash);
} </script> |
// b.html
<script>
window.parent.parent.location.hash = location.hash
//b.html½«½á¹û·Åµ½a.htmlµÄhashÖµÖУ¬b.html¿Éͨ¹ýparent.parent·ÃÎÊa.htmlÒ³Ãæ
</script> |
// c.html
console.log(location.hash);
let iframe = document.createElement('iframe');
iframe.src = 'http://localhost:3000/b.html#idontloveyou';
document.body.appendChild(iframe); |
9.document.domain + iframe
¸Ã·½Ê½Ö»ÄÜÓÃÓÚ¶þ¼¶ÓòÃûÏàͬµÄÇé¿öÏ£¬±ÈÈç a.test.com ºÍ b.test.com ÊÊÓÃÓڸ÷½Ê½¡£
Ö»ÐèÒª¸øÒ³ÃæÌí¼Ó document.domain ='test.com' ±íʾ¶þ¼¶ÓòÃû¶¼Ïàͬ¾Í¿ÉÒÔʵÏÖ¿çÓò¡£
ʵÏÖÔÀí£ºÁ½¸öÒ³Ãæ¶¼Í¨¹ýjsÇ¿ÖÆÉèÖÃdocument.domainΪ»ù´¡Ö÷Óò£¬¾ÍʵÏÖÁËͬÓò¡£
ÎÒÃÇ¿´¸öÀý×Ó£ºÒ³Ãæa.zf1.cn:3000/a.html»ñÈ¡Ò³Ãæb.zf1.cn:3000/b.htmlÖÐaµÄÖµ
// a.html
<body>
helloa <iframe src="http://b.zf1.cn:3000/b.html"
frameborder="0" onload="load()"
id="frame"></iframe> <script>
document.domain = 'zf1.cn'
function load() {
console.log(frame.contentWindow.a);
} </script>
</body> |
// b.html
<body>
hellob <script>
document.domain = 'zf1.cn'
var a = 100; </script>
</body> |
Èý¡¢×ܽá
CORSÖ§³ÖËùÓÐÀàÐ͵ÄHTTPÇëÇó£¬ÊÇ¿çÓòHTTPÇëÇóµÄ¸ù±¾½â¾ö·½°¸
JSONPÖ»Ö§³ÖGETÇëÇó£¬JSONPµÄÓÅÊÆÔÚÓÚÖ§³ÖÀÏʽä¯ÀÀÆ÷£¬ÒÔ¼°¿ÉÒÔÏò²»Ö§³ÖCORSµÄÍøÕ¾ÇëÇóÊý¾Ý¡£
²»¹ÜÊÇNodeÖмä¼þ´úÀí»¹ÊÇnginx·´Ïò´úÀí£¬Ö÷ÒªÊÇͨ¹ýͬԴ²ßÂÔ¶Ô·þÎñÆ÷²»¼ÓÏÞÖÆ¡£
ÈÕ³£¹¤×÷ÖУ¬ÓõñȽ϶àµÄ¿çÓò·½°¸ÊÇcorsºÍnginx·´Ïò´úÀí
|