HTTP session

HTTP session
HTTP协议( http://www.w3.org/Protocols/)是“一次性单向”协议。
服务端不能主动连接客户端,只能被动等待并答复客户端请求。客户
端连接服务端,发出一个HTTP Request,服务端处理请求,并且返回
一个HTTP Response给客户端,本次HTTP Request-Response Cycle结
束。
 
当程序需要为某个客户端的请求创建一个session的时候,服务器首先
检查这个客户端的请求里是否已包含了一个session标识 - 称为
session id,如果已包含一个session id则说明以前已经为此客户端创
建过session,服务器就按照session id把这个 session检索出来使用
(如果检索不到,可能会新建一个),如果客户端请求不包含session
  id,则为此客户端创建一个session并且生成一个与此session相关联
的session id,session id的值应该是一个既不会重复,又不容易被
找到规律以仿造的字符串,这个 session id将被在本次响应中返回给
客户端保存。
保存这个session id的方式可以采用cookie.服务端不能主动连接客户端,只能
被动等待并答复客户端请求。客户端连接服务端,发出一个HTTP Request,服务
端处理请求,并且返回一个HTTP Response给客户端,本次HTTP Request-Res
ponse Cycle结束。
 
我们看到,HTTP协议本身并不能支持服务端保存客户端的状态信息。于是,Web
Server中引入了session的概念,用来保存客户端的状态信息。这里用一个形象的
比喻来解释session的工作方式。假设Web Server是一个商场的存包处,HTTP
Request是一个顾客,第一次来到存包处,管理员把顾客的物品存放在某一个柜子里
面(这个柜子就相当于Session),然后把一个号码牌交给这个顾客,作为取包凭证
(这个号码牌就是Session ID)。顾客(HTTP Request)下一次来的时候,就要
把号码牌(Session ID)交给存包处(Web Server)的管理员。管理员根据号码牌(Session ID)找到相应的柜子(Session),根据顾客(HTTP Request)的请求,Web Server可以取出、更换、添加柜子(Session)中的物品,Web Server也可以
让顾客(HTTP Request)的号码牌和号码牌对应的柜子(Session)失效。顾客
(HTTP Request)的忘性很大,管理员在顾客回去的时候(HTTP Response)都要
重新提醒顾客记住自己的号码牌(Session ID)。这样,顾客(HTTP Request)下
次来的时候,就又带着号码牌回来了。Session ID实际上是在客户端和服务端之间通
过HTTP Request和HTTP Response传来传去的。号码牌(Session ID)必须包含
在HTTP Request里面。关于HTTP Request的具体格式,请参见HTTP协议( http://www.w3.org/Protocols/)。这里只做一个简单的介绍。
HTTP Request一般由3部分组成:
(1)Request Line
这一行由HTTP Method(如GET或POST)、URL、和HTTP版本号组成。
(2)Request Headers
这部分定义了一些重要的头部信息,如,浏览器的种类,语言,类型。Request
Headers中还可以包括Cookie的定义。例如:
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
Accept-Language: en-us
Cookie: jsessionid=1001
(3)Message Body
如果HTTP Method是GET,那么Message Body为空。
如果HTTP Method是POST,说明这个HTTP Request是submit一个HTML Form的结果,
那么Message Body为HTML Form里面定义的Input属性。例如,
 
从理论上来说,这3个部分(Request URL,Cookie Header, Message Body)都可以
用来存放Session ID。由于Message Body方法必须需要一个包含Session ID的HTML
Form,所以这种方法不通用。
一般用来实现Session的方法有两种:
(1)URL重写。
Web Server在返回Response的时候,检查页面中所有的URL,包括所有的连接,和
HTML Form的Action属性,在这些URL后面加上“;jsessionid=XXX”。
下一次,用户访问这个页面中的URL。jsessionid就会传回到Web Server。
(2)Cookie。
如果客户端支持Cookie,Web Server在返回Response的时候,在Response的Header部分,加入一个“set-cookie: jsessionid=XXXX”header属性,把jsessionid放在Cookie里传到客户端。
客户端会把Cookie存放在本地文件里,下一次访问Web Server的时候,再把Cookie的信息放到HTTP Request的“Cookie”header属性里面,这样jsessionid就随着HTTP Request返回给Web Server。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值