session
浏览器与服务器之间的一次会话,包含多个请求;
是服务器为每一位用户在服务器端开辟的一块空间(用来存储用户相关的数据信息):
- 包含sessionId(唯一),可以根据sessionId访问到用户自身的其他数据信息;
获取session:
req.getSession()
(对象类型为HttpSession);向session中放数据:
session.setAttribute("key", value)
;从session中取数据:
session.getAttribute("key")
;什么时候使用session:当每个用户拥有自己不同的数据时,需要使用session,例如登陆账号
登陆流程:
session和浏览器、服务器都有关,而session存放空间在服务器端;
每个用户也拥有自己的session,服务器根据用户sessionId来区分,那么服务器是如何知道不同客户的sessionId?
- 客户端和浏览器第一次建立请求,服务器为该客户创建一个session对象,并且指派一个sessionId。当服务器响应客户端时,会将这个sessionId以cookie的方式,通过response写入浏览器的内存中。当该客户再次发起请求时,会将该sessionId传递给服务器。服务器根据接收到的sessionId查找该客户对应的session
session的建立时机:设置req.getSession(true)时(一般情况下在请求servlet/jsp时);
浏览器关闭时,session不会被删除(因为session存储在服务器端),但不能找到原来的session(因为本地sessionId存储在浏览器的内存中,但浏览器关闭意味着进程已经结束);
session何时被删除:
- 时间超时:设置session失效时间:session.setMaxInactiveInterval(int) 单位为秒,从最后一次请求访问后开始计时;
- 手动调用:session.invalidate()使session失效;
- 服务器关闭或停止;
从session中移除值:
session.removeAttribute(key)
cookie
服务器端将文本信息存储在客户端,可以存放在磁盘上,cookie是以key-value形式存放的,都是String类型;
服务器如何将数据写入客户端?
//新建cookie对象
Cookie ck = new Cookie("name", "char");
//设置cookie有效时间
ck.setMaxAge(10 * 60); //单位为秒
//通过response对象,将cookie写入客户端
resp.addCookie(ck);
当有效时间小于0时,cookie不存储到磁盘中,但是会存储在浏览器内存中,关闭浏览器,cookie则会失效;
当有效时间为0时,cookie会回写到客户端,但是会立即被删除,下一次请求将不会被携带;
当有效时间大于0时,cookie会被存储到磁盘,当浏览器关闭,下一次请求仍然会被携带到服务器;
默认情况下,cookie存储在内存中;
取出cookie中的值:
- cookie的name和value会随着请求到服务器端,而其他信息会有浏览器管理(例如MaxAge)
cookie的应用:减轻服务器存储 数据的压力;读取本地信息效率优于读取服务器端信息;
保证cookie的安全性:为cookie进行加密;
cookie没有修改;如果想修改某个cookie的值,只需要新建一个和key相同的cookie,即可将原来的cookie覆盖。cookie也不需要删除,到期后,浏览器会自动删除;
cookie是带有domain的,每个web应用只能读取自己的cookie。cookie和浏览器有关,不同浏览器的cookie是不能共享的;
cookie由浏览器管理,浏览器可以禁用cookie;
cookie中文处理:
- 在存入cookie时,调用
URLEncoder.encode(value, "utf-8")
,来对中文进行编码 - 再读取cookie时,调用
URLDecoder.decode(ck.getValue(), "utf-8")
,来对中文进行解码
- 在存入cookie时,调用
cookie和session比较
cookie
- 可以存放大量的文本数据
- 安全性较低,存储效率高,执行效率低
session
- 存放的数据量较小
- 安全性较高,效率较高(可以存储对象,而cookie中只能存储字符串,需要转换对象)