转载的文章
该文章系统地讲述Cookie与Session机制,并比较说明什么时候不能用Cookie,什么时候不能用Session。
以下是自己的一些理解。(2018-02-28)
session和cookie,它们都是用于会话跟踪。
HTTP是无状态的协议。但是Web应用请求之间通过是有关联的。使用会话跟踪技术可以完善HTTP的无状态的问题。
cookie是保存在客户端的一个文本片段,其实质就是一个键值对。cookie可以有多个,作为请求的请求头的一部分发送到服务端。由于cookie是保存在客户端的,因此安全性有所欠缺。
而session中的信息是保存在服务器端,因此比cookie安全,当客户端请求一个jsp或者servlet的时候,服务器端会附带一个sessionId给客户端,这样,客户端以后就不用每次发送请求都把账号密码发过去了,只要带上这个sessionId,服务端就能识别这个用户,且通过这个sessionId取出服务器端对应的session。
session对每个用户都是唯一的。关闭浏览器,session就消失了。而且session在服务器端是有存活时间的。另外,客户端可以通过cookie存储sessionId带到服务器端。但是如果,客户端禁用了cookie,也会通过url将sessionId带到服务器。
下面这一段是引用了另一篇文章:深入了解session/cookie机制
客户端到服务端,通过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则由浏览器完成。