129-跨域(一)ajax跨域訪問庞呕、解決跨域后session失效問題

1. ajax跨域

在Web編程中我們經(jīng)常會遇到跨域的問題。默認情況下疗疟,瀏覽器是不允許跨域訪問的该默。所以說,在這里就有一個概念:CORS(Cross-Origin Resource Sharing)跨域資源共享策彤。

在HTML5標準出來之前栓袖,CORS是不被允許的。但是為了達到跨域訪問資源的目的锅锨,出現(xiàn)了很多較麻煩的方式:jsonp叽赊、代理文件、地址欄hash等等必搞。隨著HTML5的出現(xiàn)必指,CORS為我們解決了一個大麻煩。

雖然前端有多種方式處理跨域,但是多而不精,缺點都比較明顯.相對而言更好的方式是通過后端參與處理,這樣做不僅適用性更強,同時前端只要發(fā)送正常的Ajax請求即可.這樣的技術(shù)叫做CORS.

Nodejs服務(wù)器端:

要想實現(xiàn)跨域訪問恕洲,首先我們要清楚CORS實現(xiàn)跨域訪問最重要的一點就是設(shè)置Access-Control-Allow-Origin這個參數(shù)塔橡。

var express = require('express');
var app = express();
//設(shè)置跨域訪問
app.all('*', function(req, res, next) {
    //設(shè)置全局訪問,這里的*將到替換成你的域名
    res.setHeader('Access-Control-Allow-Origin', '*');
    //告訴客戶端可以接受請求的方式
    res.setHeader('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, OPTIONS');
    
    next();
});

app.get('/auth/:id/:password', function(req, res) {
    res.send({id:req.params.id, name: req.params.password});
});

app.listen(3000);

只需要設(shè)置服務(wù)端即可霜第,在客戶端不用進行其他的設(shè)置就可以實現(xiàn)跨域訪問了葛家。


上面的設(shè)置僅僅是可以跨域訪問,但對于設(shè)置cookie還是不能跨域設(shè)置和讀取泌类。(服務(wù)器端生成session后會設(shè)置給客戶端的cookie中)
接下來我們就來進行cookie跨域的設(shè)置癞谒。

2. 解決ajax跨域后session失效問題

  • 客戶端如下:

ajax請求添加參數(shù):
//ajax請求攜帶cookie
xhrFields:{withCredentials:true},

//全局變量
var HOST = 'http://172.16.0.131:3000';
$.ajax({
  url:HOST+'/login',
  type:'get',
  data:params,
  xhrFields:{withCredentials:true},
  dataType:'jsonp',
  jsonp:'jsonpcallback',
  success:function(data){
    console.log(data);
    ...
  },
  error:function(){
    ...
  }
});
  • 服務(wù)器端

//告訴客戶端可以在HTTP請求中帶上Cookie
res.setHeader('Access-Control-Allow-Credentials', true);

路由文件route.json:

{
      "/login" : "usercontroller#login",
}

公共comm.js文件內(nèi)容

//初始化設(shè)置
var initSet = function(req, res){
    //設(shè)置全局訪問
    res.setHeader('Access-Control-Allow-Origin', '*');
    //告訴客戶端可以在HTTP請求中帶上Cookie
    res.setHeader('Access-Control-Allow-Credentials', true);
    //告訴客戶端可以接受請求的方式
    res.setHeader('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, OPTIONS');

    return res;
}

usercontroller.js文件

//引入模塊
const comm = require('../models/comm');
const config = require('../config');
const user = require('../models/user.js');
const qs = require('querystring');
const url = require('url');
const fs = require('fs');
var session = require('express-session');
var crypto = require('crypto');
var multiparty = require('multiparty');
//引入 mime模塊
const mime = require('mime');
module.exports = {
  //登錄
  login : function(req, res){
    //初始化設(shè)置
    res = comm.initSet(req, res);

    var params = url.parse(req.url,true).query;

    var jsonpcallback = params.jsonpcallback;
    var phone = params.phone;
    var password = params.password;

    if(phone == ""){
      res.send(jsonpcallback+'('+JSON.stringify({state:'err', msg : '手機號碼不能為空'})+')');
      return false;
    }

    //手機驗證碼正確
    user.find({phone:phone}, function(err, result){
      if(err){
        console.log(err);
        res.send(jsonpcallback+'('+JSON.stringify({state:'err', msg : '服務(wù)器繁忙,請稍后再試!'})+')');
        return false;
      }
      
      //用戶不存在
      if(result.length <= 0){
        res.send(jsonpcallback+'('+JSON.stringify({state:'err', msg : '用戶不存在'})+')');
        return false;
      }

      var hasher = crypto.createHash('md5');
      hasher.update(password);
      var newpassword = hasher.digest('hex');//hashmsg為加密之后的數(shù)據(jù)
      
      //密碼錯誤
      if(result[0].password != newpassword){
        res.send(jsonpcallback+'('+JSON.stringify({state:'err', msg : '密碼不正確'})+')');
        return false;
      }
      
      //存入session
      req.session.uid = result[0]._id;
      req.session.username = result[0].username;
      req.session.phone = params.phone;
      req.session.tag = 1;
      
      console.log(req.session);
      
      res.send(jsonpcallback+'('+JSON.stringify({state:'ok', msg : '登錄成功'})+')');
    });
  },
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末弹砚,一起剝皮案震驚了整個濱河市双仍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌桌吃,老刑警劉巖朱沃,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異茅诱,居然都是意外死亡逗物,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門瑟俭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來翎卓,“玉大人,你說我怎么就攤上這事摆寄×觯” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵椭迎,是天一觀的道長。 經(jīng)常有香客問我田盈,道長畜号,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任允瞧,我火速辦了婚禮简软,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘述暂。我一直安慰自己痹升,他們只是感情好,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布畦韭。 她就那樣靜靜地躺著疼蛾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪艺配。 梳的紋絲不亂的頭發(fā)上察郁,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音转唉,去河邊找鬼皮钠。 笑死,一個胖子當著我的面吹牛赠法,可吹牛的內(nèi)容都是我干的麦轰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼款侵!你這毒婦竟也來了末荐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤喳坠,失蹤者是張志新(化名)和其女友劉穎鞠评,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體壕鹉,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡剃幌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了晾浴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片负乡。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖脊凰,靈堂內(nèi)的尸體忽然破棺而出抖棘,到底是詐尸還是另有隱情,我是刑警寧澤狸涌,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布切省,位于F島的核電站,受9級特大地震影響帕胆,放射性物質(zhì)發(fā)生泄漏朝捆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一懒豹、第九天 我趴在偏房一處隱蔽的房頂上張望芙盘。 院中可真熱鬧,春花似錦脸秽、人聲如沸儒老。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽驮樊。三九已至,卻和暖如春片酝,著一層夾襖步出監(jiān)牢的瞬間巩剖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工钠怯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留佳魔,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓晦炊,卻偏偏與公主長得像鞠鲜,于是被迫代替她去往敵國和親宁脊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容