ASP和JavaScript设置和读取Cookies

2014 年 8 月 8 日4180

当前位置:CMS001

> ASP/VB Script

ASP和JavaScript设置和读取Cookies

来源:本站收集

评论: 点击:

去年的一个项目用到了大量的服务端和客户端的认证。服务端比较单纯,只用到数据库和session的判断,但在客户端,不仅有ASP生成的Cookies,为了能尽量减少服务器的资源和以后后台语言的移植考虑,我还用到了javascript生成Cookies,可惜当时做完了没有总结,现在又得需要cookies,所以只能重新拾起。

项目需求:因为我已经把整个网站静态化(并不是伪静态化),生成了html,所以无法用一个asp页面直接读取cookies,我考虑了两种方案:

一、在首页需要显示已经登录的用户名的地方,采用ajax导入一个asp文件,通过这个asp文件判断是否登录,如果已经登录,则显示用户名和欢迎信息,如果还未登录,则response出登陆框。
但后来考虑了下这样并不可行,最大的原因是不止一个首页需要非静态的显示用户名,这样子每个页面都使用ajax导入一个页面,失去了静态化节省服务器资源的意义。

二、在登录时用session验证,验证成功后在客户端写入cookies,然后在各个页面用javascript判断客户端是否有cookies,有则显示用户名,没有则提示登录。
这里“在客户端写入cookies”又有两个选择:

<一>、用asp生成cookies

因为当前本来的网站系统在登录时选择“记住我”时用的就是asp生成的cookies,为了能一致和更好的继承,当然用asp生成cookies比较好,但asp生成的cookies有一些局限:
1、必须设置Expires,网上说不设置Expires这样cookies就会在关闭浏览器时消失,我要的正是这个效果,但实际测试时却发现不设置cookies的expires或者把expires设置为较早之前的根本就不会生成cookies文件,而且就是已经生成的cookies文件被这么重新设置一下也没了。
在C:\Documents and Settings\Administrator\Cookies和C:\Documents and Settings\Administrator\Local Settings\Temporary Internet Files,或者用IECookiesview均无法找到。
所以其实在asp中,没有设置expires的cookies虽然也能保存登录状态,但其实并不会生成在客户端,更像是一个客户端的session。而我的要求就是要通过客户端的cookies文件,用客户端的js取得cookies的值,所以用asp生成的方法显然不行。(js取不到,但通过asp就可以取到了,虽然cookies没写在硬盘上,但实际上它应该是在浏览器的内存上,asp的话可以取到,比如动网的登陆就是通过session和cookies共同判断的,而且我实际用时也发现在不自动登录时也可以用asp读取cookies)
2、不能用javascipt直接读取,还必须写一些函数来读取。不过这是小问题甚至算不上问题。

<二>、用javascript生成cookies

javascript创建cookies的机制和asp的不一样,一旦创建,就有了一个txt的cookies文件,不存在ASP中创建cookies后但没有cookies文件的情况。wrong! javascript也一样,如果没有设置expires,一样没有生成cookies文件,但可以在客户端读取(ASP也能读取,但只能在服务器端)。这样子就可以用html来读取用户名了。

现在看来只能使用这个方法了。还好我以前为了移植和重用考虑,把整个cookies的生成函数都放在cookies.js中,现在拿起来重用很方便。

虽然javascript生成cookies,会把生成的代码都暴露出来,但其实并不影响安全性——因为我验证登陆还是使用session的,javascript只是取到了登陆后的用户名。即便有人伪造js生成的cookies,他仍旧无法登录。

另外说一下我的调试环境,是在虚拟机的windows 2003中用IE6调试,因为虚拟机不拿来上网,只用来调试程序,没什么缓存和cookies内容,所以调试起来非常方便,一个Cookies文件夹内就一个调试中的Cookies,不用Opera或FF,甚至都可以不用IECookiesView。

这样子会导致下面这种情况:
因为服务器端的session有个超时的期限,可能这时已经跟服务器断开了连接,没有了服务器端的session认证,应该说是已经退出了,但JavaScript产生的cookies还没被删除,所以仍就显示着用户名,但一旦要进入某些需要认证的页面时,又得重新登录。这跟淘宝很像,淘宝应该也是使用到了JavaScript产生cookies,关闭了浏览器下次打开后仍然显示着自己的用户名,但要查看“我的淘宝”时就提示你重新登录。这么大的站都这么做,看来这么做并无危险。

附:

ASP设置cookies:

1.如何写入Cookies:
Response.Cookies("字段名")=变量或字符串,例如:
Response.Cookies("name1")="cfy"

2.如何设置Cookies时间:
Response.Cookies("字段名").expires=时间函数+N,例如:
Response.Cookies("name1").expires=date+1,表示Cookies保存1天
更多的参考:设置Expires的三大类方法

3.如何读取Cookies:
变量名=Request.Cookies("字段名")

4.如何清除Cookies:
Response.Cookies("字段名")=""

JavaScript简单设置cookies:

用JavaScript创建随浏览器进程消失的cookies(类似于服务器端session):
document.cookie=cookiename+"="+cookievalue+"; path=/"; (path是非必须的,但如果没有path=/,则在根目录下无法读取子目录下的cookies。删除时也必须设置path=/,否则子目录下文件就无法删除根目录产生的cookies。
这样并不会产生一个cookies的txt,但却可以用JavaScript读取到cookiename的cookievalue。
更多的可见我去年写的这个cookie.js,这个js包含三个函数,第一个函数有cookiename和cookievalue两个参数,第二个函数只有cookiename这个参数,第三个函数有cookiename、cookievalue和days三个参数,适应于不同的场合。

参考资料:
静态页面利用JS读取cookies记住用户信息
设定Cookie 变量的生命周期:若我们没有指定Expires 属性,则Cookie 变量将不会被储存,会像Session 一样浏览器关闭 结束浏览便被毁灭。不Cookie 一但设定有效期限后,除非我们将Expires 属性设为「dbNull」, 否则有日期期限的Cookie 无法被移除。
ASP读取的Cookies为何与JS读取的Cookies不同
asp关闭浏览器后COOKIES为什么不失效:没有指定期限的Cookie只能通过浏览器所提供的Cookies功能,将信息暂时存放在用户端,而不能以文件的形式存储到用户的计算机上,当用户关闭该浏览器时,此Cookie自动失效。所以无失效期的Cookie不能跟踪用户的信息。要延长Cookie的生命周期,跟踪用户来访信息,就必须用Expires属性来设置Cookie的失效时间。
使用JavaScript控制Cookie:没有设置expires元素的Cookie在用户断开连接后过期,但在用户关闭浏览器之前Cookie依然存在。Cookie有一个过期时间并等于它会从Cookie.txt文件中被删除。在它的位置被用来存放另一个Cookie前,它依然存在着。过期的Cookie只是不被送往要求使用它的服务器。
什么是COOKIES,ASP要怎么设置COOKIES:链接

查看所有评论

最新评论

查看所有评论

发表评论

请文明参与讨论,禁止漫骂攻击。

0 0