会话管理
概念
管理浏览器与服务器之间的会话过程中产生的会话数据
经过分析,数据共享可以使用域对象,因为ServletContext只有一个,导致每次向里面放数据的时候,如果键相同,值就会覆盖所以不可行.而request对象虽然是多个,但是如果要取到共享的数据,需要使用转发,所以也不可行.因此出现了会话管理技术
会话管理技术
cookie技术:数据保存在浏览器端
session技术:数据保存在服务器端
Cookie技术原理
1.由服务器创建Cookie对象,发送给浏览器,浏览器会保存到缓存中去,response.addCookie(cookie); (响应头:set-cookie:name=jacky)
2.下次访问携带保存的cookie信息,请求头:cookie:name=jacky
3.服务器获取浏览器发送的cookie数据,response.getCookiess()
注意:如果需要发送中文数据,需要使用URLEncoder.encode()进行加密
Cookie细节
1.cookie的数据类型一定是字符串,如果要发送中文,必须先对中文进行URL加密才可以发送
2.setPath():修改cookie所在的有效路径.什么是有效路径?如果把该cookie设置到某个有效路径下,每当浏览器访问这个有效路径的时候,才会携带cookie数据给服务器
3.setMaxAge(整数):设置cookie的有效时间
正整数:表示超过了正整数的数值时间,cookie就会丢失(单位秒)
负整数:如果浏览器关闭了,cookie就丢失
0:删除同名的cookie
4.cookie可以有多个,但是浏览器一般只允许存放300个cookie,每个站点最多存放20个cookie,每个cookie的大小限制为4KB
Session引入
Cookie特点:
1.会话数据放在浏览器端
2.数据类型只能是String,而且有大小限制(4KB)
3.相对数据不安全
Session特点:
1.会话数据放在服务器端(服务器内存),占用服务器的资源
2.数据类型任意,没有大小限制
3.相对安全一点
Session使用步骤
HttpSession对象:
1.创建HttpSession对象,用于保存会话数据
request.getSession(); 创建或者获取session对象
2.修改HttpSession对象
void setMaxInactiveInterval(int interval) 设置session对象的有效时间
void invalid() 手动销毁session对象
3.保存会话数据(作为域对象)
session.setAttribute(“name”,Object); 保存数据
session.getAttribute(“name”); 获取数据
session.removeAttribute(“name”); 删除数据
Session原理
问题:服务器怎么区分不同的浏览器会话?
前提:可以从session对象中取出数据,必须是操作的是同一个session对象
1.服务器创建session对象,服务器会给这个session对象分配唯一的标记JSESSION
2.把JSESSION作为Cookie发送给服务器
3.浏览器保存JSESSION,在下次访问的时候携带这个JSESSION去访问服务器
4.服务器得到JSESSION对象,在内存中搜索是否存在指定JSESSION的session对象
5.如果找到,则返回这个session对象
6.如果找不到,可能直接返回null,或者再创建新的session对象
结论:通过JSESSION在服务器中查询对应的session对象
Session细节
1.setMaxInactiveInterval(秒数):设置session对象的有效时间
问题:session对象在上面时候销毁?
注意:不是浏览器关闭,session对象就销毁!!!
默认情况下:等待30分钟空闲时间,session对象才会销毁
2.可以让JSESSION不会随着浏览器关闭而丢失
3.直接手动销毁session对象
invalidate()
4.创建或者获取session对象
request.getSession() = request.getSession(true); 创建或者得到session对象,查询session对象,如果没有session对象,则创建新的session对象
request.getSession(false) 得到session对象.查询session对象,如果session对象不存在,则直接返回null