2024年4月27日发(作者:)

JAVA详解session和cookie

一、cookie机制和session机制的区别

具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服

务器端保持状态的方案。

同时我们也看到,由于才服务器端保持状态的方案在客户端也需要保存一个标识,所

以session

机制可能需要借助于cookie机制来达到保存标识的目的,但实际上还有其他选择

二、会话cookie和持久cookie的区别

如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览

器窗口,cookie就消失了。这种生命期为浏览会话期的 cookie被称为会话cookie。会话

cookie一般不保存在硬盘上而是保存在内存里。

如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,

这些cookie依然有效直到超过设定的过期时间。

存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保

存在内存的cookie,不同的浏览器有不同的处理方式。

三、如何利用实现自动登录

当用户在某个网站注册后,就会收到一个惟一用户ID的cookie。客户后来重新连接时,

这个

用户ID会自动返回,服务器对它进行检查,确定它是否为注册用户且选择了自动登录,

从而使用户务需给出明确的用户名和密码,就可以访问服务器上的资源。

四、如何根据用户的爱好定制站点

网站可以使用cookie记录用户的意愿。对于简单的设置,网站可以直接将页面的设置

存储在cookie中完成定制。然而对于更复杂的定制,网站只需仅将一个惟一的标识符发送

给用户,由服务器端的数据库存储每个标识符对应的页面设置。

五、cookie的发送

1.创建Cookie对象

2.设置最大时效

3.将Cookie放入到HTTP响应报头

如果你创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的

cookie:存储在浏览器的内存中,用户退出浏览器之后被删除。如果你希望浏览器将该

cookie存储在磁盘上,则

需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览

器删除该cookie。

发送cookie需要使用HttpServletResponse的addCookie方法,将cookie插入到一个

Set-Cookie HTTP请求报头中。由于这个方法并不修改任何之前指定的Set-Cookie报头,

而是创建新的报头,因此我们将这个方法称为是addCookie,而非setCookie。同样要记住

响应报头必须在任何文档内容发送到客户端之前设置。

六、cookie的读取

1.调用kie

要获取有浏览器发送来的cookie,需要调用HttpServletRequest的getCookies方法,这

个调用返回Cookie对象的数组,对应由HTTP请求中Cookie报头输入的值。

2.对数组进行循环,调用每个cookie的getName方法,直到找到感兴趣的cookie为止

cookie与你的主机(域)相关,而非你的servlet或JSP页面。因而,尽管你的servlet可

能只发送了单个cookie,你也可能会得到许多不相关的cookie。

例如:

String cookieName = “userID”;

Cookie cookies[] = kies();

if (cookies!=null){

for(int i=0;i<;i++){

Cookie cookie = cookies[i];

if ((e())){

doSomethingWith(ue());

}

}

}

七、如何使用cookie检测初访者

A.调用kies()获取Cookie数组

B.在循环中检索指定名字的cookie是否存在以及对应的值是否正确

C.如果是则退出循环并设置区别标识

D.根据区别标识判断用户是否为初访者从而进行不同的操作

八、使用cookie检测初访者的常见错误

不能仅仅因为cookie数组中不存在在特定的数据项就认为用户是个初访者。如果

cookie数组为null,客户可能是一个初访者,也可能是由于用户将cookie删除或禁用造成

的结果。

但是,如果数组非null,也不过是显示客户曾经到过你的网站或域,并不能说明他们曾

经访问过你的servlet。其它servlet、JSP 页面以及非Java Web应用都可以设置cookie,依

据路径的设置,其中的任何cookie都有可能返回给用户的浏览器。

正确的做法是判断cookie数组是否为空且是否存在指定的Cookie对象且值正确。

九、使用cookie属性的注意问题

属性是从服务器发送到浏览器的报头的一部分;但它们不属于由浏览器返回给服务器

的报头。