Cookie 与 Session 都可以进行会话跟踪, 但是实现的原理不太一样。
一般情 况下二者均可以满足需求,但有时候不可以使用 Cookie,有时候不可以使用 Session。
下面通过比较说明二者的特点以及适用的场合。
1 . 从存取方式上比较 Cookie 中只能保存 ASCII 字符串, 如果需要存取 Unicode 字符或者二进制数 据,需要进行 UTF-8,GBK 或者 BASE64 等方式的编码。Cookie 中也不能直接存 取 Java 对象。若要存储稍微复杂的信息,使用 Cookie 是比较困难的。 而 Session 中可以存取任何类型的数据,包括而不限于 String、Integer、 List、 Map 等。 Session 中也可以直接保存 Java Bean 乃至任何 Java 类, 对象等, 使用起来非常方便。可以把 Session 看做是一个 Java 容器类。
2 .隐私安全上比较 Cookie 存储在客户端浏览器中, 对客户端是可见的, 客户端的一些程序可能 会窥探、复制甚至修改 Cookie 中的内容。而 Session 存储在服务器上,对客户 端是透明的,不存在敏感信息泄露的危险。 如果选用 Cookie, 比较好的办法是, 敏感的信息如账号密码等尽量不要写到 Cookie 中。最好是像 Google、Baidu 那样将 Cookie 信息加密,提交到服务器后 再进行解密,保证 Cookie 中的信息只有自己能读得懂。而如果选择 Session 就 省事多了,反正是放在服务器上,Session 里任何隐私都可以。
3. 从有效期上比较 使用过 Google 的人都知道, 如果登录过 Google, Google 的登录消息长期 则 有效。用户不必每次访问都重新登录,Google 会长久地记录该用户的登录信息。 要达到这种效果, 使用 Cookie 会是比较好的选择。 只需要设置 Cookie 的 maxAge 属性为一个很大很大的数字或者 Integer.MAX_VALUE 就可以了。 Cookie 的 maxAge 属性支持这样的效果。 使用 Session 理论上也能实现这种效果。只要调用方法 setMaxInactiveInterval(Integer. MAX_VALUE)不就可以了么。但是由于 Session 依赖于名为 JSESSIONID 的 Cookie,而 Cookie JSESSIONID 的 maxAge 默认为–1,只要关闭了浏览器该 Session 就会失效,因此 Session 不能实现信 息永久有效的效果。使用 URL 地址重写也不能实现。 而且如果设置 Session 的超时时间过长,服务器累计的 Session 就会越多, 越容易导致内存溢出。
4. 从对服务器的负担上比较 Session 是保存在服务器端的,每个用户都会产生一个 Session。如果并发 访问的用户非常多, 会产生非常多的 Session, 消耗大量的内存。 因此像 Google、 Baidu、Sina 这样并发访问量极高的网站,是不太可能使用 Session 来追踪客户 会话的。 而 Cookie 保存在客户端,不占用服务器资源。如果并发浏览的用户非常多, Cookie 是很好的选择。对于 Google、Baidu、Sina 来说,Cookie 也许是唯一的 选择。
5 .从浏览器支持上比较 Cookie 是需要客户端浏览器支持的。如果客户端禁用了 Cookie,或者不支 持 Cookie,则会话跟踪会失效。对于 WAP 上的应用,常规的 Cookie 就派不上用 场了。 如果客户端浏览器不支持 Cookie, 需要使用 Session 以及 URL 地址重写。 需 要注意的是所有的用到 Session 程序的 URL 都要使用 response.encodeURL(String URL)或者 response.encodeRedirectURL(String URL)进行 URL 地址重写,否则导致 Session 会话跟踪失败。对于 WAP 应用来说, Session+URL 地址重写也许是它唯一的选择。 如果客户端支持 Cookie,则 Cookie 既可以设为本浏览器窗口以及子窗口内 有效(把 maxAge 设为–1),也可以设为所有浏览器窗口内有效(把 maxAge 设 为某个大于 0 的整数)。但 Session 只能在本浏览器窗口以及其子窗口内有效。 如果两个浏览器窗口互不相干,它们将使用两个不同的 Session。
6. 从跨域名上比较 Cookie 支持跨域名访问,例如将 domain 属性设置为 “.helloweenvsfei.com”, 则以“.helloweenvsfei.com”为后缀的所有域名均 可以访问该 Cookie。 跨域名 Cookie 现在被广泛用在网络中, 例如 Google、 Baidu、 Sina 等。 Session 则不会支持跨域名访问。 而 Session 仅在他所在的域名内有效。 %注意:仅使用 Cookie 或者仅使用 Session 可能实现不了理想的效果。 这时应该尝试一下同时使用 Cookie 与 Session。Cookie 与 Session 的 搭配使用在实际项目中会实现绚烂多姿的效果。
session (会话状态)它是 asp 的内置对象,在服务器端存有用户的个人信息,用来唯一表 示一名用户。当用户登陆服务器的时候,系统会自动创建一个 session,它可暂存用户的首 选项如登陆名,时间,状态以及其他实时信息(如购物车信息)。当 session 到期或你关闭 浏览器,服务器将终止 session。
cookie(网上信息数据快)它是 asp 内置对象 request 和 response 中的集合。它存在于你 机器上的一个文件夹里,每个有唯一的名字标识。是服务器用于跟踪用户信息、存储用户信 息的文件。它可含有 web 站点地址信息,用户登陆次数信息,用户登陆信息,cookie 过期 时间等内容。 当用户每次连接服务器时,服务器可以用 response.cookies(名称)=值的方式把 session 中 所有的信息写入 cookie 里。服务器也可用 request.cookies 来访问 cookie 中值的这种方式 把 cookie 内容传回服务器做处理并管理 session 对象。
由于 cookie 和服务器和 session 联系紧密, 所以当 cookie 关闭, session 作用已不大了。