Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
¾ÅÖÖ¿çÓò·½Ê½ÊµÏÖÔ­Àí
 
  2455  次浏览      27
 2019-2-21
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚ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·´Ïò´úÀí

   
2455 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

¹È¸è½ÌÄãÈçºÎ¹¹½¨Ò»¸öÓÅÐãµÄÒÆ¶¯ÍøÕ¾
ÈçºÎ¸ßЧµØ¹ÜÀíÍøÕ¾¾²Ì¬×ÊÔ´
¸ßÐÔÄÜÍøÕ¾½¨ÉèµÄ×î¼Ñʵ¼ù
Ïл°ÍøÕ¾×ó²àµ¼º½µÄʵÏÖ
 
Ïà¹ØÎĵµ

ÍøÕ¾½¨Éè·½°¸Á÷³Ì
ÍøÕ¾½¨Éècss½Ì³Ì
ÆóÒµÍøÕ¾½¨ÉèÓëÍÆ¹ã
ÍøÕ¾½¨Éè·½°¸Êé
Ïà¹Ø¿Î³Ì

Éè¼ÆÄ£Ê½Ô­ÀíÓëÓ¦ÓÃ
´ÓÐèÇó¹ý¶Éµ½Éè¼Æ
Èí¼þÉè¼ÆÔ­ÀíÓëʵ¼ù
ÈçºÎ±àд¸ßÖÊÁ¿´úÂë