1. HTTP是无状态协议?
HTTP无状态协议,是指协议对于事务处理没有记忆能力。同一个客户端的这次请求和上次请求是没有对应关系,对http服务器来说,它并不知道这两个请求来自同一个客户端。
无状态,意味着如果后续处理需要前面的信息,则它必须重传。这样可能导致每次连接传送的数据量增大。但是另一方面,在服务器不需要先前信息时它的应答就较快。
因此在web应用开发里就出现了保持http状态的技术:一个是cookie技术,另一种是session技术。
2. 什么是Cookie?
Cookie实际上是一小段的文本信息。
客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie,客户端浏览器会把Cookie保存起来。
当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。
服务器还可以根据需要修改Cookie的内容。Cookie的内容主要包括:名字,值,过期时间,路径和域。
3. 服务端怎么向客户端颁发Cookie?
客户端第一次请求服务器的时候,服务器的响应头中会有一个 Set-Cookie: JSESSIONID=0000581f4j5s8Y7fL1gKZ5NpavO:17tvfoc18;。
Set-Cookie由服务器发送,它包含在响应体的头部中。它用于在客户端创建或更新Cookie。
4. 客户端怎么携带着Cookie访问服务器?
客户端发送请求时会自动在请求头上添加:Cookie:JSESSIONID=0000581f4j5s8Y7fL1gKZ5NpavO:17tvfoc18;(客户端第一次拿到的SessionID)
只有cookie的domain和path与请求的URL匹配才会发送这个cookie。
5. 什么是Session?
客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。
6. Session在何时创建?
在服务器端程序运行的过程中创建的。在Java中是通过调用HttpServletRequest的getSession(true)方法创建的。
在创建了Session的同时,服务器会为该Session生成唯一的SessionId,而这个SessionId在随后的请求中会被用来重新获得已经创建的Session。
session的实现机制都是web容器里内部机制。
7. 会话是怎么保持的?
在Session被创建之后,就可以调用Session相关的方法往Session中增加内容了,而这些内容只会保存在服务器中,发到客户端的只有SessionId。
当客户端再次发送请求的时候,会将这个SessionId带上,服务器接受到请求之后就会依据SessionId找到相应的Session,从而再次使用之。正式这样一个过程,用户的状态也就得以保持了。
8. Session在什么时候删除?
超时;程序调用HttpSession.invalidate();程序关闭;
9. Session存放在哪里?
一般存放在服务器端的内存中。不过session可以通过特殊的方式做持久化管理(memcache,redis)。
10. Session的id是从哪里来的?
当客户端第一次请求session对象时候,服务器会为客户端创建一个session,并将通过特殊算法算出一个session的ID,用来标识该session对象
11. Session会因为浏览器的关闭而删除吗?
不会,Session只会通过上面提到的方式去关闭。
浏览器关闭只是把sessionId给清除了,所以再次打开浏览器并请求服务器,你的登录状态无法找到,因此你需要重新登录。
一般情况下,浏览器如果不刷新或者不重新请求的话,服务器一般会缓存session数据20分钟左右