[转]Cookie和Session概述

本文介绍了Cookie和Session这两种常用的技术,详细解释了它们的工作原理、如何创建及使用,并探讨了各自的优缺点。Cookie由Netscape发明,用于客户端保存用户信息,如用户ID和访问频率;而Session则是在服务器端维护用户会话状态的方法,能够存储更大量的数据并被多个Servlet共享。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、  Cookie 概述

Cookie 技术有 Netscape 首创和使用,而后也受到 Microsoft IE 的支持。现在绝大多数浏

览器都支持这项技术,虽然在很多浏览器中设定为“禁用”( disable )状态。

       Cookie 是用来保存用户信息的。一个 Cookie 是一则短小消息,首先在处理客户的第一次请求时由 Web 服务器传给客户浏览器。当浏览器收到从服务器传来的 Cookie 后,会以名称—值( name value )的形式记录用户访问当前网站的一些数据(例如用户 ID 、密码、访问该网站的次数和上次访问该网站的时间等),并将这些数据保存在客户端。在随后的每次请求中,数据从浏览器中传回到服务器,这样服务器就可以对用户进行跟踪了。

       Cookie 的工作过程是,首先浏览器向服务器提出页面请求,服务器在响应中给客户分配一个 ID 传给浏览器,浏览器在随后的每次请求中都携带分配给它的 ID ,这样服务器在处理请求时就知道其来源了。 Servlet 是通过将 Cookie 加到响应的头部发送给客户的,而客户则将之加到请求的头部,自动返还给服务器。

       Servlet API 中用于创建和设定 Cookie 的类是 javax.servlet.http. Cookie 。创建方法为:

              public Cookie(String name String value )

该方法以给定的名称和值创建一个 Cookie 对象。几个 Cookie 可以具有同一名称。值的更改可用方法 setValue 实现。 Cookie 的属性如下:

方法

功能

void setComment(String comment)

String getComment()

分别设定和获取 Cookie 的说明

void setDomain(String pattern)

String getDomain()

分别设定和获取 Cookie 的作用域

void setMaxAge(int expiry)

int getMaxAge()

分别设定和获取 Cookie 的有效期。参数为 0 时指示浏览器立刻删除该 Cookie ,为负数表示 Cookie 的有效期直到用户退出网站才结束

void setPath(String uri)

String getPath()

分别设定和获取 Cookie 的作用路径

void setValue(String new Value)

String getValue()

分别设定和获取 Cookie 的与名称相关联的值

void setSecure(Boolean flag)

Boolean getSecure()

分别设定和判断 Cookie 是否只通过安全协议传输

void setVersion(int version)

int getVersion()

分别设定和获取 Cookie 所遵守的协议的版本号

使用 Cookie 时应注意以下几点:

□前面已提到, Cookie 是通过 HTTP 头部传递的,因此设置 Cookie 要在输出任何响应之前。也就是说,如果用 Writer 给客户返回文本数据,那么必须在使用 Writer 之前,调用响应对象的 addCookie

□在设置 Cookie 时最好加上作用路径和作用域等参数。因为如果用户访问的其他网站有同名的 Cookie 变量,那么用户的 Cookie 有可能被覆盖掉。

□客户浏览器对 Cookie 有限制,要求每个 Cookie 不超过 4KB ,每个站点最多接受 20 Cookie ,每个用户最多 300 个。

Cookie 的安全性是个受人关注的问题。由于 Cookie 能向客户机读写数据,因此很多人认为使用它不安全,而且 Cookie 能记录用户访问站点的信息,这有损于用户的隐私。因此很多浏览器都提供禁用 Cookie 的功能。

 

2、  Session 概述

Cookie 只能存放小量信息,而且使用范围有一定的限制。 Servlet 内置的 Session 跟踪功

能比 Cookie 更强。

       Session 跟踪是一种机制, Servlet 利用它在一定的时间内对源自同一客户的一系列请求的状态进行跟踪,并且保存有关用户的信息。一个 Session 通常对应于一个用户,而该用户可以多次访问同一网站。 Session 可以被同一客户存取的若干个 Servlet 共享,因此是 Servlet 之间交换客户信息的一种手段。它与 Cookie 一样也是以名称—值的形式保存信息的,但不同的是, Session 保存的数据可以是对象类型的,而且保存在 Web 服务器端,而不像 Cookie 那样保存在客户端。与 Cookie 一样, Session 也是有有效期的。

       Servlet API 提供的有关 Session 的接口是 javax.servlet.http.HttpSession 。创建和获取用户的 Session 则应该调用请求对象的 getSession 方法。

              public HttpSession HttpServletRequest.getSession(Boolean create)

它返回与做出请求的客户相关联的 Session 。当用户尚未有 Session 时,该方法便为之创建一个(如果参数 create true )或者返回 null (如果参数设为 false )。通常情况下,参数应该取 true

       一般情况下,当用户关闭浏览器、转到别的网站或者离开客户机长久不用时,当前的 Session 应该失效。但由于服务器并不能探测上述事件,因而只好为 Session 设定有效期。当客户在一段时间内没有作请求时,服务器认为用户不再使用该网站,从而不在维持 Session 的有效性。为一个 Session 单独设定有效期的方法是 HttpSession setMaxInactiveInterval ,参数以秒为单位。实际上, Session 的默认有效期可以在 Web 应用的发布描述器 web.xml 中配置。

              ……

              <web-app>

                     <session-config>

                            <session-timeout> 60 </session-timeout>   <!—minutes-->

                     </session-config>

                     ……

              </web-app>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值