asp跨域共用cookie和session的问题

       这几天因为网站涉及到二极域名共用session的问题,头痛。在网上找了好久的料,终于在csdn里面找到2004年前辈们讨论的解决方案,个人感觉很 受用。

 

楼主 yufeiyxl(与 飞)

我要向各位请教的是Cookie的跨域访问问题。   
        问题是这样的:   
        我 有一个网站,它有多个频道构成(比如说三个),他们共享一个数据库,这三个频道都提供登录功能,只要在其中的一个频道登录了,就直接可以进入其他频道,无 需再登录。   
        我看了几篇文章,还是没搞懂,希望各位高人,给与我帮助,解决之后立即给分。我先谢谢各位了。  

 

5 楼 net_lover(【孟子E章】)

跨越域的Cookie  
   
  日期:2003-1-8   10:12:34  
  作者:赵金东    
     
  所有的网站开发者都会非常喜欢cookie的强大特性和易用性,它在跟踪用户信息,建设人性化、个性化的网站方面,有着强大的作用,而且,又避免了使用数 据库的昂贵开销。但是,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").Domain="mydomaln.com"  
  Response.Cookies("MyCookle")("Username")=strUsername  
  Response.Cookies("MyCookle")("Password")=strPassword  
  读写cookie非常简单,上面的代码创建一个cookie并给cookie设置属性:域、过期时间,以及其他一些保存在cookie中的值。这 里,strUsename,strPassword是在前面某个地方设置的变量。然后,通过下面的语句在cookie中读取。  
  '读取Cookie  
  datExpDate=Request.Cookies("MyCookie")  
  strDomaln=Request.Cookies("MyCookle").Domain  
  strUsername=Request.Cookies("MyCookle")("Username")  
  strPassword=Request.Cookies("MyCookie")("Password")  
  更详细的信息,可以参考ASP的资料。  
   
  实现  
  简单地共享cookie的诀窍是重定向,一般过程为:  
  1.一个用户点击siteA.com。  
  2.如果用户没有siteA.com的cookie,就把用户重定向到siteB.com。  
  3.如果用户有siteB.com的cookie,把用户连同一个特殊的标志(将在下面解释)重定向回siteA.com,否则,只把用户重定向到 siteA.com。  
  4.在siteA.com创建cookie。  
  看起来很简单,仔细分析一下:siteA.com和siteB.com共享相同的用户设置,所以,如果用户有siteB.com的cookie(已经注 册),siteA.com能够同样读取cookie、提供cookie所允许的特性。这样,访问siteA.com的用户就如同访问了 siteB.com。  
  这个检查的环节应该在siteA.com中的文件所包含一个cookies.inc中实现。让我们看一下这段代码:  
  l—1  
  'SiteA.com"检查cookie  
  If   Request.Querystring("Checked")<>"True"   then  
  If   not   Request.Cookies("SiteA_Cookie").Haskeys   then  
  '重走向到siteB.com  
  Response.Redlrect("http://www.siteB.com/cookie.asp")  
  End   if  
  End   if  
   
  如果用户有一个siteA.com的cookie,则不需要做任何事情了;第一个if语句用来消除无限的循环。让我们看一下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   if  
  如果用户在siteB.com上仍没有cookie,于是,将他送回到siteA.com,并且通过在查询语句中提供一个叫做"checkd"的参数让应 用程序知道你已经检查过cookie了。否则,将用户送回到siteB.com,并退出循环。  
  然而,如果用户拥有siteB.com的cookie,我们需要将用户送回siteA.com并告诉siteA.com。为此,我们在数据库中附加一个唯 一的标志,username。所以,我们扩展siteA.com中的代码。  
  l—3  
  'SiteA.com  
  ...  
  ...  
  '检查标志  
  If   Request.Querystring("identifier")<>""   then  
  strUsername=Request.Querystring("identifier")  
  '记录到数据库  
  Response.Cookies("siteA_Cookie").Expires=Date+365  
  Response.Cookies("SiteA_Cookie").Domain="siteA.com"  
  Response.Cookies("siteA_Cookie")("Username")=strUsername  
  End   if  
  最后,我们回到siteA.com。文件的第一部分(l-l)检查是否完成了cookie的检查,由于可以明显地知道已经完成(由语句中 的"checked"参数表明),进行到l—3所示的程序的第二部分。如果存在特殊的标志,我们就可以在siteA.com创建cookie。使用这个特 殊的标志(在这里是username),我们可以在任何需要的时候查询数据库。然后,设置cookie,显示页面的其他部分。如果没有指定的标志,也没必 要担心,只要简单地显示页面的余下部分。  
  这样,毫不费力地,siteA.com拥有了和siteB.com一样的cookie。我们可以传输更多的信息而不只是一个标志,并且,将网络流量控制在 最小范围内。  
  要注意一点,即使用户拥有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文件。  

 

