`
javaG
  • 浏览: 554887 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论
阅读更多

 

server端:
Set-Cookie:domain=.test.com key=000001
Set-Cookie:domain=.test.com path=/lsd key=test.com/lsd
Set-Cookie:domain=.test.com path=/lsd/ak47  key=test.com/lsd-ak47
Set-Cookie:domain=.test.com path=/lsd/lsd   key=test.com/lsd-lsd
Set-Cookie:domain=.test.com path=/ak47 key=test.com/ak47
Set-Cookie:domain=.www.test.com   key=000002
Set-Cookie:domain=.www.test.com path=/lsd key=www.test.com/lsd
Set-Cookie:domain=.www.test.com path=/lsd/ak47 key=www.test.com/lsd-ak47
Set-Cookie:domain=.www.test.com path=/lsd/lsd key=www.test.com/lsd-lsd
Set-Cookie:domain=.www.test.com path=/ak47 key=www.test.com/ak47 
 
IE(client)端:
http:/test.com:8080  Cookie:key=000001
http:/test.com:8080/lsd  Cookie:key=test.com/lsd; key=000001
http:/test.com:8080/ak47 Cookie:key=test.com/ak47; key=000001
http:/test.com:8080/lsd/lsd Cookie:key=test.com/lsd-lsd; key=test.com/lsd; key=000001
http:/test.com:8080/lsd/ak47 Cookie:key=test.com/lsd-ak47; key=test.com/lsd; key=000001
http:/test.com:8080/ak47 Cookie:key=test.com/ak47; key=000001
http:/www.test.com:8080  Cookie:key=000002; key=000001
http:/www.test.com:8080/lsd Cookie:key=www.test.com/lsd; key=test.com/lsd; key=000002; key=000001
http:/www.test.com:8080/ak47 Cookie:key=test.com/ak47; key=www.test.com/ak47; key=000002; key=000001
http:/www.test.com:8080/lsd/lsd Cookie:key=test.com/lsd-lsd; key=www.test.com/lsd-lsd; key=www.test.com/lsd; key=test.com/lsd; key=000002; key=000001
http:/www.test.com:8080/lsd/ak47 Cookie:key=test.com/lsd-ak47; key=www.test.com/lsd-ak47; key=www.test.com/lsd; key=test.com/lsd; key=000002; key=000001
  子域名可以访问父域名的Cookie

1. 什么是 Cookies?
2. Cookie 的构成
3. 操纵 Cookies
4. Cookie 怪兽

什么是Cookies?

你会问,什么是cookies呢? cookie 是浏览器保存在用户计算机上的少量数据。它与特定的WEB页或WEB站点关联起来,自动地在WEB浏览器和WEB服务器之间传递。

比如,如果你运行的是Windows操作系统,使用Internet Explorer上网,那么你会发现在你的“Windows”目录下面有一个子目录,叫做“Temporary Internet Files”。如果你有空看看这个目录,就会发现里面有一些文件,文件名称看起来就象电子邮件地址。比如在我机器上的这个目录里,就有 “jim@support.microsoft.com”这样的文件。这是一个cookie 文件,这个文件从哪来呢?猜一猜,它来自微软的支持站点。顺便说一句,这不是我的电子邮件地址,特此澄清。

对于管理细小的、不重要的、不想保存在中央数据库里的细节信息,Cookies 是个很不错的方案。(这不是说大家的名字不重要。)比如,目前网站上不断增长的自定义服务,可以为每个用户定制他们要看的内容。如果你设计的就是这样一个站点,那么你怎么来管理这样的信息:一个用户喜欢绿色的菜单条,而另一个喜欢红色的。确实是个累人的问题。不过,这样的信息,可以很安全地记录到cookie,并保存在用户的计算机上,而你自己的数据库空间可以留给更长久更有意义的数据。

FYI: Cookies 对于安全用途,通常很有用。我不想在此就这一问题过于深入,只是提供一个示例,可以看到如何使用在一段时间之后过期的cookies来保证站点安全:

1. 使用用户名和口令,通过 SSL 登录。
2. 在服务器 的数据库里检查用户名和口令。如果登录成功,建立一个当前时间标签的消息摘要 (比如 MD5) ,并把它保存在cookie和服务器 数据库里。把用户的登录时间保存在服务器 数据库里面的用户记录里。
3. 在进行每个安全事务时(用户处于登录状态的任何事务),把cookie的消息摘要和保存在服务器 数据库里的摘要进行比较,如果比较失败,就把用户引导到登录界面。
4. 如果第3步检查通过,那么检查当前时间和登录时间之音经过的时间是否超过允许的时间长度。如果用户已经超时,那么就把用户引到登录界面。
5. 如果第3步和第4步都通过了,那么把登录时间重新设置成当前时间,允许事务发生。那些需要你登录的安全站点,可能多数使用的都是和这里介绍的类似的方法。
Cookie的构成

Cookies最初设计时,是为了CGI编程。但是,我们也可以使用Javascript脚本来操纵cookies。在本文里,我们将演示如何使用Javascript脚本来操纵cookies。(如果有需求,我可能会在以后的文章里介绍如何使用Perl进行cookie管理。但是如果实在等不得,那么我现在就教你一手:仔细看看CGI.pm。在这个CGI包里有一个cookie()函数,可以用它建立cookie。但是,还是让我们先来介绍cookies的本质。

在Javascript脚本里,一个cookie 实际就是一个字符串属性。当你读取cookie的值时,就得到一个字符串,里面当前WEB页使用的所有cookies的名称和值。每个cookie除了name名称和value值这两个属性以外,还有四个属性。这些属性是: expires过期时间、 path路径、 domain域、以及 secure安全。

Expires – 过期时间。指定cookie的生命期。具体是值是过期日期。如果想让cookie的存在期限超过当前浏览器会话时间,就必须使用这个属性。当过了到期日期时,浏览器就可以删除cookie文件,没有任何影响。

Path – 路径。指定与cookie关联的WEB页。值可以是一个目录,或者是一个路径。如果http://www.jzxue.com/html/java/建立了一个cookie,那么在http://www.jzxue.com/html/java/目录里的所有页面,以及该目录下面任何子目录里的页面都可以访问这个cookie。这就是说,在http://www.jzxue.com/html/java/stories/articles 里的任何页面都可以访问http://www.jzxue.com/html/java/index.html建立的cookie。但是,如果http://www.jzxue.com/html/asp/ 需要访问http://www.jzxue.com/html/java/index.html设置的cookes,该怎么办?这时,我们要把cookies 的path属性设置成“/”。在指定路径的时候,凡是来自同一服务器 ,URL里有相同路径的所有WEB页面都可以共享cookies。现在看另一个例子:如果想让 http://www.jzxue.com/devhead/filters/ 和http://www.jzxue.com/devhead/stories/共享cookies,就要把path设成“/devhead”。

Domain – 域。指定关联的WEB服务器 或域。值是域名 ,比如jzxue.com。这是对path路径属性的一个延伸。如果我们想让 catalog.mycompany.com 能够访问shoppingcart.mycompany.com设置的cookies,该怎么办? 我们可以把domain属性设置成“mycompany.com”,并把path属性设置成“/”。FYI:不能把cookies域属性设置成与设置它的服务器 的所在域不同的值。

Secure – 安全。指定cookie的值通过网络如何在用户和WEB服务器 之间传递。这个属性的值或者是“secure”,或者为空。缺省情况下,该属性为空,也就是使用不安全的HTTP连接传递数据。如果一个 cookie 标记为secure,那么,它与WEB服务器 之间就通过HTTPS或者其它安全协议传递数据。不过,设置了secure属性不代表其他人不能看到你机器本地保存的cookie。换句话说,把cookie设置为secure,只保证cookie与WEB服务器 之间的数据传输过程加密,而保存在本地的cookie文件并不加密。如果想让本地cookie也加密,得自己加密数据。




操纵Cookies

请记住,cookie就是文档的一个字符串属性。要保存cookie,只要建立一个字符串,格式是name=<value>(名称=值),然后把文档的 document.cookie 设置成与它相等即可。比如,假设想保存表单接收到的用户名,那么代码看起来就象这样:

document.cookie = "username" + escape(form.username.value);

在这里,使用 escape() 函数非常重要,因为cookie值里可能包含分号、逗号或者空格。这就是说,在读取cookie值时,必须使用对应的unescape()函数给值解码。

我们当然还得介绍cookie的四个属性。这些属性用下面的格式加到字符串值后面:

name=<value>[; expires=<date>][; domain=<domain>][; path=<path>][; secure]

名称=<值>[; expires=<日期>][; domain=<域>][; path=<路径>][; 安全]

<value>, <date>, <domain> 和 <path> 应当用对应的值替换。<date> 应当使用GMT格式,可以使用Javascript脚本语言的日期类Date的.toGMTString() 方法得到这一GMT格式的日期值。方括号代表这项是可选的。比如在 [; secure]两边的方括号代表要想把cookie设置成安全的,就需要把"; secure" 加到cookie字符串值的后面。如果"; secure" 没有加到cookie字符串后面,那么这个cookie就是不安全的。不要把尖括号<> 和方括号[] 加到cookie里(除非它们是某些值的内容)。设置属性时,不限属性,可以用任何顺序设置。

下面是一个例子,在这个例子里,cookie "username" 被设置成在15分钟之后过期,可以被服务器 上的所有目录访问,可以被"mydomain.com"域里的所有服务器 访问,安全状态为安全。

// Date() 的构造器设置以毫秒为单位
// .getTime() 方法返回时间,单位为毫秒
// 所以要设置15分钟到期,要用60000毫秒乘15分钟
var expiration = new Date((new Date()).getTime() + 15 * 60000);
document.cookie = "username=" + escape(form.username.value)+ "; expires ="
+ expiration.toGMTString() + "; path=" + "/" + "; _
domain=" + "mydomain.com" + "; secure";

读取cookies值有点象个小把戏,因为你一次就得到了属于当前文档的所有cookies。

// 下面这个语句读取了属于当前文档的所有cookies
var allcookies = document.cookie;

现在,我们得解析allcookies变量里的不同cookies,找到感兴趣的指定cookie。这个工作很简单,因为我们可以利用Javascript语言提供的扩展字符串支持。

如果我们对前面分配的cookie "username" 感兴趣,可以用下面的脚本来读取它的值。

// 我们定义一个函数,用来读取特定的cookie值。
function getCookie(cookie_name)
{
var allcookies = document.cookie;
var cookie_pos = allcookies.indexOf(cookie_name);

// 如果找到了索引,就代表cookie存在,
// 反之,就说明不存在。
if (cookie_pos != -1)
{
// 把cookie_pos放在值的开始,只要给值加1即可。
cookie_pos += cookie_name.length + 1;
var cookie_end = allcookies.indexOf(";", cookie_pos);

if (cookie_end == -1)
{
cookie_end = allcookies.length;
}

var value = unescape(allcookies.substring(cookie_pos, cookie_end));
}

return value;
}

// 调用函数
var cookie_val = getCookie("username");

上面例程里的 cookie_val 变量可以用来生成动态内容,或者发送给服务器 端CGI脚本进行处理。现在你知道了使用Javascript脚本操纵cookies的基本方法。但是,如果你跟我一样,那么我们要做的第一件事,就是建立一些接口函数,把cookies处理上的麻烦隐藏起来。不过,在你开始编程之前,稍候片刻。这些工作,早就有人替你做好了。你要做的,只是到哪去找这些接口函数而已。

比如,在David Flangan的Javascript: The Definitive Guide 3rd Ed.这本书里,可以找到很好的cookie应用类。你也可以在Oreilly的WEB站点上找到这本书里的例子。本文最后的链接列表里,有一些访问这些cookie示例的直接链接。



Cookies 怪兽

因为某些原因Cookies 的名声很不好。许多人利用cookies做一些卑鄙的事情,比如流量分析、点击跟踪。Cookies 也不是非常安全,特别是没有secure属性的cookies。不过,即使你用了安全的cookies,如果你和别人共用计算机,比如在网吧,那么别人就可以窥探计算机硬盘上未加密保存的cookie文件,也就有可能窃取你的敏感信息。所以,如果你是一个WEB开发人员,那么你要认真考虑这些问题。不要滥用cookies。不要把用户可能认为是敏感的数据保存在cookies里。如果把用户的社会保险号、信用卡号等保存在cookie里,等于把这些敏感信息放在窗户纸下,无异于把用户投到极大危险之中。一个好的原则是,如果你不想陌生人了解你的这些信息,那就不要把它们保存在cookies里。

另外,cookies还有一些实际的限制。Cookies保留在计算机上,不跟着用户走。如果用户想换计算机,那么新计算机无法得到原来的cookie。甚至用户在同一台计算机上使用不同浏览器,也得不到原来的cookie:Netscape 不能读取Internet Explorer 的cookies。

还有,用户也不愿意接受cookies。所以不要以为所有的浏览器都能接受你发出的cookies。如果浏览器不接受cookies,你要保证自己的WEB站点不致因此而崩溃或中断。

另外WEB 浏览器能保留的cookies不一定能超过300个。也没有标准规定浏览器什么时候、怎么样作废cookies。所以达到限制时,浏览器能够有效地随机删除cookies。浏览器保留的来自一个WEB服务器 上的cookies,不超过20个,每个cookie的数据(包括名称和值),不超过4K字节。(不过,本文里的cookie尺寸没问题,它只占了12 K字节,保存在3个3 cookies里。)

简而言之,注意保持cookie简单。不要依赖cookies的存在,不要在每个cookie里保存太多信息。不要保存太多的cookes。但是,抛除这些限制,在技巧高超的WEB管理员手里,cookie的概念是一个有用的工具。

外部链接
每个 Javascript 程序员都应当有一份Javascript: David Flanagan 的The Definitive Guide。 这本书里找到cookie 类例程可以帮助你把不止一个变量编码到单一的cookie,克服掉“每个WEB服务器 20 个cookies的限制”。

任何路径下可以放很多不同名字的cookie

关于Java的Cookie操作

1.设置Cookie

1 Cookie cookie  =   new  Cookie( " key " " value " );
2 cookie.setMaxAge( 60 );  // 设置60秒生存期,如果设置为负值的话,则为浏览器进程Cookie(内存中保存),关闭浏览器就失效。
3 cookie.setPath( " /test/test2 " );  // 设置Cookie路径,不设置的话为当前路径(对于Servlet来说为request.getContextPath() + web.xml里配置的该Servlet的url-pattern路径部分)
4 response.addCookie(cookie);

2.读取Cookie
1 1 // 该方法可以读取当前路径以及“直接父路径”的所有Cookie对象,如果没有任何Cookie的话,则返回null
2 2Cookie[] cookies  =  request.getCookies();

3.删除Cookie
1 Cookie cookie  =   new  Cookie( " key " null );
2 cookie.setMaxAge( 0 );  // 设置为0为立即删除该Cookie
3 cookie.setPath( " /test/test2 " );  // 删除指定路径上的Cookie,不设置该路径,默认为删除当前路径Cookie
4 response.addCookie(cookie);

分享到:
评论

相关推荐

    IIS实现反向代理时Cookie域的设置方法

    IIS实现反向代理时Cookie域的设置方法 IIS实现反向代理时Cookie域的设置方法

    c#封装的cookie操作类

    这个类将提供读取、写入Cookie以及管理Cookie域和有效期的功能。 一、Cookie基本概念 Cookie是由服务器发送到用户浏览器并存储在本地的一小块数据,它可以用来跟踪用户状态、保持登录信息、个性化设置等。每个...

    基于Cookie的认证机制及其安全性分析1

    - 限制Cookie域和路径:确保Cookie只能在预期的上下文中使用,防止跨站脚本(XSS)攻击。 - 定期更新访问令牌:通过定期更换Cookie中的访问令牌,增加攻击者利用Cookie的难度。 5. 结论 虽然Cookie为基础的认证...

    cookie+session实现的单点登录案例

    这通常通过设置共享的Cookie域或者使用中央认证服务来实现。 4. **跨站验证**:当用户访问其他受保护的应用时,浏览器会自动携带Cookie中的Session ID。服务器检查这个ID,如果有效且未过期,就认为用户已登录,无需...

    cookie读写,子cookie

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

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

    // .example.com域内的所有子域可见 ``` 4. **添加Cookie到响应**: 创建并设置好Cookie后,将其添加到HttpServletResponse对象,以便发送到客户端。这通常在Servlet的`doGet()`或`doPost()`方法中完成: ```...

    jquery.cookies.2.2.0.js.zip

    domain: 'example.com' // 设置Cookie域为example.com }); ``` 2. JSON支持 可以存储和读取JSON格式的数据: ```javascript // 存储JSON对象 var myData = { key1: 'value1', key2: 'value2' }; $.cookie('...

    二级域名和顶级域名需要同步登录如何设置cookie作用域1

    实现这种功能的关键在于正确地设置Cookie的作用域。在PHP开发中,尤其是使用像Discuz!这样的论坛软件时,这个过程可以通过配置文件来完成。 首先,我们需要理解Cookie的工作原理。Cookie是由服务器发送到用户浏览器...

    单点登录(SSO)-同域名、不同域名

    1. **Cookie域的设置**:在SSO系统中登录后,可以通过设置Cookie的域为顶级域(如`.example.com`),使得所有子域都能访问到该Cookie。这解决了Cookie跨域的问题。 2. **Session共享**:虽然各应用系统间默认不会...

    web传值方式和介绍

    7. Cookie 域变量:这种方式用的较少,一般用于保存用户痕迹。 8. Cache 域变量:服务端缓存变量,一般用于给多个页面读数据。 此外,还有其他几种域变量,例如: * Server 域:单个服务器上的全局变量 * ...

    cookie记住账号密码

    - 浏览器接收后将Cookie存储在本地,并在后续对同一域的请求中附带Cookie。 - 服务器通过请求中的Cookie获取用户信息,如已登录状态。 2. **安全性考虑**: - **安全性和隐私**:不应将敏感信息如明文密码直接...

    C#cookie实现历史记录

    同时,每个域下的所有Cookie总大小也有限制,一般为40KB左右。 通过这些基本操作,你可以用C#实现Cookie的完整生命周期管理,包括创建、读取、更新和删除。在实际项目中,通常还会结合Session、ViewData等技术,...

    BMForum Datium! v1.5 Beta1

    注:不同于 Plus!,Datium! 为数据库版本,需要 MySQL 支持 新增功能列表: 1.... + 可设置 Cookie 域、路径 4. + 可加重、下划线、删除线、斜体帖子标题 5. * 修复恶意修改他人密码的漏洞

    python selenium操作cookie的实现

    1. Domain(域):定义Cookie可以被哪些域名或子域名访问。若未指定,将默认为创建Cookie时的主域名。 2. Path(路径):限制Cookie在哪个URL路径下有效。 3. Expiration Time/Max-Age(有效期):设置Cookie何时...

    ARC cookie exchange-crx插件

    如果请求域与cookie域匹配,则您的cookie将与请求一起发送。 必需的权限:* cookie-能够读取cookie *访问所有网站-cookie API可以从扩展可以读取的域中读取cookie。 因此,需要访问所有URL。安全该扩展仅接受来自...

    Session Cookie的HttpOnly和secure属性

    如果在Cookie中设置了"HttpOnly"属性,那么通过程序(JS脚本、Applet等)将无法读取到Cookie信息,这样能有效的防止XSS攻击。 对于以上两个属性, 首先,secure属性是防止信息在传递的过程中被监听捕获后信息泄漏,...

    jquery cookie 实例下载

    在实际应用中,我们可能还需要处理更复杂的情况,比如处理多个Cookie、设置路径或域等。例如,可以指定Cookie的作用域仅限于特定的URL路径: ```javascript $.cookie('the_cookie', 'the_value', { path: '/myPath' ...

    cookie

    每个Cookie都包含一个名字、值、过期时间、路径、域等属性。 2. **Cookie的生命周期**:默认情况下,Cookie在浏览器关闭后就会消失(会话Cookie)。若设置了过期时间,Cookie将在指定的时间后失效。 3. **Cookie的...

    用script跳转方式主动跨域获取cookie或session(并非网上铺天盖地的主动设置法)

    在A域中存放openid.aspx 在B域中调用A域的openid.aspx 调用方法: ...B域根据这个标识来确定是否更新自己域的cookie,每次更新后都需刷新页面一次,这个刷新动作已经在openid.aspx中完成,不用自己再写。

Global site tag (gtag.js) - Google Analytics