Session
Session 是存储在服务器上的,每个用户对应在服务器上有一个session,用来存储会话过程中的信息。session是有时间限制的,达到时间以后会失效。当然,用户主动关闭会话session也会失效。
Cookie
Cookie是存储在本地的,客户端访问服务器会通过存储在cookie中的JSESSIONID 也就是sessionId来对应该用户在服务器上的session。 当然 cookie 中存储的不仅仅只有 sessionId这个字段,其他字段存储也可以自定义,但是存储的字段都要发送请求到服务器通过服务器传回的response设置,是不能直接手动设置的 (据我了解的是这样的,后续如果有新的发现会更新)。
HTTP 协议时无状态的,那么服务器怎样将每个请求与用户对应起来呢?
- 在客户端第一次向服务器发送请求的时候会在请求头(Request Headers)中附带一个sessionId 如下, 可以看到这个sessionId是从cookie中取到的,当然没有就不会传了。这个sessionId是之前用户所使用的,可能是有效的(session还没有过期,用户也没有登出),也可能是无效的(很久以前存储的)。
Request Headers
Cookie: JSESSIONID=F72CB9BFE8AEF8555C8BE46C95D7F0B
- 如果是有效的sessionId,那么会与服务器直接连接,使用之前访问过程中产生的session。如果是无效的,那么服务器不认可这个sessionId,会在响应头(Response Headers)返回给客户端一个新的sessionId 如下,让用户在之后的请求使用这个新的sessionId。
Response Headers
Set-Cookie: JSESSIONID=86907ACE2D6792F7F9D1C798A56B916; Path=/; HttpOnly
- 从上面的Response Headers中可以看到在设置cookie时服务器同时指定了domain和path。 Domain 是服务器域名,可以是一级,二级,三级等,区别是只有在域名对应的情况下可以共享这个cookie。path是指在本域内对此cookie具有访问权限的路径,只有此path下的路径才具有访问权限。上例中的“Path = /” 就表示该cookie在这个domain全目录下都有效。