为什么要有Cookie和Session
HTTP协议被称为无状态(Stateless)协议
我们拿到请求的时候,不知道是谁发送的请求;但是在需求中,我们我们又需要知道是谁发送的信息,是在什么场景下发的,这很矛盾,所以引入了Cookie和Session
什么是Cookie和Session
Cookie,会员卡就是Cookie, 由服务器传递给客户端,并要求客户端有保存会员卡的职责+再次请求时携带会员卡的职责
Session维护在服务器端的档案信息 会员卡号(10086)被称为 Sesson-id
Web场景中 Cookie是属于HTTP协议标准规定的内容 Session并没有硬性规定,有各种方案实现。只要是类似概念即可
注意: 删了浏览器cookie,虽然服务器的session还在,但由于没有cookie,取不到,认为没登录 改了浏览器cookie,由于对应的session-id无法找到对应的session,认为没登录 重启服务器(session信息目前在内存中,所以没了),虽然浏览器的cookie还在,但找不到对应的session,认为没登录
开发者工具: 网络面板,可以查看请求中的Cookie头以及响应中的Set-Cookie头 应用面板,可以查看当前有的Cookie信息,也可以新增、修改、删除Cookie信息
浏览器有保存cookie的职责 浏览器有在以后请求时携带cookie的职责 携带同一个域下的所有cookie
Session管理对象,类似key-value
Map<Session-ld, HttpSession对象>一开始的时候的空的
HttpSession对象,类似key-value
Map<String, Object>
req.getSession(boolean create);
取出本次请求对应的Session对象。
如果session-id可以取出对象,则create的值不重要。 如果session-id没法取出对象,则 create = true,会创建新的session对象,并返回 create = false,直接返回false
HttpSession session = req.getSession(false);
1.从请求中读取cookie值,其中name是JSESSIONID的值
HttpSession session = req.getSession(true);
可能cookie中没有session-id 也可能session-id找不到对应的HttpSession对象,HttpSession对象是null 由于create == true 创建Session对象
- 生成一个随机值作为sid : xxxyyyzzz
- 创建一个 HttpSession对象(key-value
- sid => HttpSession对象,添加到Session管理对象中
- 设置响应头:Set-Cookie: JSESSIONID=xxxyyyzz
返回HttpSession对象
由于Tomcat运行过程中,Session管理对象有且仅有一份
实现注销(退出登录)
删除 xxxyyyzzz 可以快速达到效果,但是代价比较大 只删除 currentUser 影响最小
Cookie和Session的关系
本质上是两个独立的机制,只是90%场景下是配合使用的,但完全做到没有Session单独使用Cookie,以及没有Cookie,单独使用Session
Cookie:用来在浏览器和服务器之间交换信息的载体、机制 Servlet 中如何脱离Session使用Cookie:
- 从请求中获取Cookie
Cookie[] req.getCookies(); =>本次携带的所有Cookie信息 - 向响应中种(设置)Cookie
resp.addCookie(Cookie cookie)
简要了解cookie 里的其他属性
-
Domain :决定了Cookie所在的域,浏览器在发送请求时,只会携带同域下的所有cookie请求腾讯网,不应该携带百度的cookie www.qq.com和news.qq.com都是qq.com大域,又可以视为不同的子域,通过设置domain,在不同子域下生效 -
Path是根(/)所有路径都携带,而已可以通过设置路径,决定哪些路径下发送 -
Expires过期时间:没有cookie都可以设置过期时间 超过过期时间的cookie,应该被浏览器删除,也不应该携带该cookie 了 【现象:登录之后,一段时间里不用重复登录,但超过一定时间,就需要重新登录】 -
Expries:会话(Session)是同一个词,但不是一个含义 浏览器打开期间有效。关闭浏览器之后就失效了可以设置具体的时间
|