会话技术
一 会话技术简介
会话: 一次会话中包含多次请求和响应
一次会话: 客户端第一次给服务器发送请求 会话建立 直到有一方断开为止
功能: 在一次会话范围内的多次请求间 共享数据
方式: 客户端会话技术Cookie 服务端会话技术Session
二 Cookie
客户端会话技术 将数据保存到客户端
1. 快速入门
a. 创建Cookie 绑定数据
new Cookie(String name, String value)
b. 发送Cookie
HttpServletResponse#addCookie(Cookie cookie)
c. 获取Cookie 拿到数据
HttpServletRequest#getCookies() -> Cookie[]
2. 实现原理
基于响应头Set-Cookie和请求头Cookie实现
3. Cookie细节
a. 可以创建多个Cookie对象 使用response多次调用addCookie() 发送多个Cookie
b. 默认情况下 当客户端关闭后 Cookie数据被销毁 使用Cookie#setMaxAge(int expiry) 可以持久化存储 expiry=负数是默认值 expiry=0是删除Cookie信息 expiry=正数是存活时间(单位秒)
c. 在tomcat8之前 Cookie不支持中文数据 在tomcat8之后 Cookie支持中文数据 但是特殊字符还是不支持 所以建议都使用URL编码存储
d. Cookie共享问题
1> 在一个tomcat服务器中 部署了多个web项目 默认情况下Cookie不能共享 使用Cookie#setPath("/") 可以共享Cookie
2> 不同tomcat服务器间 默认情况下Cookie不能共享 使用Cookie#setDomain(".qq.com") 可以共享Cookie(一级域名必须相同)
4. Cookie特点
a. Cookie存储数据在客户端
b. 浏览器对于单个Cookie的大小有限制(4kb) 以及对同一个域名下的总Cookie数量也有限制(20个)
5. Cookie功能
a. Cookie一般用于存储少量的不太敏感的数据
b. 在不登录的情况下 完成服务器对客户端的身份识别
三 Session
服务端会话技术 将数据保存到服务端
1. 快速入门
a. 获取HttpSession
HttpServletRequest#getSession() -> HttpSession
b. 使用HttpSession
存储数据 void setAttribute(String name, Object value)
通过键获取值 Object getAttribute(String name)
通过键移除值 void removeAttribute(String name)
2. 实现原理
Session的实现依赖于Cookie
3. Session细节
a. 当客户端关闭后 服务器不关闭 两次获取Session 默认情况下不是同一个 如果需要相同 可以创建Cookie("JSESSIONID", session.getId()) 设置最大存活时间 让Cookie持久化保存
b. 当客户端不关闭 服务器关闭后 两次获取Session 不是同一个 但是要确保数据不丢失 tomcat自动完成以下工作
1> Session钝化: 在服务器正常关闭之前 将Session对象序列化到硬盘上
2> Session活化: 在服务器启动后 将Session文件转化为内存中的Session对象
c. Session什么时候被销毁
1> 服务器关闭
2> Session#invalidate()
3> Session默认失效时间是30分钟 可以选择性配置修改 在tomcat/conf/web.xml中 <session-config>节点下
4. Session特点
a. Session存储数据在服务端
b. Session可以存储任意类型 任意大小的数据
5. Session功能
a. 共享数据
域对象: 一个有作用范围的对象 可以在范围内共享数据
Session域: 代表一次会话的范围
存储数据 void setAttribute(String name, Object obj)
通过键获取值 Object getAttribute(String name)
通过键移除值 void removeAttribute(String name)