Session 是由应用服务器维持的一个服务器端的存储空间,用户在连接服务器时,会由服务器生成一个唯
一的 SessionID,用该 SessionID 为标识符来存取服务器端的 Session 存储空间。而 SessionID 这一数据则
是保存到客户端,用 Cookie 保存的,用户提交页面时,会将这一 SessionID 提交到服务器端,来存取
Session 数据。这一过程,是不用开发人员干预的。所以一旦客户端禁用 Cookie,那么 Session 也会失效。
服务器也可以通过 URL 重写的方式来传递 SessionID 的值,因此不是完全依赖 Cookie。如果客户端
Cookie 禁用,则服务器可以自动通过重写 URL 的方式来保存 Session 的值,并且这个过程对程序员透明。
可以试一下,即使不写 Cookie,在使用 request.getCookies();取出的 Cookie 数组的长度也是 1,而这个
Cookie 的名字就是 JSESSIONID,还有一个很长的二进制的字符串,是 SessionID 的值。
Cookie 是客户端的存储空间,由浏览器来维持。
在一些投票之类的场合,我们往往因为公平的原则要求每人只能投一票,在一些 WEB 开发中也有类似的
情况,这时候我们通常会使用 COOKIE 来实现,例如如下的代码:
< % cookie[]cookies = request.getCookies();
if (cookies.lenght == 0 || cookies == null)
doStuffForNewbie();
//没有访问过
}
else
{
doStuffForReturnVisitor(); //已经访问过了
}
% >
这是很浅显易懂的道理,检测 COOKIE 的存在,如果存在说明已经运行过写入 COOKIE 的代码了,
然而运行以上的代码后,无论何时结果都是执行 doStuffForReturnVisitor(),通过控制面板-Internet 选项-
设置-察看文件却始终看不到生成的 cookie 文件,奇怪,代码明明没有问题,不过既然有 cookie,那就显
示出来看看。
cookie[]cookies = request.getCookies();
if (cookies.lenght == 0 || cookies == null)
out.println("Has not visited this website");
}
else
{
for (int i = 0; i < cookie.length; i++)
{
out.println("cookie name:" + cookies[i].getName() + "cookie value:" +