专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Asp教程 » cookie跨域:跨越域的Cookie »正文

cookie跨域:跨越域的Cookie

来源: 发布时间:星期四, 2009年2月12日 浏览:296次 评论:0


所有网站WebSite开发者都会非常喜欢cookie强大特性和易用性它在跟踪用户信息建设人性化、个性化网站WebSite方面有着强大作用而且又避免了使用数据库昂贵开销但是cookie却不能跨越域传递只有那些创建它域才能访问;这里我们讨论如何利用ASP突破这个限制
Cookie介绍
首先我们对Cookie做个简单介绍介绍说明如何利用ASP来维护cookie
Cookie是存储在客户端计算机中个小文件这就意味着每当个用户访问你站点你就可以秘密地在它硬盘上放置个包含有关信息文件这个文件几乎可以包含任何你打算设置信息包括用户信息、站点状态等等这样就有个潜在危险:这些信息有可能被黑客读取为了防止这个问题发生个有效办法就是cookie只能被创建它域所存取这就是说:比如ytu.edu.cn只能访问ytu.edu.cn创建cookie通常来讲这没有什么问题;但是如果需要两个区别域上两个区别站点共享保存在cookie中用户信息该如何处理呢?当然可以选择复制用户信但是如果你需要用户只能在个站点上注册并且自东成为另外个站点注册用户呢?或者两个站点共享个用户数据库而又需要用户自动登录呢?这时候跨越域共享cookie是最好解决方案
这里先看些ASP处理cookie代码以便以后便于引用参考
\'创建Cookie
Response.Cookies(\"MyCookie\").Expires=Date+365
Response.Cookies(\"MyCookle\").Do=\"mydomaln.com\"
Response.Cookies(\"MyCookle\")(\"Username\")=strUsername
Response.Cookies(\"MyCookle\")(\"Password\")=strPassword
读写cookie非常简单上面代码创建个cookie并给cookie设置属性:域、过期时间以及其他些保存在cookie中这里strUsenamestrPassword是在前面某个地方设置变量然后通过下面语句在cookie中读取
\'读取Cookie
datExpDate=Request.Cookies(\"MyCookie\")
strDomaln=Request.Cookies(\"MyCookle\").Do
strUsername=Request.Cookies(\"MyCookle\")(\"Username\")
strPassword=Request.Cookies(\"MyCookie\")(\"Password\")
更详细信息可以参考ASP资料

实现
简单地共享cookie诀窍是重定向般过程为:
1.个用户点击siteA.com
2.如果用户没有siteA.comcookie就把用户重定向到siteB.com
3.如果用户有siteB.comcookie把用户连同个特殊标志(将在下面解释)重定向回siteA.com否则只把用户重定向到siteA.com
4.在siteA.com创建cookie
看起来很简单仔细分析下:siteA.com和siteB.com共享相同用户设置所以如果用户有siteB.comcookie(已经注册)siteA.com能够同样读取cookie、提供cookie所允许特性这样访问siteA.com用户就如同访问了siteB.com
这个检查环节应该在siteA.com中文件所包含个cookies.inc中实现让我们看下这段代码:
l—1
\'SiteA.com\"检查cookie
If Request.Query(\"Checked\")<>\"True\" then
If not Request.Cookies(\"SiteA_Cookie\").Haskeys then
\'重走向到siteB.com
Response.Redlrect(\"http://www.siteB.com/cookie.asp\")
End
End

如果用户有个siteA.comcookie则不需要做任何事情了;第语句用来消除无限循环让我们看下siteB.com上cookie.asp文件来获得进理解
1—2
\'SiteB.com
\'检查cookie
If not Request.Cookies(\"SlteB_Cookle\").Haskeys then
\'重定向到 siteA.com
Response.Redirect(\"http://www.siteA.com/index.asp\"&\"?checked=True\")
Else
\'获取username
strUsername=Request.Cookies(\"SiteB_Cookie\")(\"Username\")
\'将用户连同个特殊标志返回到siteA.com
Response.Redlrect(\"http://www.siteA.com/index.asp\"&\"?checked=True\"&\"identrfer=\"&strUsername)
End
如果用户在siteB.com上仍没有cookie于是将他送回到siteA.com并且通过在查询语句中提供个叫做\"checkd\"参数让应用知道你已经检查过cookie了否则将用户送回到siteB.com并退出循环
然而如果用户拥有siteB.comcookie我们需要将用户送回siteA.com并告诉siteA.com为此我们在数据库中附加个唯标志username所以我们扩展siteA.com中代码
l—3
\'SiteA.com
...
...
\'检查标志
If Request.Query(\"identier\")<>\"\" then
strUsername=Request.Query(\"identier\")
\'记录到数据库
Response.Cookies(\"siteA_Cookie\").Expires=Date+365
Response.Cookies(\"SiteA_Cookie\").Do=\"siteA.com\"
Response.Cookies(\"siteA_Cookie\")(\"Username\")=strUsername


End
最后我们回到siteA.com文件部分(l-l)检查是否完成了cookie检查由于可以明显地知道已经完成(由语句中\"checked\"参数表明)进行到l—3所示第 2部分如果存在特殊标志我们就可以在siteA.com创建cookie使用这个特殊标志(在这里是username)我们可以在任何需要时候查询数据库然后设置cookie显示页面其他部分如果没有指定标志也没必要担心只要简单地显示页面余下部分
这样毫不费力地siteA.com拥有了和siteB.comcookie我们可以传输更多信息而不只是个标志并且将网络流量控制在最小范围内
要注意即使用户拥有siteA.com上cookie仍需要检查siteB.com通常来讲这不是必须也会节约时间但是旦用户在siteB.com更改个人信息?这样做会保持所有信息同步

Cookie环
要完成这些我们需要两个文件:个在原始站点服务器(siteA.com)完成检查;个在参考服务器(siteB.com)验证用户如果有台参考服务器包含有需要所有用户信息或cookie就可以增加随意多原始服务器所需要做就是在所有要共享cookie服务器上增加cookie.inc文件
也可以以相反次序执行例如如果siteB.com是原始服务器而siteA.com包含用户信息访问过siteA.com却从未访问过siteB.com用户也可以登录到siteA.com并且拥有所有曾经设置注意如果拥有多个参考服务器这样将会很使人迷惑并且消耗过多资源必须将用户重定向到每台参考服务器
理论上讲可以拥有个所有站点都共享相同用户网络最可行方案就是建立共享cookie环将参考服务器列表存储在个地方(备份服务器)以便每个参考服务器可以查找并决定重定向用户个站点记住定要通过查询意思跟踪用户是在哪个原始服务器开始这样信息传输非常迅速这个环节变得越来越可行
这里还存在些问题首先是反应时间对用户而言他们最好不知道过程是怎样他所需时间依赖于siteA.com、siteB.com的间连接有可能会比较长在实现cookie环时可能会更长
个主要问题就是每个实现者大都会面对无限重定向这有很多原因例如:用户测览器不支持cookie这就需要再设计代码来监测用户浏览器性能
最好还需要注意安全问题如果有些黑客发现了其中诀窍他可能会得到cookie中信息最简单防范办法就是保护参考服务器只允许原始服务器访问Cookie.asp文件
0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: