摘要:問題今天剛準備用作為后端語言來開發就遇到了一個小坑,網上的資料還是比較的少,于是我決定記錄下來。客戶的信息都保存在中。導致問題出現的原因跨域時保存的數據丟失了因為中使用的是端口,我啟的服務器用的是端口,端口不一樣也就存在著跨域的問題。
問題
今天剛準備用node.js作為后端語言來開發就遇到了一個小坑,網上的資料還是比較的少,于是我決定記錄下來。關于session和cookie我就不做具體的介紹了,網上有挺多資料的。我打算實現的功能:登錄,在用戶登錄之后,把用戶的uname存到session里面,在訪問一些需要登錄之后才能訪問的頁面的時候,去sesion中查看時候在該值是否存在,存在則已經登錄,不存在則未登錄(一個比較簡單的功能)。但是我發現,在登錄之后,我去設置req.session.user的值,再馬上console.log(req.session.user)的值發現是可以取到的;跳轉到別的頁面之后,我再去請求req.session.user發現該值為空,不存在。
劇透一下:該問題是由于跨域時cookie保存的數據丟失了而導致的,詳細可看下面
代碼和效果如下
index.js
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目錄下
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也不見了。
出現問題就要解決問題嘛。因為node.js學了也不太久,也沒怎么用過session,我一開始一直以為是由于我的session哪個位置寫錯了所以導致了這個問題的產生, 后來想起之前有個朋友給我說過nodejs中的session有一個坑是跨域導致的。于是我就朝著這個方向去找解決的方法。
解決session的工作流程:當瀏覽器訪問服務器并發送第一次請求時,服務器端會創建一個session對象,生成一個類似于key,value的鍵值對, 然后將key(cookie)返回到瀏覽器(客戶)端,瀏覽器下次再訪問時,攜帶key(cookie),找到對應的session(value) 。 客戶的信息都保存在session中。
導致問題出現的原因:跨域時cookie保存的數據丟失了
因為vue中使用的是8080端口,我node.js啟的服務器用的是8081端口,端口不一樣也就存在著跨域的問題。
于是我在客戶端中的請求信息中加上了withCredentials:true,也就是在發起請求的時候要求它一定要帶上cookie信息
我是用vue進行開發的,下面是在vue中的方法(請求的時候加上credentials: true):
在一般的ajax請求中則要加上
$.ajax({ xhrFields:{withCredentials:true} });
在進行了以上的修改之后再次運行程序可以發現,在同一個會話中再次訪問session的時候,user的值沒有丟失
以上就是我使用node.js exprees框架中的session所遇到的問題以及解決方法,有哪里寫的不對的歡迎大家指出,謝謝!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/107034.html
摘要:因為我們認為正常情況下用戶的不會在短時間內發生變化,所以當我們選擇使用策略進行負載均衡時,意味著期望同一個用戶能夠一直訪問到同一臺服務器上,就像下圖這樣。但是,我們還需要明白一個事實嚴格來說保持本質上是破壞了做負載均衡的初衷。 本文長度為3056字,預計讀完需1.1MB流量,建議閱讀8分鐘。 這篇是《分布式關注點系列》中「負載均衡」相關的內容最后一發了,后續也會繼續講「高可用」相關的其...
摘要:而在中對象用來存儲特定用戶會話所需的屬性及配置信息。當會話過期或被放棄后,服務器將終止該會話。,即該是否僅被使用安全協議傳輸。安全協議有,等,在網絡上傳輸數據之前先將數據加密。 上一篇文章:Python3網絡爬蟲實戰---17、爬蟲基本原理下一篇文章:Python3網絡爬蟲實戰---19、代理基本原理 在瀏覽網站的過程中我們經常會遇到需要登錄的情況,有些頁面只有登錄之后我們才可以訪問...
摘要:每次消費時,如果顧客出示這張卡片,則此次消費就會與以前或以后的消費相聯系起來。由于可以被人為的禁止,必須有其他機制以便在被禁止時仍然能夠把傳遞回服務器。 github 地址:戳這里 session 概念 指一類用來在客戶端與服務器之間保持狀態的解決方案 這種解決方案的存儲結構 特點 由于 Session 是以文本文件形式存儲在服務器端的,所以不怕客戶端修改 Session 內容。...
摘要:的作用就是為了解決協議無狀態的缺陷所作的努力。的內容主要包括名字,值,過期時間,路徑和域。這種生命期為瀏覽器會話期的被稱為會話。而機制采用的是一種在服務器端保持狀態的解決方案。中的有效期默認分鐘,也就是說,客戶端超過分鐘,當前就會失效。 會話控制是什么? cookie和session都是跟蹤整個會話過程的技術手段。而會話,就是用戶通過瀏覽器和服務器的一次通話。 為什么要有會話控制? 因...
閱讀 2335·2021-11-15 11:38
閱讀 3544·2021-09-22 15:16
閱讀 1187·2021-09-10 11:11
閱讀 3156·2021-09-10 10:51
閱讀 2921·2019-08-30 15:56
閱讀 2774·2019-08-30 15:44
閱讀 3185·2019-08-28 18:28
閱讀 3525·2019-08-26 13:36