Http协议是一种无状态协的请求/响应协议。服务器处理来自客户端的请求,然后向客户端回送一条响应。Web服务器几乎没有什么信息可以用来判断是哪个客户端发送的请求,也无法记录来访客户端的请求序列。
Cookie的作用就是识别不同的客户端,实现持久会话。Cookie的基本思想就是让浏览器持有一组服务器特有的信息,每次访问服务器时都将这些信息提供给它。
接下来我们看看Cookie是如何工作的。客户端第一次访问Tomcat服务器的时候,服务器会解析Http的请求头,由于是第一次访问,所以请求头中并没有能识别该客户端的信息,Cookie中没有任何值。服务器第返回响应信息给客户端的时候会通过Set-Cookie或Set-Cookie2将Cookie的值添加到Http协议的头部中。Cookie的值可以是任何信息,通常只包含一个服务器为了进行跟踪而而产生的独特识别码,这个识别码就是JSESSIONID。但Cookie并不仅限于JSESSIONID,还可以以键/值对的方式保存其他信息。
Cookie可以让服务器跟踪每个客户端的访问,以区别不同的客户端,但是每次客户端的访问都必须传回这些Cookie,如果Cookie很多,这无形的增加了增加了客户端和服务器的数据传输量,Session的出现正是解决这个问题。
同一个客户端和服务器交互时,不需要每次都传回所有的Cookie值,只需传回一个ID,而这个ID就是客户端第一次访问服务器时产生的,并且对于每个客户端都是唯一的。这样客户端就只需传回这个唯一的ID就行了。这个ID就是上文中提到的JSESSIONID。
那么我们来看看Tomcat中关于Cookie和Session的这部分源码。
Cookie的值是保存在Http请求头中的,因此Tomcat接收到Http请求之后会调用InternalInputBuffer类的parseHeaders解析请求头,
由于是第一次访问,解析出来的Cookie值为空,因此Tomcat在返回响应信息的时候会创建Session对象和SessionId,并且将SessionId和Session对象一一关联起来,这样下次请求的时候就可以根据SessionId直接获取Session对象,而不用再次创建Session对象了。创建Session的过程在ManagerBase类的createSession方法中。创建好Session对象之后接着创建Cookie对象,并将Cookie对象的name设置为JSESSIONID,value设置为SessionId对应的值。最后调用Response的addSessionCookieInternal方法将Cookie组装成键/值对,并添加到响应头中返回给客户端。
Tomcat源码阅读之Cookie和Session
最新推荐文章于 2024-02-16 21:14:15 发布