nodejs怎么设置cookie
发布时间:2025-05-22 02:43:52 发布人:远客网络
一、nodejs怎么设置cookie
通过node.js建立了一个完整的网站不是一件容易的事,这涉及读取页面模板,从数据库中抽出数据构建成新的页面返回给客户端。但光是这样还不行,我们还要设置首部,在chrome中如果CSS没有设置正确的Content-Type,会不起作用的。此处理还要考虑访问量,要设置缓存,缓存不单单是把东西从内存中读入读出就行,这样会撑爆电脑内存的,这用LRU算法(最近最少用的数据会清空出内存)。基于Cookie与数据库与URL重写,我们发展出一个session机制用于在多个action中通信。对于不同的请求交由不同的action来处理,就要发展出路由机制与MVC系统,等等。我信后写这些东西一点点写出来,揭示newland.js中遇到的种种问题与解决方案。如果什么都贪图方便,直接上框架,对我们语言学习是非常不利的。
本文正如标题所说,是操作Cookie。下面是一个完整的例子:
如果去掉其中几句,就是官方给出的例子,除了表明返回一个页面多简单外,一点用也没有。
我们通过http.createServer的回调来处理所有请求与响应,因此什么有用的东西都在它们上面。Cookie位于req对象的headers对象上,为一个字符串,通常为了方便我们将它们转换成一个对象。
写入一个Cookie其实就是在首部设置一个键值对,上面是简单方式,它实际上可以这样:
但真正使用时,我们的Cookie并非这样简单的的格式:
HttpOnly属性:这是微软对Cookie做的扩展。如果在Cookie中设置了"HttpOnly"属性,那么通过程序(JS脚本、Applet等)将无法读取到Cookie信息,这样能有效的防止XSS攻击。
然后多刷几次页面,我们发现我们还能在控制台看到SSID=Ap4GTEq这个属性,但在前端我们看不到它(当然在firebug中能看到)。
Secure属性:当设置为true时,表示创建的 Cookie会被以安全的形式向服务器传输,也就是只能在 HTTPS连接中被浏览器传递到服务器端进行会话验证,如果是 HTTP连接则不会传递该信息,所以不会被窃取到Cookie的具体内容。同上,在客户端我们也无法在document.Cookie找到被设置了Secure=true的Cookie键值对。Secure属性是防止信息在传递的过程中被监听捕获后信息泄漏,HttpOnly属性的目的是防止程序获取Cookie后进行攻击。我们可以把Secure=true看成比HttpOnly更严格的访问控制。
path属性:指定可访问Cookie的目录。例如:"userId=320; path=/shop";就表示当前Cookie仅能在shop目录下使用。
domain属性:指定可访问Cookie的主机名.主机名是指同一个域下的不同主机,例如:www.google.com和gmail.google.com就是两个不同的主机名。默认情况下,一个主机中创建的Cookie在另一个主机下是不能被访问的,但可以通过domain参数来实现对其的控制,其语法格式为:"name=value; domain=CookieDomain";以google为例,要实现跨主机访问,可以写为:"name=value;domain=.google.com";这样,所有google.com下的主机都可以访问该Cookie。
Expires属性:指定过期时间,格式为"name=value;; expires=GMT_String";其中GMT_String是以GMT格式表示的时间字符串,超过这个时间,Cookie将消失,不可访问。例如:如果要将Cookie设置为10天后过期,可以这样实现:
Max-Age属性:个人感觉这个东西比Expires更好用,本来就是用于代替Expires,由于市面上的书你抄我,我抄你,都在抄旧知识,导致Expires还在使用。Max-Age的值可以为正数,表示此Cookie从创建到过期所能存在的时间,以秒为单位,此Cookie会存储到客户端电脑,以Cookie文件形式保存,不论关闭浏览器或关闭电脑,直到时间到才会过期。可以为负数,表示此Cookie只是存储在浏览器内存里,只要关闭浏览器,此Cookie就会消失。maxAge默认值为-1。还可以为0,表示从客户端电脑或浏览器内存中删除此Cookie。
Cookie面向的主要是服务器,localstorage面向的是页面端js。页面所需的业务数据可以放在localstorage里,但是认证相关的信息还是需要放在Cookie里的。
一、浏览器允许每个域名所包含的 Cookie数:
Microsoft指出 Internet Explorer 8增加 Cookie限制为每个域名 50个,但 IE7似乎也允许每个域名 50个 Cookie(《Update to Internet Explorer’s Cookie Jar》)。
Firefox每个域名 Cookie限制为 50个。
Opera每个域名 Cookie限制为 30个。
Safari/WebKit貌似没有 Cookie限制。但是如果 Cookie很多,则会使 header大小超过服务器的处理的限制,会导致错误发生。
二、当很多的 Cookie被设置,浏览器如何去响应。除 Safari(可以设置全部Cookie,不管数量多少),有两个方法:
最少最近使用(least recently used(LRU))的方法:当 Cookie已达到限额,自动踢除最老的 Cookie,以使给最新的 Cookie一些空间。 Internet Explorer和 Opera使用此方法。
Firefox很独特:虽然最后的设置的 Cookie始终保留,但似乎随机决定哪些 Cookie被保留。似乎没有任何计划(建议:在 Firefox中不要超过 Cookie限制)。
三、不同浏览器间 Cookie总大小也不同:
Firefox和 Safari允许 Cookie多达 4097个字节,包括名(name)、值(value)和等号。
Opera允许 Cookie多达 4096个字节,包括:名(name)、值(value)和等号。
Internet Explorer允许 Cookie多达 4095个字节,包括:名(name)、值(value)和等号。
注:多字节字符计算为两个字节。在所有浏览器中,任何 Cookie大小超过限制都被忽略,且永远不会被设置。
最后让我们看看newland.js是怎么处理cookie的。
newland.js有个重要的对象叫httpflow,其实就是我的操作流flow的子类,它劫持了所有清求与响应。当一个请求过来时,框架就会new一个httpflow去处理它们。它有个patch方法,用于为操作流添加一些有用属性与方法,而不像express.js那样直接在原生对象上改。实现express.js现在的做法有点像Prototype.js,加之node.js的版本现在还没有到1.0,因此API改动还很频繁的。express.js的行为无异走钢线。而把操作移到一个自定义对象就安全多了。
此外,httpflow还劫持res.writeHead,res.setHeader,目的为实现多次调用setCookie时而不相互覆盖。
此外操作流还有两个有用的方法来添加或移除Cookie。
实质上,经过上面的代码,我们就好方便多次添加或删除Cookie。个人认为用setHeader来操作(即使它已经被偷龙转凤还是不怎么好用),大家还是用addCookie, removeCookie来干吧。这些操作会在用户第一次调用当前的res.whireHead生效!
如果你想查看从客户端来的cookie,那么直接看flow.cookie好了,它会在途中调用一个get_cookie的服务,将原始的字符始形式转换为一个对象。
二、js简单设置与使用cookie的方法
JS简单设置与使用Cookie的方法:
使用`document.cookie`属性可以设置cookie。例如:`document.cookie="username=John";`这将创建一个名为"username"、值为"John"的cookie。
可以通过`document.cookie`属性读取已存在的cookie。例如,要读取名为"username"的cookie的值,可以使用以下代码:`var username= document.cookie;`。请注意,这需要解析cookie字符串来找到特定的值。
要删除一个cookie,可以设置其过期时间为过去的时间。例如,要删除名为"username"的cookie,可以将其过期时间设置为一个过去的时间点:`document.cookie="username=; expires=Thu, 01 Jan 1970 00:00:00 UTC;";`。
在JavaScript中,可以通过直接操作`document.cookie`属性来设置cookie。这是一个字符串,可以包含多个键值对,每个键值对表示一个cookie。例如,`document.cookie="username=John; expires=Fri, 31 Dec 2023 23:59:59 UTC; path=/"`会创建一个名为"username"、值为"John"、有效期至2023年12月31日并且路径为根路径的cookie。其中,expires属性表示过期时间,path属性表示cookie的路径。当不设置这些属性时,默认行为可能会有所不同,取决于浏览器的实现。
要读取已存在的cookie的值,可以使用`document.cookie`属性并配合字符串操作函数来解析返回的字符串。因为`document.cookie`返回的是所有cookie的字符串形式,所以需要手动解析出需要的值。如果没有找到特定的cookie名称,返回的字符串可能不包含该名称的信息。
删除cookie的原理是将其过期时间设置为过去的时间点,使得浏览器认为它已经过期并被自动删除。要注意的是,并非所有浏览器都会在设置过期时间后立即删除数据;在某些情况下,即使设置了过期时间,浏览器也可能仍然保留数据一段时间。因此在实际应用中可能需要额外的逻辑来处理这种情况。同时,如果cookie被设置为secure或httpOnly,使用JavaScript删除它可能无法实现。这就需要通过服务器端的设置来完成操作。所以在实践中要确保考虑了所有这些方面的情况和可能的边界情况。
三、JS 操作 cookies 的方法
1、在 JS(JavaScript)操作cookies比较复杂,在 ASP里面我们只需要知道 cookie的名称、cookie的值就行了,而 JS里面,我们面对的是 cookie的字符串,你自己编写这个字符串写入客户端,然后自己解析这个字符串。
2、var the_date= new Date("December 31, 2020");
3、var expiresDate= the_date.toGMTString();
4、document.cookie="userDefineCSS="+ escape(title)+"; expires="+ expiresDate;
5、第二句将日期格式转换成 GMT格式;编者者: GMT即格林威治标准时间,现在也称 UTC即全球标准时间。
6、第三句是将 cookie内容写入客户端。
7、其中 expires是系统使用的,表示 cookie的失效日期(也可以省略),expires不可读。
8、 escape是对 cookie值进行编码,这是为了处理中文、空格等而设立的。
9、var cookieStr= document.cookie;//取 cookie字符串,由于 expires不可读,所以 expires将不会出现在 cookieStr中。
10、return"main1";//没有取到 cookie字符串,返回默认值
11、var cookieValue= cookieStr.split(";");//将各个 cookie分隔开,并存为数组,多个 cookie之间用分号加空隔隔开,不过前面我们只使用了一个 cookie,它的值与 expires之间也是用分号加空格隔开的
12、for(var i=0; i<cookieValue.length; i++)
13、startPos= cookieValue[i].indexOf(varName);
14、continue;//当前 cookie不是名称为 varName的 cookie,判断下一个 cookie
15、startPos+= varName.length+ 1;//当前 cookie就是名称为 varName的 cookie,由于有等号,所以+1
16、endPos= cookieValue[i].length;
17、var css= unescape(cookieValue[i].substring(startPos, endPos));