COOKIE
COOKIE的原理:
- 服务器创建Cookie对象,保存会话数据,把Cookie数据发送给浏览器, response.addCookie(cookie); (响应头:set-cookie: name=jacky)
- 浏览器获取cookie数据,保存在浏览器缓存区,然后在下次访问服务器时携带cookie数据 (请求头: cookie: name=jacky)
- 服务器获取浏览器发送的cookie数据 request.getCookies();
1)cookie的数据类型一定是字符串,如果要发送中文,必须先对中文进行URL加密才可以发送。URLEncoder.encode();
2)setPath(path): 修改cookie所在的有效路径。什么是有效路径? 如果把该cookie设置到某个有效路径下,然后当浏览器访问这个有效路径的时候,才会携带cookie数据给服务器。
3) setMaxAge(整数) : 设置cookie的有效时间
正整数: 表示超过了正整数的数值的时间,cookie就会丢失!(时间单位:秒)
负整数: 表示如果浏览器关闭了,cookie就会丢失!(默认情况下)
0 : 表示删除同名的cookie
4)cookie可以有多个,但是浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB
SESSION
1)服务器创建Session对象,服务器会给这个session对象分配一个唯一的标记JSESSIONID
2)把JSESSIONID作为Cookie发送给浏览器
3)浏览器得到JSESSIONID保存下来,在下次访问时携带这个JSESSIONID去访问服务器
4)服务器得到JSESSIONID,在服务器内存中搜索是否存在指定JSSESSINOID的session对象
5)如果找到,则返回这个session对象
6)如果找不到,可能直接返回null,或者再创建新的session对象。
HttpSession session = request.getSession();
结论: 通过JSESSIONID在服务器中查询对应的session对象。
SESSION细节:
1)setMaxInactiveInterval(秒数): 设置session对象的有效时间,如果设置为0或负数永远不会销售session。
问题:session在什么销毁?
一次会话的时间!注意不是浏览器关闭,session对象就销毁!!!
默认情况: 等待30分钟空闲时间,session对象才会销毁。
<!-- 设置全局的session对象的过期时间(分钟)web.xml里<web-app>下添加,注意最小设置1,只能是整数 -->
<session-config>
<session-timeout>1</session-timeout>
</session-config>
2)可以让JSESSIONID不会随着浏览器关闭而丢失!!!
/**
* 设置JSESSIONID的时间,不会随着浏览器关闭而丢失!
*/
Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(1*30*24*60*60);//1个月
response.addCookie(c);
3)直接手动销毁sessino对象
invalidate();
4) 创建或得到session对象
request.getSession(true) 等价于request.getSession() :
创建或得到session对象,查询session对象(查询JSESSIONID),如果没有sessino对象,则创建新的session对象
request.getSession(false) :
得到session对象。 查询session对象,如果没有session对象,直接返回null
COOKIE与SESSION的对比
Cookie特点:
- 会话数据放在浏览器端
- 数据类型只能string,而且有大小限制的
- 相对数据存放不安全。
Session特点:
- 会话数据放在服务器端(服务器内存),占用服务器资源
- 数据类型任意类型,没有大小限制的。
- 相对安全