关闭

Tomcat源码阅读之Cookie和Session

标签: Tomcat源码sessioncookieJSESSIONID
380人阅读 评论(0) 收藏 举报
分类:

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组装成键/值对,并添加到响应头中返回给客户端。

0
0
查看评论

Tomcat源码分析(九)--Session管理

在明白Tomcat的Session机制之前,先要了解Session,Cookie,JSESSIONID这几个概念。JSESSIONID是一个唯一标识号,用来标识服务器端的Session,也用来标识客户端的Cookie,客户端和服务器端通过这个JSESSIONID来一一对应。这里需要说明的是Cooki...
  • haitao111313
  • haitao111313
  • 2012-07-11 15:16
  • 10679

Tomcat中session详解(源码阅读)

Tomcat中的session是通过一个manager来管理的,其中Session接口默认实现类有StandardSession,管理器的默认实现是StandardManager。 我们平时在servlet中使用的session也就是HashMap中的一个session对象,同时session除了...
  • u010149189
  • u010149189
  • 2016-05-08 17:21
  • 959

Tomcat Session管理机制(Tomcat源码解析七)

前面几篇我们分析了Tomcat的启动,关闭,请求处理的流程,tomcat的classloader机制,本篇将接着分析Tomcat的session管理方面的内容。 在开始之前,我们先来看一下总体上的结构,熟悉了总体结构以后,我们在一步步的去分析源代码。Tomcat session相光的类图如下: ...
  • jiaomingliang
  • jiaomingliang
  • 2015-08-11 11:22
  • 2540

使用Tomcat 7造成的前段无法获取cookie

Should the HttpOnly flag be set on session cookies to prevent client side script from accessing the session ID? Defaults to false. 一般的Cookie...
  • zhuojiuyihu
  • zhuojiuyihu
  • 2013-12-25 14:20
  • 3710

Tomcat之Session和Cookie大揭密

一、JSP和Servlet中的Cookie      由于HTTP协议是无状态协议(虽然Socket连接是有状态的,但每次用HTTP协议进行数据传输后就关闭的Socket连接,因此,HTTP协议并不会保存上一次的状态),因此,如果要保存某些HT...
  • u010408365
  • u010408365
  • 2014-12-10 15:07
  • 2884

JavaWeb项目为什么我们要放弃原生tomcat的session/cookie机制?

前戏:先说一下原生tomcat的session/cookie的定义与机制 Cookie和Session都为了用来保存状态信息,都是保存状态的机制,它们都是为了解决HTTP无状态的问题而所做的努力。 Cookie和Session有以下明显的不同点: 1)Cookie将状态保存在客户端(默认在本...
  • piantoutongyang
  • piantoutongyang
  • 2016-12-09 14:51
  • 2926

Servlet对Cookie和Session的管理源码实例

  • 2013-05-31 18:00
  • 11KB
  • 下载

tomcat 9.0中,用cookie进行会话时出现的不合法字符问题

An invalid character [32] was present in the Cookie value An invalid character [59] was present in the Cookie value 在tomcat9.0中,使用cookie会话时出现了上述的字符不...
  • KooKing_L
  • KooKing_L
  • 2017-08-20 23:21
  • 723

Tomcat 对 Cookie的聪明处理。

近日使用Tomcat调试的时候,使用response写入一个Cookie,发现Cookie的值带上了双引号,百思不得其解,查找源码发现Tomcat在写入Cookie值有"/" 的时候,为避免错误,Tomcat做了以下处理: org.apache.tomcat.util.http...
  • u014419512
  • u014419512
  • 2014-05-06 15:12
  • 4979

Tomcat7.0源码分析——Session管理分析(下)

在《Tomcat7.0源码分析——Session管理分析(上)》一文中我介绍了Session、Session管理器,还以StandardManager为例介绍了Session管理器的初始化与启动,本文将接着介绍Session管理的其它内容。
  • beliefer
  • beliefer
  • 2016-09-30 10:48
  • 6062
    个人资料
    • 访问:12403次
    • 积分:424
    • 等级:
    • 排名:千里之外
    • 原创:31篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章分类
    最新评论