软件的会话
- 浏览器访问Web程序会产生会话,打开浏览器访问程序的第一个资源表示会话的开始,关闭浏览器表示会话的结束
- 会话中的数据由域对象管理
- Servlet中4种域对象:pageContext、request、session、servletContext
- 会话的两种技术
- Cookie:将会话数据保存在客户端的技术
- Session:将会话数据保存在服务端的技术
Cookie技术
特点
- 将数据保存在客户端
- 只能保存字符串,不能直接保存中文,不能保存对象
- 长度不能超过4k
- 数据保存在文本文档中,以明码的形式保存
- cookie的个数不能超过200,每个站点不能超过20(现在的浏览器不一定了)
- Cookie这门技术使用多种语言都能操作,我们使用Java操作
Cookie核心技术
-
cookie的创建
Cookie cookie = new Cookie(String name,String value);
-
cookie的设置:
Cookie.setMaxAge(int num);//设置cookie的存活时间 Cookie.setPath();//设置cookie的访问路径 resp.addCookie(cookie);//将cookie发送到客户端浏览器 Cookie[] cookies = req.getCookies();//servlet读取cookie
-
从Cookie中取值
String name = cookie.getName(); String value = cookie.getValue();
Cookie原理
- cookie是如何从服务端到客户端的?
- 程序中使用resp.addCookie(cookie)发送,本质上是使用响应头set-Cookie将cookie的内容发送到浏览器
- cookie是如何从客户端到服务端的?
- 浏览器在访问服务端程序的时候,会使用请求头cookie将保存的cookie内容发送到服务端.
- 浏览器是如何知道服务端程序需要cookie?
- 浏览器并不知道服务端程序是否需要cookie,只要访问,就会携带所有符合条件的cookie发送过去.
- 服务端如果需要,就获取,如果不需要,就无需理会
Cookie的细节
Cookie的存活时间
-
默认的cookie的存活时间是-1,表示临时保存
-
SetMaxAge(int num): 设置cookie的存活时间
- 值为负整数:表示临时保存在浏览器的内存中,浏览器关闭时销毁,Cookie的默认值是-1.
- 值为正整数:表示使用文本保存,浏览器关闭对于cookie没有影响,单位是秒
- 值为0:实现删除操作,cookie没有提供显式的删除方法
-
浏览器在携带cookie的时候,会选择哪些发送给服务端?
- 浏览器在携带cookie的时候会进行筛选(可在浏览器中查看)
- domain:判断是否是同一个网站,使用setDomain()设置
- Path:如果是同一个网站下的cookie,通过这个属性判断是否是同一个路径下的,使用setPath() 设置
- 注意:虽然可以设置,但是在开发中一般不使用
- 浏览器在携带cookie的时候会进行筛选(可在浏览器中查看)
Session技术
特点
- 能直接保存对象
Session的核心技术
- Session对象的获取(对象由web服务器创建)
- req.getSession():获取session对象.
- req.getSession(boolean flag):获取session对象.
- Session对象的操作
- String getID(): 获取session对象的id值
- Void invalidate() : 销毁session对象
- Void setMaxInactiveInterval(int num) : 设置session的存活时间
- Session对象作为域对象的操作
- SetAttribute(String name,Object value) : 给session中添加键值对
- getAttribute(String name) : 从session中根据键获取值
- renmoveAttribute(String name) : 给session中根据键删除键值对
Session原理
- session能够绑定浏览器,区分有没有分配session对象,实现区分用户.
- Session是如何绑定浏览器的?
- 浏览器第一次访问服务器,服务器会检查浏览器请求中携带的cookie,有没有包含一个名为JSESSIONID的cookie.如果没有,说明浏览器还没有绑定session对象,服务器会创建一个新的session对象供浏览器使用,同时会使用响应传输一个Cookie,名为JSESSIONID的cookie,值就是刚才创建的session对象的ID值,这样浏览器就保存了session的ID
- 当浏览器再次访问服务器,会携带上次保存的cookie(JSESSIONID),服务器检查到这个cookie,就会取出cookie的值,作为session对象的ID查找服务器保存的所有session对象,看看有没有这个对象,如果有就返回,如果没有就会创建新的
- Web服务器是如何管理session对象?
- 管理session对象的数据结构其实就是一个map类型的
- Map<String,Object>
- <”1EA441C68C5C66A0A091357A2127CFD5”, session1>
- <”1EA441C68C5C66A0A091357A2127CFD6”, session2>
- <”…”, sessionN>
- 总结:
- session的实现需要服务器和浏览器共同作用才可以
- 如果双方有一方出现问题,都会导致session失效
Sesson细节
-
getSession()与getSession(boolean flag)的区别:
- getSession()
- 第一次访问,没有匹配的session对象,会创建一个新的session对象返回
- 第二次访问,会查找有没有分配的session对象,如果有,返回原来分配的如果没有,返回新的,如果有,返回原有的
- getSession(true): 效果等效于getSession()
- getSession(false)
- 访问的时候,会查找有没有分配的session对象,没有匹配的session对象,返回null
- 如果有,返回原来分配的
- 平时使用的时候,使用无参的方法即可.特殊场景下,根据需要使用有参方法
- getSession()
-
设置session的存活时间:
-
在tomcat的conf目录的web.xml文件中有如下配置信息
<session-config> <session-timeout>30</session-timeout> </session-config>
- 说明默认情况下,session的失效时间是30分钟.
- 这段配置应用于改服务器下所有的项目
- 可以在项目的web.xml文件中重新配置当前项目的session的失效时间
-
session.setMaxInactiveInterval(int num) : 设置指定的session对象的失效时间,单位是秒
-
session.invalidate() : 销毁指定的session对象
-
-
如何实现浏览器关闭,session不失效
// 1.session对象的获取 HttpSession session = req.getSession(); // 2.获取session对象的ID String id = session.getId(); System.out.println(id); // 3.重写保存sessionID的cookie Cookie cookie = new Cookie("JSESSIONID",id); cookie.setMaxAge(60*60*24); resp.addCookie(cookie);
总结
-
会话管理:浏览器和服务器会话过程中的产生的会话数据的管理。
-
Cookie技术
new Cookie("name","value") response.addCookie(coookie) request.getCookies()
-
Session技术
request.getSession(); setAttrbute("name","会话数据"); getAttribute("会话数据")
-
购物车的实现使用Cookie,登陆功能使用session,登出销毁session