一. 会话技术
一次会话中包含多次请求和相应
一次会话 : 浏览器第一次给服务器资源发送请求, 会话建立, 直到有一方断开为止
- 功能 : 在一次会话的范围内的多次请求间, 共享数据
- 方式 :
- 客户端会话技术 : Cookie
- 服务器端会话技术 : Session
二. Cookie
- 概念 : 客户端会话技术, 客户端第一次请求服务器, 服务器携带一些数据响应给浏览器,响应之后, 浏览器会保存数据到本地. 下一次请求服务器时, 会带着这些数据一起发送请求(因此可以获取到存储在浏览器本地的数据)
- 使用步骤 :
- 创建Cookie对象, 绑定数据
new Cookie(String name, String value);
- 发送Cookie对象
response.addCookie(Cookie cookie);
- 获取Cookie,拿到数据
Cookie[] request.getCookies()
- 实现原理 : 基于响应头set-cookie和请求头cookie实现
第一次请求, 服务器给浏览器的响应中设置Cookie
第二次访问服务器时, 浏览器的请求中会携带Cookie中的数据进行访问
- Cookie细节
- 一次能否发送多个Cookie?
可以, 通过创建多个Cookie对象, 使用response调用多次addCookie方法发送Cookie即可. - Cookie在浏览器中保存多长时间?
- 默认情况下, 当浏览器关闭后, Cookie数据被销毁
- 持久化存储 :
- setMaxAge(int seconds)
- 正数 : 将Cookie数据写到硬盘的文件中. 持久化存储, Cookie存活时间
- 负数 : 默认值
- 零 : 删除Cookie信息
- Cookie能不能保存中文?
在Tomcat 8 之前, Cookie中不能直接存储中文数据.
- 需要将中文数据转码 — 一般采用URL编码(%E3)
Tomcat 8之后, Cookie支持中文.
Tips:特殊字符仍不支持, 建议使用URL编码存储, URL解码解析
- URL编码 :
URLEncoder.encode(date_format, "utf-8");
- URL解码 :
URLDecoder.decode(value, "utf-8");
- Cookie共享问题?
- 假如在一个tomcat服务器中, 部署了多个web项目, 那么在这些web项目中cookie能不能共享?
- 默认情况下cookie不能共享
- setPath(String path) : 设置cookie的获取范围. 默认情况想, 设置当前的虚拟目录.
- 不同的tomcat服务器键cookie共享问题?
- setDomain(String path) : 如果设置一级域名相同, 那么多个服务器之间cookie可以共享
- setDomain(".baidu.com"), 那么tieba.baidu.com和news.baidu.com中cookie可以共享
- Cookie的特点和作用
- Cookie存储数据在客户端浏览器
- 浏览器对于单个Cookie的大小有限制(4kb)以及同一个域名下的总Cookie数量也有限制(20个)
- 作用 :
- Cookie一般用于存储少量的不太敏感的数据
- 在不登录的情况下, 完成服务器对客户端的身份识别
- 案例 : 记住上一次访问时间
- 需求 :
- 访问一个Servlet, 如果是第一次访问, 则提示: 您好, 欢迎您首次访问
- 如果不是第一次访问, 则提示, 欢迎回来, 您上次访问时间为 : 显示时间字符串
- 分析 :
- 可以采用Cookie来完成
- 在服务器中的Servlet判断是否有一个名为lastTime的Cookie
- 有 : 不是第一次访问
- 响应数据 : 欢迎回来, 您上次访问时间为 :
xxxx年xx月xx日 xx:xx:xx
- 写会Cookie : lastTime =
xxxx年xx月xx日 xx:xx:xx
- 没有 : 是第一次访问
- 响应数据 : 您好, 欢迎您首次访问
- 写会Cookie : lastTime =
xxxx年xx月xx日 xx:xx:xx
三. Session
- 概念 : 服务器端会话技术, 在一次会话的多次请求间共享数据, 将数据保存在服务器端的对象中. HttpSession
- 使用步骤 :
- 获取HttpSession对象 :
HttpSession session = request.getSession();
- 使用HttpSession对象 :
Object getAttribute(String name)
void setAttribute(String name, Object value)
void removeAttribute(String name)
- 原理 :
Session的实现是依赖于Cookie的
设置sessoin后, 请求浏览器, 服务器会响应一个以Cookie形式的JSESSIONID给浏览器,
之后,在访问其他的页面时, 请求中Cookie会携带JSESSIONID来看是否是同一个seesion. - 细节
- 当客户端关闭后, 服务器不关, 两次获取session是否为同一个?
- 默认情况下, 获取的不是同一个session
- 如果需要相同, 则可以通过创建Cookie, 并将键设为JSESSIONID, 值为session.getID(), 然后设置最大存活时间, 让Cookie持久化保存
- 客户端不关闭, 服务器关闭后, 两次获取的session是同一个么?
- 对于Tomcat来说, sessionID不同, 但是里面存储的数据是不会变的
- idea, 不仅sessionID不同, 存储的数据也会清空
- session的钝化 : 在服务器正常关闭之前, 将session对象序列化到硬盘上
- session的活化 : 在服务器启动后, 将session文件转化为内存中的session对象即可
- session的失效时间?
- 服务器关闭
- session对象调用 invalidate() 可以自行销毁
- session默认失效时间30分钟
该默认时间可以自己修改 : 在Tomcat目录 -> conf -> web.xml
中
- Session的特点
- session用于存储一次会话的多次请求的数据, 存在服务器端
- session可以存储任意类型, 任意大小的数据
- session与Cookie的区别 :
- session存储数据在服务器端, Cookie在客户端
- session没有数据大小限制, Cookie有
- session数据安全, Cookie相对不安全