js 设置cookies 过时了为什么还能读到
发布时间:2025-05-22 00:25:11 发布人:远客网络
一、js 设置cookies 过时了为什么还能读到
1、了解一下cookie的创建与删除机制
2、由header中的setcookie创建,由js创建等
3、当打开一个页面后,浏览器先检查cookie的有效期,过期就删除cookie
4、但如果你没有重新打开含过期cookie的页面,则cookie永远不会过期,就是说cookie不会自己主动被删除,而是在访问时发现已过期才会被删除
5、你这个代码都在一个页面,只有在页面载入时检测cookie是否过期,所以仍能够读取到过期的cookie
二、js怎么设置cookie得到cookie删除cookie
1、avaScript是运行在客户端的脚本,因此一般是不能够设置Session的,因为Session是运行在服务器端的。
2、而cookie是运行在客户端的,所以可以用JS来设置cookie.
3、假设有这样一种情况,在某个用例流程中,由A页面跳至B页面,若在A页面中采用JS用变量temp保存了某一变量的值,在B页面的时候,同样需要使用JS来引用temp的变量值,对于JS中的全局变量或者静态变量的生命周期是有限的,当发生页面跳转或者页面关闭的时候,这些变量的值会重新载入,即没有达到保存的效果。解决这个问题的最好的方案是采用cookie来保存该变量的值,那么如何来设置和读取cookie呢?
4、首先需要稍微了解一下cookie的结构,简单地说:cookie是以键值对的形式保存的,即key=value的格式。各个cookie之间一般是以“;”分隔。
5、假设在A页面中要保存变量username的值("jack")到cookie中,key值为name,则相应的JS代码为:
6、document.cookie="name="+username;
7、假设cookie中存储的内容为:name=jack;password=123
8、则在B页面中获取变量username的值的JS代码如下:
9、var username=document.cookie.split(";")[0].split("=")[1];
10、function setCookie(name,value)
11、exp.setTime(exp.getTime()+ Days*24*60*60*1000);
12、document.cookie= name+"="+ escape(value)+";expires="+ exp.toGMTString();
13、var arr,reg=new RegExp("(^|)"+name+"=([^;]*)(;|$)");
14、if(arr=document.cookie.match(reg))
15、exp.setTime(exp.getTime()- 1);
16、document.cookie= name+"="+cval+";expires="+exp.toGMTString();
17、//那么把上面的setCookie函数换成下面两个函数就ok;
18、function setCookie(name,value,time)
19、exp.setTime(exp.getTime()+ strsec*1);
20、document.cookie= name+"="+ escape(value)+";expires="+ exp.toGMTString();
21、var str1=str.substring(1,str.length)*1;
22、//这是有设定过期时间的使用示例:
23、//h是指小时,如12小时则是:h12
24、setCookie("name","hayden","s20");
三、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的服务,将原始的字符始形式转换为一个对象。