14 楼 bluemoon0001(小 天--追梦浪子)

另一个贴的:  
   
  借用http://community.csdn.net/Expert/topic/3487/3487066.xml?temp=.723675  
  的思路,转为Session  
  比如:A站用户在A站登陆,验证能过后,在A站创建  
    session("username")=username  
    session("password")=password  
  Response.Redirect("http://www.siteB.com/login.asp"&"?checked=yes&username="&username&"&password="&password)  
   
  B站login.asp:  
   
  if   request("checked")=""   then   '本站提交的验证  
        ....  
  elseif   request("checked")="yes"   then   'A站带过来的验证(在A站已通过,在这里记录一下session)  
      session("username")=request("username")  
    session("password")=request("password")  
   
  else                   ''A站带过来的验证(在A站没通过,需要在B站验证)  
    在B站验证  
  end   if  
   
  验证过后,再导回A站多带一个标记参数,说明,这是是A站导过来的,在B站经过验证的,你自己再想想办法,做一下改动吧,这些是思路。 

 

15 楼 bluemoon0001(小天 --追梦浪子)

对上面做一个修改,你再看一下:  
   
    session("username")=username  
    session("password")=password  
  Response.Redirect("http://www.siteB.com/login.asp"&"?checked=yes&username="&username&"&password="&password&"&comeform="A)  
   
  B站login.asp:  
   
  if   request("checked")=""   then   '本站提交的验证  
          session("username")=username  
          session("password")=password  
          Response.Redirect("http://www.siteA.com/login.asp"&"?checked=yes&username="&username&"&password="&password&"&comeform=B")  
        elseif   request("checked")="yes"   then   'A站带过来的验证(在A站已通过,在这里记录一下session)  
      session("username")=request("username")  
    session("password")=request("password")  
    if   request("comeform")="A"   then  
        Response.Redirect("http://www.siteA.com/login.asp"&"?checked=yes&username="&username&"&password="&password&"&comeform=A")  
    end   if  
  elseif   request("comeform")="A"   then                   ''A站带过来的验证(在A站没通过,需要在B站验证)  
       
    在B站验证  
    ....  
    session("username")=username  
          session("password")=password  
          Response.Redirect("http://www.siteA.com/login.asp"&"?checked=yes&username="&username&"&password="&password&"&comeform=A")   '   通过checked设为yes没有设为no,在这里我假设的是通过的,没通过的,你自己写一下。  
  else  
        response.write   "用户名或密码错误"  
  end   if 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
A:在Web开发中,cookiesession和token都用于身份认证和保持用户状态,但它们的实现方式和具体用途不同。 1. cookie(HTTP cookie):是一种在客户端保存数据的机制,当用户访问网站时,服务器可以把需要保存的数据通过Set-Cookie响应头发送给客户端,浏览器会自动把这些数据保存在本地,之后每次请求时会把这些数据通过Cookie请求头发送给服务器cookie本质上是一组键值对,可以保存一些用户登录状态、偏好设置等信息。 2. session:与cookie类似,也是一种保持用户状态的机制,但它的实现方式不同。session是在服务器端创建的,客户端通过一个session ID与服务端进行交互,服务端维护着session数据。通常情况下,session ID会保存在cookie或者URL参数中。Session通过在服务器端保存用户登录状态可以提高安全性,因为Cookie可能被第三方截获。 3. token:token是一种在客户端和服务端之间传递认证信息的机制,一般是由服务端签发的,包含了一些认证信息和有效期等内容。客户端在登录成功后,服务端会返回一个token给客户端,在后续的请求中,客户端需要携带该token才能进行认证。token可以放在请求头、Cookie、URL参数等位置,具有跨域、跨平台等优势。相比于使用session,使用token能够将负载更多地分散到客户端。 总结:cookie是在客户端保存数据、session是在服务器端保存会话状态、token是一种通过客户端和服务器之间交互的证明身份机制。而且,它们在功能和使用方式上都存在着不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值