cookie和session: 都是记录用户状态的机制
因为http协议是无状态的,两次连接访问之间没有关联,因此无法从连接上判断用户是否已经登录等权限,而每次访问都去数据库检查的话耗费资源,所以产生了cookie和session两种记录状态的机制。
使用时机:判断用户是否已经进行了某种操作或已具有某种状态(如是否已登录)
在客户端记录用户状态的机制为Cookie
在服务端记录状态的为Session
Cookie
一小段的文本信息
服务端创建Cookie对象--->响应将cookie发送给客户端保存--->下次客户端访问将携带cookie信息到服务端--->服务端获取cookie中的信息
创建并发送cookie
Cookie cookie = new Cookie("username","lilei"); // 新建Cookie
cookie.setMaxAge(Integer.MAX_VALUE); // 设置生命周期为MAX_VALUE,长期有效
response.addCookie(cookie); // 输出到客户端
获取客户端发送过来的所有cookie
Cookie cookies[] = request.getCookies();// 获取所有cookie
if(cookies !=null) { // 如果Cookie不为空
for(Cookie cookie : cookies) { // 遍历Cookie
if(cookie.getName().equals("account")) // 如果Cookie名为 account
account = cookie.getValue(); // 保存account内容
if(cookie.getName().equals("ssid")) // 如果为SSID
ssid = cookie.getValue(); // 保存SSID内容
}
}
cookie在请求头中,以key-value方式保存,一个cookie对象只保存一个属性对
cookie常用属性
Session
存储在服务端内存中(不要太大,容易内存溢出),配合cookie使用,相当于程序在服务端为客户建立的档案,客户来访的时候只需查询档案就行了。
每个来访者都对应一个session对象,Session也是一种key-value的属性对,通过getAttribute(Stringkey)和setAttribute(String key,Objectvalue)方法来读写客户状态信息。Session在第一次请求时创建,之后根据来访的cookie中sessionId获取对应的Session,如找不到则返回新的session,并将sessionId放在cookie中一并返回浏览器。
HttpSession session = request.getSession()/request.getSession(true); // 获取Session对象,true时没有则创建新的session并返回,false时没有则返回null。
如果访问没有使用以上方法则不会创建对应的Session对象。
当session超时会自动清除session释放内存,session失效的3中方式
设置超时时间:1. 设置属性setMaxInactiveInterval(longinterval)
2.在web.xml中配置
<session-config>
<session-timeout>60</session-timeout>// 分钟
<cookie-config>
<http-only>true</http-only>
</cookie-config>
</session-config>
3. void invalidate() 使session失效
常用属性
区别
1. cookie存放于客户端,客户端的硬盘或内存中,session存放在服务端内存中
2. cookie只能存放文本信息,也就是String类型,session能存放任何java类型
3. cookie存放在客户端有被篡改的风险,不安全
4. cookie在浏览器中有大小和个数限制(跟浏览器种类有关),session存放跟服务器内存有关