深入了解session/cookie机制

一、相关概念

cookie:实现客户端只有状态。
session:实现服务端持有状态。
jsessionid:一个唯一标识号,用来标识服务器端的Session,也用来标识客户端的Cookie,客户端和服务器端通过这个JSESSIONID来一一对应。

二、session是什么时候创建的?

Session并不是在客户端第一次访问就会在服务器端生成,而是在服务器端(一般是servlet里)使用request调用getSession方法才生成的。但是默认情况下,jsp页面会调用request.getSession(),即jsp页面的这个属性<%@ page session=”true” %>默认是true的,编译成servlet后会调用request.getSession()。所以只要访问jsp页面,一般是会在服务器端创建session的。

三、session是由谁创建?

应用服务器,如tomcat。

四、客户端到服务端,通过cookie、session、jsessionid三者实现有状态服务的具体流程是什么?

1、客户端第一次请求到服务器连接,这个连接是没有附带任何东西的,没有Cookie,没有JSESSIONID。

2、服务器端接收到请求后,会检查这次请求有没有传过来JSESSIONID或者Cookie,如果没有JSESSIONID和Cookie,则服务器端会创建一个Session,并生成一个与该Session相关联的JSESSIONID返回给客户端,客户端会保存这个JSESSIONID,并生成一个与该JSESSIONID关联的Cookie;

3、第二次请求的时候,会把该Cookie(包含JSESSIONID)一起发送给服务器端,这次服务器发现这个请求有了Cookie,便从中取出JSESSIONID,然后根据这个JSESSIONID找到对应的Session,这样便把Http的无状态连接变成了有状态的连接。

4、但是有时候浏览器(即客户端)会禁用Cookie,我们知道Cookie是通过Http的请求头部的一个cookie字段传过去的,如果禁用,那么便得不到这个值,JSESSIONID便不能通过Cookie传入服务器端,当然我们还有其他的解决办法,url重写和隐藏表单,url重写就是把JSESSIONID附带在url后面传过去。隐藏表单是在表单提交的时候传入一个隐藏字段JSESSIONID。这两种方式都能把JSESSIONID传过去。

5、上述步骤由应用服务器tomcat和浏览器共同完成,其中cookie解析、session创建、jsessionid生成、URL重写等都是由tomcat完成,二次请求时cookie封装jsessionid则由浏览器完成。

五、参考文章

1、Tomcat源码分析(九)–Session管理
2、Cookie/Session机制详解

你可能感兴趣的:(tomcat)