[英]Express.JS: Attach cookie to statically served content
我使用 Express.JS 提供 static 內容:
express.use(express.static('./../'));
當index.html
提供服務時,我想在響應中發送一個 cookie,指示用戶是否登錄。 通常應該使用res.cookie()
但我看不到如何將它用於靜態提供的內容。
不知道為什么需要這樣做,但是可以將自己的中間件放在static
模塊之前。
以下快速技巧應該可以起作用:
function attach_cookie(url, cookie, value) {
return function(req, res, next) {
if (req.url == url) {
res.cookie(cookie, value);
}
next();
}
}
app.configure(function(){
app.use(attach_cookie('/index.html', 'mycookie', 'value'));
app.use(express.static(path.join(__dirname, 'public')));
});
上面在static
中間件之前在中間件表達使用鏈中插入了另一個功能。 如果URL與您要查找的特定URL匹配,則新層將cookie附加到響應中,並將響應進一步傳遞到鏈下。
還考慮以下方法:
如果您的快遞服務落后於Web服務器,則可以投放靜態文件而不會打擾快遞服務-它應該比通過中間件更快。 如果使用nginx,這將有所幫助: Nginx使用Rewrite反向代理到Node.js。
假設您的靜態文件中包含javascript,您也可以直接在客戶端設置cookie,僅從表達請求此cookie所需的數據中進行請求:
document.cookie = "user_id=" + user_id;
Flanagan的JS權威指南(第6版!)很好地介紹了如何在客戶端javascript中使用cookie(除了在JavaScript書籍中是最好的:)。
這可能是一個微不足道的建議,但我已經看到了以下流程(不止一次):客戶端發送API請求(很明顯地,它附加了一個cookie),服務器從cookie獲取數據並完全基於Cookie中包含的數據。 所有這一切,而不僅僅是在客戶端靜默讀取此cookie。 基本上,客戶端會詢問服務器它自己的cookie中包含什么。
在您的方案中,您只需要請求一次user_id / access_key,然后始終檢查客戶端中的cookie,僅將客戶端不具有的數據轉到服務器,而是存儲和檢查會話狀態,並且可能緊湊大多數頁面在本地Cookie中使用的數據(例如用戶名)(您也可以將數據緩存在本地存儲中,以進一步減輕服務器負載)。 在這種情況下,express甚至都不知道用戶是否意外刷新了頁面(當然,如果您也沒有更改URL以反映應用程序狀態,或者僅更改#-part)。
由於自Express.js v4起刪除了 app.configure,因此我想進行更新。
對於大於4的Express.js版本,通過在express.static(root, [options])
方法內傳遞選項來初始化我的app
,在該方法中,您可以在名為setHeaders
的屬性中傳遞Set-Cookie
標頭:
app.use(express.static(publicPath, {
setHeaders: function (res, path, stat) {
res.set('Set-Cookie', "myCookie=cookieValue;Path=/")
}
}));
設置Path=/
很重要,因為否則express會在客戶端創建大量cookie的副本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.