【转】session与cookie的关系和区别详解

       session与cookie最主要的区别就是,session是以对象的形式保存在服务器端,而cookie则是以字符串的 形式保存在客户端。HTTP协议是一种无连接的协议,当客户端发出一个请求时,它们之间就会建立一个 连接,等服务器响应了这个请求,这个连接就会被断开,这时候服务器再也不记得先前与客户端的那次亲密接触,一些用户信息当然也就消失了。

       cookie就是为了处理这类的情况的,它可以把用户的信息储存起来。比如用户登录到某个网站,服务器把用户登录的信息保存到客户端的cookie 中,这样用户感觉这个网站已经记着了自己。但是cookie有它的缺点不宜存储过长的数据;而且cookie是以文件的形式保存在客户端的磁盘上,所以一 些重要数据很容易被修改,比如用户购买一些东西之后,修改自己的余额,然后提交给服务器,这种行为是一定不能允许的。而session就能保证数据的安 全,因为它是保存在服务器上的,服务器通过一个唯一的sessionID来区别不同的用户。这个sessionID就保存在客户端的cookie中(默 认)或者重定向到URL里。现在就来看看为什么要把sessionID保存到cookie中,当我们打开一个新的窗口时,系统会分配一个新的 sessionID,这样服务器就会认为是不同的用户发出的请求,比如有这样一个程序:

<?php
session_start();
if(!$_SESSION['val'])
{
  $_SESSION['val']=1;
}
else
{
  $val=$_SESSION['val'];
  $val++; $_SESSION['val']=$val;
}
echo $_SESSION['val'];
?>

      每次刷新页面,都会的到不同的累加值。但是如果我在浏览器的配置里禁用了cookie,再刷新页面,发现这个值没有变化,永远是1。系统给每次刷新 的页面分配了新的sessionID。每次打开新的页面时,系统就会看cookie中的是否有sessionID,如果有就不会分配新的 sessionID。当然还有别的办法记住sessionID,那就是重写在url里。

      虽然session是保存在服务器端的,但它也是依靠cookie来实现其功能的。

      cookie机制。正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指 示生成相应的cookie。然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie。而cookie的使用是由浏览器按 照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则 把该cookie附在请求资源的HTTP请求头上发送给服务器。

      cookie的内容主要包括:名字,值,过期时间,路径和域。路径与域一起构成cookie的作用范围。若不设置过期时间,则表示这个cookie 的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般 不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些 cookie仍然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的 cookie,不同的浏览器有不同的处理方式

session机制。session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。

当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识(称为 session id),如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(检索不到,会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。

保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于 SEEESIONID。但cookie可以被人为的禁止,则必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。

经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面。还有一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。比如:

<form name="testform" action="/xxx">
<input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">
<input type="text">
</form>

实际上这种技术可以简单的用对action应用URL重写来代替。

转载于:https://my.oschina.net/winworld/blog/190575

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值