node.js中cookie數據丟失致使session失效問題

問題

今天剛準備用node.js做爲後端語言來開發就遇到了一個小坑,網上的資料仍是比較的少,因而我決定記錄下來。關於session和cookie我就不作具體的介紹了,網上有挺多資料的。我打算實現的功能:登陸,在用戶登陸以後,把用戶的uname存到session裏面,在訪問一些須要登陸以後才能訪問的頁面的時候,去sesion中查看時候在該值是否存在,存在則已經登陸,不存在則未登陸(一個比較簡單的功能)。可是我發現,在登陸以後,我去設置req.session.user的值,再立刻console.log(req.session.user)的值發現是能夠取到的;跳轉到別的頁面以後,我再去請求req.session.user發現該值爲空,不存在。
劇透一下:該問題是因爲跨域時cookie保存的數據丟失了而致使的,詳細可看下面
代碼和效果以下
index.jsvue

const http = require("http")
const express = require('express');
const bodyParser = require('body-parser');
const cookieParser = require('cookie-parser');
const session = require('express-session');
const cors = require('cors');
const pool = require('./pool');
const routerUser = require('./router/user');

let app = express();

http.createServer(app).listen(8081);

// 中間件
app.use(bodyParser.urlencoded({
  extended: false 
}));
app.use(cors({
    origin:["http://127.0.0.1","http://localhost","http://127.0.0.1:8080","http://localhost:8080"],
    credentials:true
}));
app.use(cookieParser());
app.use(session({
    secret:'logaawing',
    cookie:{maxAge:60000},
    resave:false,                //每次請求是否須要從新設置cookie
    saveUninitialized:true      //不管是否有cookie,設置標記connect.sid可更名
}));

// 路由器
app.use('/user',routerUser);

user.js //user.js在和index.js同級的router目錄下node

const express = require('express')
const pool = require('../pool.js');
let router = express.Router();
module.exports = router;

router.post("/login",function(req,res){
    let uname = req.body.uname;
    let upwd = req.body.upwd;
    let sql = "SELECT user_name FROM home_admin WHERE aname = ? AND apwd = md5(?)";
    pool.query(sql,[uname,upwd],(err,result)=>{
        if(err) throw err;
        if(result.length>0){
            username = result[0].user_name;
            req.session.user = username;
            console.log(req.session);
            res.json({errno:0,uname:username});
        }else{
            res.json({errno:1,msg:'登陸失敗,帳號或密碼錯誤'})
        }
    })
})

router.get("/session",function(req,res){
    console.log(req.session);
    res.send(req.session.user);
})

圖片描述

注:我這兩次訪問是在同一個會話裏訪問的
從圖片中能夠發現,我在同一個會話裏再次去訪問session,發現這個session已經不是同一個session了,我存進去的user也不見了。ajax

思考

出現問題就要解決問題嘛。由於node.js學了也不過久,也沒怎麼用過session,我一開始一直覺得是因爲個人session哪一個位置寫錯了因此致使了這個問題的產生, 後來想起以前有個朋友給我說過nodejs中的session有一個坑是跨域致使的。因而我就朝着這個方向去找解決的方法。sql

解決

session的工做流程:當瀏覽器訪問服務器併發送第一次請求時,服務器端會建立一個session對象,生成一個相似於key,value的鍵值對, 而後將key(cookie)返回到瀏覽器(客戶)端,瀏覽器下次再訪問時,攜帶key(cookie),找到對應的session(value) 。 客戶的信息都保存在session中。
致使問題出現的緣由:跨域時cookie保存的數據丟失了
由於vue中使用的是8080端口,我node.js啓的服務器用的是8081端口,端口不同也就存在着跨域的問題。
因而我在客戶端中的請求信息中加上了withCredentials:true,也就是在發起請求的時候要求它必定要帶上cookie信息
我是用vue進行開發的,下面是在vue中的方法(請求的時候加上credentials: true):express

clipboard.png

在通常的ajax請求中則要加上json

$.ajax({
    xhrFields:{withCredentials:true}
      });

在進行了以上的修改以後再次運行程序能夠發現,在同一個會話中再次訪問session的時候,user的值沒有丟失後端

clipboard.png

以上就是我使用node.js exprees框架中的session所遇到的問題以及解決方法,有哪裏寫的不對的歡迎你們指出,謝謝!跨域

相關文章
相關標籤/搜索