Cookie和Session
HTTP协议是一种无状态协议
,即每次服务器端收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录。Session和Cookie的主要目的就是为了弥补HTTP的无状态特性。
Cookie
- 是服务器发送到浏览器的Cookie,浏览器会进行存储,并与下一个请求一起发送到服务器。通常,它用于判断两个请求是否来自于同一个浏览器,例如用户保持登陆状态。
- 每个Cookie的大小不能超过4KB。
如何创建Cookie?
当服务器接收到客户端发出的HTTP请求时,服务器可以发送带有响应的$Set-Cookie$表头,Cookie由浏览器存储,然后将Cookie与HTTP标头一同向服务器发出请求。
下面是发送Cookie的例子:
此表头告诉浏览器要存储Cookie。
之后,浏览器每次发出的新请求都将使用Cookie头将以前存储的Cookie发送回服务器。
常用API
- getName():获取名称,cookie的key。
- getValue():获取值,cookie的value。
- setValue():设置内容,用于修改key对应的value值。
- req.getCookies():servlet接收浏览器发送的所有Cookie。
- setMaxAge(int expiry):设置Cookie的存活时间。
- 正数:表示在指定的秒数后过期。
- 负数:表示浏览器关闭就会过期,默认值是-1.
- 零:表示马上删除Cookie。
- setPath(String url):Cookie 的 path 属性可以有效的过滤哪些 Cookie 可以发送给服务器,哪些不发。 path 属性是通过请求的地址来进行有效的过滤。例如设置
path=/docs
,则以下地址都会匹配:- /docs
- /docs/Web/
- /docs/Web/Http
- Cookie不能发送中文,如果要发送中文,就需要特殊处理。
- 发送Cookie:
Cookie cookie = new Cookie(URLEncoder.encode("哈哈"),URLEncoder.encode("呵呵"));
resp.addCookie(cookie);
- 获取Cookie的key和value:
URLDecoder.decoder(request.getCookie().getName);
URLDecoder.decoder(request.getCookie().getValue);
- 发送Cookie:
用处
- 会话管理:登录、购物车等应该记住的内容。
Session
- 客户端请求服务端,服务端会为这次请求开辟一块内存空间,这个对象便是Session对象,存储结构为
ConcurrentHashMap
. - Session会话中,经常用来保持用户登录之后的信息。Session是个域对象。
创建Session
request.getSession()
:第一次调用是创建Session会话,之后都是获取之前创建好的Session会话对象。isNew()
:true为刚创建的,false表示获取之前创建。- 每个Session都有一个ID,是它的唯一表示,
getId()
得到Session的会话id值。 - Session的生命周期控制:
setMaxInactiveInterval(int interval)
设置Session的超时时间(以秒为单位)。为负数时表示永远有效。 invalidate()
表示让当前Session立即失效。
Session如何判断是否是同一会话
服务器每次接收到新的请求时,会创建Session对象,同时生成一个sessionId,并创建Cookie对象,这个Cookie对象的key为:JSESSIONID,value为sessionid。通过响应头的Set-Cookie
向客户端发送要设置Cookie的响应。客户端收到响应后,会创建出一个Cookie对象,并在之后的每次请求都把Session的id以Cookie形式发送给服务器。服务器通过读取Cookie信息,获取名称为JSESSIONID的值,找到之前创建好的Session对象。
Cookie和Session