Cookie和Session

HTTP协议是一种无状态协议,即每次服务器端收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录。Session和Cookie的主要目的就是为了弥补HTTP的无状态特性。

  • 是服务器发送到浏览器的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);

用处

  • 会话管理:登录、购物车等应该记住的内容。

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对象。

Author

叶润繁

Posted on

2022-01-20

Licensed under