Set-Cookie
字段,把键值对写回去.headler
中发给服务器.Cookie有一个最为典型的应用:标识用户的身份信息.
在网站中有个登录功能:比如淘宝, 我们登录一次网站后, 后续再使用访问淘宝的其他页面, 是不需要再次登录的, 还有自动登录功能, 隔了一段时间再次访问淘宝网站, 我们会发现此时并不需要再次输入账号密码登录, 网站就会自动地帮我们登录.
针对登录操作,淘宝会查询数据库,验证用户的用户名和密码是否正确.如果正确,登录成功.
淘宝就会把当前用户的身份信息在内存中也保存一份.
同时给这个用户分配一个表示身份的序号.(可能是个整数/字符串,唯一性).我们把这个生成的唯一身份序号称为sessionId.
服务器使用像hash表这样的结构把序号作为key,身份信息作为value存储起来.服务器把生成的这些键值对称为Session(会话).
服务器给客户端返回的 Cookie 里面就包含 SessionId, 浏览器就会在本地将这个 Cookie 储存起来, 后续浏览器发送请求的时候就会带上这个 Cookie, 服务器收到 Cookie 中的身份序号后, 就会查询 Session 会话表, 如果存在就会可以正常访问, 不用重复的输入账号与密码, 否则就需要用户重新输入账号密码进行登录.
有时候我们会发现登录网站后隔一段时间再次登录, 会出现让我们再次输入账号密码的情况, 此时就是登录状态失效过期了, 这种情况可能是可能是客户端把 Cookie 删了, 也可能是服务器这把对应的身份信息删了.
注意理解 Cookie 和 Session 之间的区别和关联.
关联: 在网站登录功能中可以搭配使用.
区别:
在 HttpServletRequest
类中, 可以使用 getSession
来获取或者创建会话, getCookies
可以获取请求中的 Cookie 列表.
方法 | 描述 |
---|---|
HttpSession getSession() | 在服务器中获取会话. 参数如果为 true, 则当不存在会话时新建会话; 参数如果为 false, 则当不存在会话时返回 null |
Cookie[] getCookies() | 返回一个数组, 包含客户端发送该请求的所有的 Cookie 对象. 会自动把Cookie 中的格式解析成键值对. |
调用 getSession
方法所做的事情:
getSession
有一个 boolean
类型的参数, 如果参数是 true
, 它有如下行为:
cookie
里的 sessionId
字段.sessionld
来查询对应的 HttpSession
对象在服务器上是否存在.HttpSession
对象, 并生成一个唯一的 sessionId
, 会以新生成的 sessionId
作为 Key
, 生成的 HttpSession
对象作为 Value
, 以键值对形式储存到类似于 Hash
的结构中, 然后将 sessionId
设置到响应报文中的 set-Cookie
字段返回给浏览器.HttpSession
对象.如果参数是 false
, 行为如下:
cookie
里的sessionId
字段.sessionld
来查询对应的 HttpSession
对象在服务器上是否存在. null
.HttpSession
对象.总之, getSession
的参数为true
时允许创建 Session 会话, 为false
时不允许创建 Session 会话.
关于HttpSession:
这个对象也可以看作是一个哈希表, 是以键值对的形式存储数据的, 并且允许程序员在对象中储存任意的键值对数据, 但是 Key
必须是 String
类型,Value
的类型是 Object
, 设置就比较随意了.
方法 | 描述 |
---|---|
Object getAttribute(String name) | 查询 session 会话中指定键的键值, 查不到则返回 null. |
void setAttribute(String name, Object value) | 绑定一个键和值到该 session 会话中 |
boolean isNew() | 判定当前是否是新创建出的会话 |