Cookie与Session特点
1.Cookie特点:
- 会话数据放在浏览器端
- 数据类型只能String,而且有大小限制
- 相对数据存放不安全
2.Session特点:
- 会话数据存放在服务器端(服务器内存),占用服务器资源
- 数据类型任意类型,没有大小限制
- 相对安全
HttpSession对象
1.创建HttpSession对象,用于保存会话数据
session = request.getSession(); //创建或获取session对象
2.修改HttpSession对象
void invalidate() | 手动销毁session对象 |
void setMaxInactiveInterval(int interval) | 设置session对象的有效时间 |
void setAttribute(String name, Object value) | 该方法使用指定的名称绑定一个对象到该 session 会话。 |
void removeAttribute(String name) | 该方法将从该 session 会话移除指定名称的对象。 |
3.保存会话数据作为域对象
session.setAttribute("name",Object); //保存数据
session.getAttribute("name"); //获取数据
session.removeAttribute("name"); //删除数据
Session原理
- 1 服务器创建session对象,服务器给这个session对象分配一个唯一的标记JSESSIONID
- 2 把JSESSIONID作为cookie发送给浏览器
- 3 浏览器得到JSESSIONID保存下来,在下次访问的时候发送给服务器。
- 4 服务器得到JSESSIONID,在服务器内存中搜索是否存在指定JSESSIONID的session对象
- 5 如果找到,则返回该session对象
-
6 如果找不到,可能返回null,也有可能创建一个session。
以上六个步骤,都在下面这句话中执行了。
HttpSession session = request.getSession();
结论:通过JSESSIONID在服务器中查询对应的session对象。
举例:服务器怎样区分不同的浏览器会话?
前提:可以从session对象取出数据是存放数据的session对象
<1>浏览器1-窗口1(001):
//创建HttpSession对象
HttpSession session = request.getSession(); //给session对象分配001
//保存会话
session.setAttribute("name","jacky");
<2>浏览器1-窗口2(001):
//得到session对象
HttpSession session = request.getSession(); //搜索001的session对象
//获取会话数据
String name = (String)session.getAttribute("name"); //可以得到!!!!
<3>浏览器2(没有标记或不是001):
//得到session对象
HttpSession session = request.getSession();
//获取会话数据
String name = (String)session.getAttribute("name"); //不可以得到!!!
<4>新的浏览器1(没有标记或不是001):
//得到session对象
HttpSession session = request.getSession();
//获取会话数据
String name = (String)session.getAttribute("name"); //不可以得到!!!
session细节
1.setMaxInactiveInterval(秒):设置session对象的有效时间
<!-- 设置全局的session有效期(分钟) -->
<session-config>
<session-timeout>1</session-timeout>
</session-config>
注:默认情况下,等待30分钟空闲时间,session对象才会销毁。(不是浏览器关闭,session对象就销毁!)
2.设置JSESSIONID不会随着浏览器的关闭而关闭
Cookie cookie = new Cookie("JSESSIONID",session.getId());
cookie.setMaxAge(1*30*24*60*60);//设置一个月的有效期
response.addCookie(cookie);
3.通过invalidate()方法直接销毁session对象
4.request.getSession()
request.getSession(true):查询session对象,如果没有session对象,创建新的session对象
request.getSession(false):如果没有session对象,返回null。