Node中的Cookie和Session

来源:https://www.cnblogs.com/danew/archive/2019/08/26/11415672.html
-Advertisement-
Play Games

1、Cookie HTTP是無狀態協議。例:打開一個功能變數名稱的首頁,進而打開該功能變數名稱的其他頁面,伺服器無法識別訪問者。即同一瀏覽器訪問同一網站,每次訪問都沒有任何關係。 Cookie的原理是:客戶端瀏覽器在第一次訪問伺服器後,伺服器返回一段json數據進行標識,此後當客戶端瀏覽器再次訪問同一個域時,每次都 ...


1、Cookie

HTTP是無狀態協議。例:打開一個功能變數名稱的首頁,進而打開該功能變數名稱的其他頁面,伺服器無法識別訪問者。即同一瀏覽器訪問同一網站,每次訪問都沒有任何關係。

Cookie的原理是:客戶端瀏覽器在第一次訪問伺服器後,伺服器返回一段json數據進行標識,此後當客戶端瀏覽器再次訪問同一個域時,每次都攜帶此cookie信息。

特點

  • cookie是不加密的,用戶可以自由看到;
  • 用戶可以刪除cookie,或者禁用它,未設置失效時間,則預設關閉瀏覽器後失效
  • cookie可以被篡改
  • cookie可以用於攻擊
  • cookie存儲量很小。(小於4k)

Cookie具有不可跨功能變數名稱性。根據Cookie規範,瀏覽器訪問Google只會攜帶Google的Cookie,而不會攜帶Baidu的Cookie。Google也只能操作Google的Cookie,而不能操作Baidu的Cookie。

cookie在Node.js中使用:

 1 const cookieParser = require('cookie-parser');     //模塊  cookie-parser
 2 const app = express();
 3 app.use(cookieParser());               //中間件
 4 app.get('/',(req,res)=>{
 5     res.send('根路由');
 6 })
 7 app.get('/login',(req,res)=>{
 8     //獲取客戶端cookies
 9     console.log(req.cookies);
10 
11     //伺服器下發cookie
12     res.cookie('heaven','666',{
13         maxAge:900000                //有效時間,毫秒
14     });
15     res.send('ok');
16 })
17 
18 app.listen(3000);

2、Session

伺服器需要記錄用戶的狀態,依賴cookie跟蹤session,第一次創建session時,服務端會在HTTP協議中告訴客戶端,需要在cookie裡面記錄一個session ID,以後客戶端每次請求攜帶此session ID,伺服器就能識別客戶端。

特點

  • Session不是一個天生就有的技術,而是依賴cookie。當一個瀏覽器禁用cookie的時候,登錄效果消失;或者用戶清除了這個cookie,登錄也消失;
  • session比cookie不一樣在哪裡呢?session下發的是亂碼,並且伺服器自己緩存一些東西;下次瀏覽器帶著亂碼上來,此時與緩存進行比較,看看是誰?
session在Node.js中使用
/*
     session  數據存放在服務端,但索引存放在瀏覽器,瀏覽器是根據cookieid識別對應的session
     npm i express-session -S  使用session模塊
 */
const express = require('express');
const session = require('express-session');     // 解析session的模塊    express-session
const app = express();

//啟動session的中間件,公式
app.use(session({           //要求客戶端設置一個加密的cookie
    secret:'heaven',        //任意字元都行,給cookie加密
    cookie:{maxAge:300000},
    resave:true,
    saveUninitialized:true,
}))
//中間件是按先後順序執行的,所以放在前面攔截
app.get('/favicon.ico',(req,res)=>{
    return;
})

app.get('/',(req,res)=>{
    res.send('你的足跡是'+req.session.lvyou);
})
app.get('/:city',(req,res)=>{
    let city = req.params.city;
    // console.log(req.session);
    let cityArr = req.session.lvyou || [];
    cityArr.push(city);
    req.session.lvyou = cityArr;
    res.send("你今天去了"+city);
})

app.listen(3000);
/*
       將session從記憶體中提取到mongo資料庫內
       npm i connect-mongo -S     將session存入mongo資料庫的模塊
*/
const express = require("express"),
    app = express(),
    session = require("express-session"),
    Mongosession = require("connect-mongo")(session),
    mongoose = require("mongoose");
//連接資料庫
mongoose.connect("mongodb://localhost/bounty",{useNewUrlParser: true})
//session公式
app.use(session({
    secret:"doukeyi",           //秘鑰,加密
    rolling:true,               //每次交互(操作頁面,a標簽,ajax)重新設定時間
    cookie:{maxAge:1000*60*60}, //cookie有效期 1小時
    resave:false,               //是否每次請求都重新保存數據
    saveUninitialized:false,    //是否預設設置初始值
    store:new Mongosession({
        url:"mongodb://localhost/bounty"        //session存入資料庫,到期後自動清除資料庫
    })
}))
/*
    清除session
*/
router.get("/logout",function (req,res) {
    req.session.destroy();
    res.redirect("/login");
})

3、區別

  • cookie是明碼;session是亂碼;
  • cookie存在客戶端瀏覽器; session存在伺服器;
  • cookie記憶體小;session記憶體大;

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 版權聲明:本文為xing_star原創文章,轉載請註明出處! 本文同步自http://javaexception.com/archives/203 完美解決google nexus設備全面屏主題crash問題 前面有一篇文章,記錄了我在app升級到targetSdk 27中,出現的bug,文章位於  ...
  • 上一篇梳理了擁有單個子元素佈局的Widget,今天來梳理一下擁有多個子元素佈局的Widget。 Row Row組件常見屬性如下: mainAxisAlignment:主軸的排列方式 crossAxisAlignment:次軸的排列方式 mainAxisSize:... ...
  • 要論時下最火的網路請求框架,當屬OkHttp了。自從Android4.4開始,google已經開始將源碼中的HttpURLConnection替換為OkHttp,而在Android6.0之後的SDK中google更是移除了對於HttpClient的支持,而市面上流行的Retrofit同樣是使用OkH ...
  • 這篇文章主要為大家詳細介紹了Android佈局之輸入框EditText設計,具有一定的參考價值,感興趣的小伙伴們可以參考一下 現在先簡單介紹一下技術點: 1.如何使用圓角輸入框和按鈕背景 2.如何實現“手機號”、“密碼”後面的豎線 3.如何嵌套輸入框的佈局 4.如何監聽輸入框的輸入事件及刪除按鈕的動 ...
  • 入門學習Flutter有一段時間了,Demo用過的Widget也有不少,想著整體的梳理一下,所以今天結合Flutter中文網和書籍梳理一下Widget的使用,首先梳理一下擁有單個子元素的佈局Widget。 Container:一個擁有繪製、定位、調整大小的Widget Pad... ...
  • 記錄一個插入排序寫法 運行結果: ...
  • 相信凡是編程入門的都接觸過冒泡排序演算法,排序演算法在編程中經常用到。 1. code 2. 演算法分析 (1)時間複雜度 ​ 若文件的初始狀態是正序的,一趟掃描即可完成排序。所需的關鍵字比較次數C和記錄移動次數M均達到最小值: 所以,冒泡排序最好的時間複雜度為 O(n)。 若初始文件是反序的,需要進行n ...
  • 1、在ES5中我們定義一個變數是通過 var 關鍵字來定義的。如:var name = 'zjl' var obj = {name:'zjl',age:'18'} 2、在ES6中新引進了兩個定義變數的關鍵字 let 和 const。 3、ES6之 let: let 的用法和 var 很類似,但它存在 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...