`
csstome
  • 浏览: 1527390 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

关于跨越域共享COOKIE的实现与维护

阅读更多

 所有的网站开发者都会非常喜欢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文件。

1
4
分享到:
评论

相关推荐

    如何使用localstorage代替cookie实现跨域共享数据问题

    因为cookie在跨域的情况下,浏览器根本不允许互相访问的限制,为了突破这个限制,所以有了以下这个实现方案,使用postmessage和localstorage进行数据跨域共享。 原理比较简单,但是遇到的坑也不少,这里梳理一下,做...

    webview与服务器共享cookie操作

    本篇将详细讨论如何实现"webview与服务器共享cookie操作"。 首先,理解cookie的工作原理至关重要。Cookie是由服务器发送到浏览器的一小块数据,用于存储用户状态信息,如登录状态、个性化设置等。当用户在浏览器中...

    WebBrowser跨进程共享Cookie

    在多进程环境中,确保Cookie的正确共享对于实现一致的用户体验至关重要。 首先,让我们理解什么是进程。进程是操作系统中运行的程序实例,每个进程都有自己的内存空间,包括代码、数据和资源。在Windows系统中,...

    用户登录功能(cookie实现)

    以下是关于使用Cookie实现用户登录功能的详细知识点: 1. **Cookie的基本概念**:Cookie是由服务器端发送到浏览器的一小段文本信息,浏览器在后续的请求中会将Cookie回传给服务器。它们可以用来保存用户偏好、会话...

    cookie实现的购物车

    在Web开发中,Cookie是一种非常重要的技术,常用于存储用户状态和数据,特别是在实现像购物车功能这样的场景中。本文将深入探讨如何使用Cookie来实现一个购物车功能,并阐述其工作原理、优缺点以及相关应用。 ...

    C#cookie实现历史记录

    通过这些基本操作,你可以用C#实现Cookie的完整生命周期管理,包括创建、读取、更新和删除。在实际项目中,通常还会结合Session、ViewData等技术,根据具体需求灵活地存储和恢复用户状态。对于大型应用,还可以使用...

    微信小程序cookie维护插件 实现自动设置获取cookie功能

    本文将详细讲解如何使用微信小程序中的cookie维护插件,实现自动设置和获取Cookie的功能,并特别关注增加的Cookie超时处理机制。 首先,理解Cookie的基本概念。Cookie是由服务器端生成,发送到客户端(浏览器)的一...

    php设置cookie,二级域名共享cookie方法,有例子使用很方便

    超实用的cookie设置案例,说明,编辑cookie,删除cookie方法

    cookie设置多个应用共享

    通常,Cookie是与特定的域名关联的,因此默认情况下,它们不能跨不同的顶级域名共享。然而,对于在同一组织内的多个子域或完全不同的应用程序之间实现共享,有一些策略可以采用。 首先,我们需要理解Cookie的基本...

    cookie接口 实现本地或客户端的cookie的创建和读取

    在这个主题中,我们关注的是使用Java实现Cookie接口来创建和读取Cookie。以下是关于这个主题的详细解释。 1. **Cookie接口**: Cookie接口在Java的`javax.servlet.http.Cookie`包中定义,它提供了对HTTP Cookie的...

    cookie实现自动登入

    2. **限制路径与域**:Cookie的路径属性应限制在应用的特定目录下,防止跨站脚本攻击(XSS)。域属性确保Cookie只在指定的顶级域名下有效,避免信息泄露。 3. **安全与HttpOnly标志**:设置`Secure`标志确保Cookie...

    JavaWeb 中Cookie实现记住密码的功能示例

    - `setDomain(String domain)`:设置Cookie可被哪些域下的页面访问。 **四、实现记住密码的代码示例** 在JavaWeb工程中,通常分为两部分:一部分是读取Cookie信息,另一部分是设置Cookie信息。 1. **读取Cookie...

    利用Cookie实现十天免登录

    该资源主要利用Cookie是由服务器端生成并储存在浏览器客户端上的数据。浏览器接收到来自服务器的Cookie数据之后默认将其保存在浏览器缓存中(如果浏览器关闭,缓存消失,Cookie数据...所以可以用来实现十天免登录功能

    discuz与java通过cookie共享登陆

    标题“Discuz与Java通过Cookie共享登录”涉及的是在Web开发中如何实现不同系统间用户登录状态的共享,特别是Discuz论坛系统与基于Java的应用之间的交互。Discuz是一款流行的开源社区论坛软件,而Java是一种广泛使用...

    cookie机制实现登陆、退出

    为了实现退出登录功能,我们需要清除与用户身份相关的Cookie。这可以通过删除指定名称的Cookie来实现。在JavaScript中,可以设置过期时间为过去的时间来达到删除的效果。 ```javascript function deleteCookie(name...

    asp.net购物车(cookie、session两种实现方式)

    本教程将探讨两种常见的实现方式:Cookie和Session。 1. **Cookie实现** Cookie是一种在客户端存储数据的技术,ASP.NET购物车使用Cookie时,通常会为每个商品创建一个唯一的标识,并在用户浏览商品时将这些标识...

    解决springboot实现跨域session共享问题

    为了实现跨域session共享,我们可以使用例如Redis或Memcached这样的分布式缓存来存储session。首先,需要添加相应的依赖到`pom.xml`或`build.gradle`文件中,然后配置Spring Boot的session存储机制: ```java @...

    cookie读写,子cookie

    2. 设置Cookie的属性,如过期时间、路径、域等: ```java cookie.setMaxAge(expirationTimeInSeconds); cookie.setPath("/app"); cookie.setDomain(".example.com"); ``` 3. 将Cookie添加到响应中,使其发送到客户端...

Global site tag (gtag.js) - Google Analytics