Express Sessions

如何使用sessions在請求之間識別用戶 預設情況下,Express請求是依序處理的,並且無法將請求相互關聯起來。除非使用某種機制來實現,否則無法知道該請求是否來自先前已執行請求的客戶端。 這就是sessions的作用。 一旦實施,您的API或網站的每個用戶將被分配一個唯一的session,這使您可以存儲用戶狀態。 我們將使用由Express團隊維護的express-session模塊。 您可以使用以下命令進行安裝 npm install express-session 一旦安裝完成,您可以在應用程序中實例化它 const session = require('express-session') 這是一個中間件,所以您需要在Express中安裝它 const express = require('express') const session = require('express-session') const app = express() app.use(session({ 'secret': '343ji43j4n3jn4jk3n' })) 完成後,應用程序路由的所有請求都將使用sessions。 secret是唯一的必需參數,但還有很多其他可用的參數。它應該是您應用程序的隨機唯一字符串。 session附加到請求上,所以您可以在這裡使用req.session進行訪問: app.get('/', (req, res, next) => { // req.session } 此對 象可用於從session獲取數據,並用於設置數據: req.session.name = 'Flavio' console.log(req.session.name) // 'Flavio' 在存儲時,此數據序列化為JSON,因此您可以安全使用嵌套對象。 您可以使用sessions將數據傳遞給稍後執行的中間件,或者在後續的請求中檢索數據。 會話數據存儲在哪裡?這取決於您如何設置express-session模塊。 它可以將會話數據存儲在 內存,不適用於生產環境 如MySQL或Mongo之類的 數據庫 如Redis或Memcached之類的 內存緩存 在 https://github.com/expressjs/session 中有一個支持各種不同兼容緩存存儲的第三方包列表 所有解決方案都將會話ID存儲在cookie中,並在服務器端保存數據。客戶端將在cookie中接收會話ID,並將其與每個HTTP請求一起發送。 我們將在服務器端引用這個會話ID,以將其與本地存儲的數據關聯起來。 內存是默認選項,您無需進行特殊設置,但它只適用於開發目的。 最佳選擇是像Redis這樣的內存緩存,您需要設置它自己的基礎架構。 在Express中管理會話的另一個流行包是cookie-session,它的一大不同之處在於它將數據客戶端存儲在cookie中。我不建議這樣做,因為將數據存儲在cookie中意味著它存儲在客戶端,並在用戶發出的每個請求中來回傳輸。它的大小也受限制,因為它只能存儲4KB的數據。 Cookie還需要進行安全配置,但默認情況下它們並未進行安全配置,因為安全Cookie僅適用於HTTPS站點,如果有代理,則需要對其進行配置。

如何在 Next.js 應用程式中在伺服器端獲取 Cookie

在 Next.js 中,在伺服器端渲染時存取 Cookie 可能比你想像中困難。以下是我解決這個問題的方法。 我遇到了這個問題。我的應用程式依賴於Cookie進行身份驗證,在使用 Next.js 時,顯然我的 Cookie 在首頁初始化時未被設置。 以下是負責使用Axios對一個 GET 端點進行請求的程式碼: Bookings.getInitialProps = async ctx => { const response = await axios.get('http://localhost:3000/api/bookings/list') return { bookings: response.data } } 我在伺服器端的端點上有 Passport.js,但它無法在 SSR 頁面上對用戶進行身份驗證,因為它找不到任何 Cookie。 我必須將程式碼更改為以下形式,將 Cookie 添加到 headers 中: Bookings.getInitialProps = async ctx => { const response = await axios({ method: 'get', url: 'http://localhost:3000/api/bookings/list', headers: ctx.req ? { cookie: ctx.req.headers.cookie } : undefined }) return { bookings: response.data } } 讓 Cookie 在後端中可用的關鍵是添加:...

如何在 PHP 中使用 Cookies

Cookies 是瀏覽器的一項功能。 當我們向瀏覽器發送一個響應時,我們可以設置一個 cookie,並且該 cookie 會通過瀏覽器在客戶端保存。 然後,瀏覽器發送的每個請求都會將 cookie 返回給我們。 我們可以使用 cookie 來做很多事情,它們主要用於在不需要登錄服務的情況下創建個性化體驗。 需要注意的是,cookie 是特定於域名的,所以我們只能讀取我們設置在應用程序當前域名上的 cookie,不能讀取其他應用程序的 cookie。 但是 JavaScript 可以讀取 cookie(除非它們是HttpOnly cookies,但這樣我們就要進入一個兔子洞了),所以 cookie 不應該存儲任何敏感信息。 我們可以使用 PHP 通過引用 $\_COOKIE 超全局變量來讀取 cookie 的值: if (isset($\_COOKIE['name'])) { $name = $\_COOKIE['name']; } setcookie() 函數允許您設置一個 cookie: setcookie('name', 'Flavio'); 我們可以添加第三個參數來指定 cookie 的過期時間。如果省略,則 cookie 在會話結束時(或瀏覽器關閉時)過期。 使用以下代碼使 cookie 在 7 天後過期: setcookie('name', 'Flavio', time() + 3600 \* 24 \* 7); 我們在 cookie 中只能存儲有限的數據量,而且用戶在清除瀏覽器數據時可以在客戶端清除 cookie。 同時,cookie 是特定於瀏覽器/設備的,所以我們可以在用戶的瀏覽器中設置一個 cookie,但如果他們更換了瀏覽器或設備,該 cookie 將不可用。...

導航器對象

了解什麼是導航器對象以及如何使用它。 瀏覽器提供的window.navigator屬性指向一個導航器對象,它是一個容器對象,提供了許多 Web 平台 API。 標準且被廣泛實現的屬性包括: cookieEnabled - 如果啟用了 cookies,則返回 true。 geolocation - 指向由 Geolocation API 使用的Geolocation對象。 language - 返回表示瀏覽器當前語言的字符串。 onLine - 如果瀏覽器處於在線狀態,則返回 true(不同瀏覽器對此解釋方式不同,請注意)。 serviceWorker - 分配給文檔的ServiceWorkerContainer對象(請參閱Service Workers)。 userAgent - 瀏覽器的用戶代理識別符。 標準的方法包括: registerProtocolHandler() - 一種讓網站以協議處理程序身份註冊的方式。 還有許多其他的方法和屬性,這些方法和屬性可能是實驗性的,或者只在少數瀏覽器上實現並且尚未最終確定,因此我沒有在這裡列舉它們,但是你可以在 MDN 上探索它們。