文章目录标题
1 会话技术
浏览器第⼀次给服务器资源发送请求,会话建⽴,直到有⼀⽅断开为⽌的过程,称为⼀次会话。
会话技术就是记录这次会话中客户端的状态与数据的。⼀次会话中包含多次请求和响应。
功能:在⼀次会话的范围内的多次请求间,共享数据
作用:存数据
⽅式:
客户端会话技术:Cookie
数据存储在客户端本地,减少服务器端的存储的压⼒,安全性不好,客户端可以清除cookie
服务器端会话技术:Session
将数据存储到服务器端,安全性相对好,增加服务器的压⼒。
2 Cookie技术
Cookie技术是将⽤户的数据存储到客户端的技术,我们分为两⽅⾯学习:
1. 服务器端怎样将⼀个Cookie发送到客户端;
2. 服务器端怎样接受客户端携带的Cookie。
2.1 快速⼊⻔
cookie:
1.将数据从服务器存储到客户端
response.addCookie(cookie): 本质就是添加一个响应头 set-cookie
2.将数据从客户端获取到 - 客户端会主动将cookie通过请求传输给服务器
客户端 -> cookie -> 服务器: 本质就是添加一个请求头 cookie
Cookie[] request.getCookies(): 如果没有cookie返回null
1、 创建Cookie对象,绑定数据
// new Cookie(String name, String value)
Cookie cookie = new Cookie("username","zhangsan");
- 发送Cookie对象
// response.addCookie(Cookie cookie);
response.addCookie(cookie);
- 获取Cookie,拿到数据
// Cookie[] request.getCookies()
Cookie[] cookies = request.getCookies();
// 遍历Cookie数组
for(Cookie cookie : cookies){
String cookieName = cookie.getName();
String cookieValue = cookie.getValue();
System.out.println(cookieName + "--" + cookieValue);
}
2.2 cookie的细节
1.默认的生命周期: 会话结束就删除了(销毁)
设置生命周期: setMaxAge(int秒)
2.客户端携带cookie是有条件的, 不是访问所有的网页, 都会将cookie携带过来
在访问某一些特定网页, 客户端才会主动将cookie携带到服务器,
这些特定网页称之为cookie的携带路径
设置携带路径: setPath()
默认的携带路径: 当前目录
/day05/cookie/Demo1Servlet - set-cookie
/day05/cookie/Demo2Servlet - 可以携带
/day05/Demo3Servlet - 和Demo1是同一个应用 "/day05"
/day05/index.jsp
/day04/Demo1Servlet - 和Demo1是同一个服务器 "/"
3.什么是相同的cookie:
cookie的name要一致
cookie的携带路径要一致
4.中文支持:
编码: URLEncoder.encode("张三", "utf-8");
解码: URLDecoder.decode(value, "utf-8");
2.3 Cookie的特点和作⽤
特点:
1. cookie存储数据在客户端浏览器
2. 浏览器对于单个cookie 的⼤⼩有限制(4kb),以及对同⼀个域名下的
总cookie数量也有限制(20个)
作⽤:
1. cookie⼀般⽤于存出少量的不太敏感的数据
2. 在不登录的情况下,完成服务器对客户端的身份识别
3 Session技术
Session技术是将数据存储在服务器端的技术,会为每个客户端都创建
⼀块内存空间存储客户的数据,但客户端需要每次都携带⼀个标识ID
去服务器中寻找属于⾃⼰的内存空间。
所以说Session的实现是基于Cookie,Session需要借助于Cookie
存储客户的唯⼀性标识JSESSIONID。
在Session这我们需要学习如下三个问题:
怎样获得属于本客户端的session对象(内存区域)?
怎样向session中存取数据(session也是⼀个域对象)?
session对象的⽣命周期?
3.1 快速⼊⻔
- 获取HttpSession对象:
HttpSession session = request.getSession();
此⽅法会获得专属于当前会话的Session对象,如果服务器端没有该会话的Session对象会创建⼀个新的Session返回,如果已经有了属于该会话的Session直接将已有的Session返回(实质就是根据JSESSIONID判断该客户端是否在服务器上已经存在session了)
2. 使⽤HttpSession对象:
Object getAttribute(String name)
void setAttribute(String name, Object value)
void removeAttribute(String name)
3.2 原理
Session的实现是依赖于Cookie的。
3.3 细节
- 当客户端关闭后,服务器不关闭,两次获取session是否为同⼀个?
默认情况下。不是。
如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最⼤存活时间,让cookie持久化保存。
// JSESSIONID 持久化
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setPath(request.getContextPath());
cookie.setMaxAge(100 * 60);
2. 客户端不关闭,服务器关闭后,两次获取的session是同⼀个吗?
不是同⼀个,但是要确保数据不丢失。tomcat⾃动完成以下⼯作:
session的钝化
在服务器正常关闭之前,将session对象序列化到硬盘上
session的活化
在服务器启动后,将session⽂件转化为内存中的session对象即可
3. session什么时候被销毁?
服务器关闭
session对象调⽤invalidate()
session默认失效时间 30分钟
选择性配置修改
<session-config>
<session-timeout>30</session-timeout>
</session-config>
3.4 session的特点
1. session⽤于存储⼀次会话的多次请求的数据,存在服务器端
2. session可以存储任意类型,任意⼤⼩的数据
4 session与Cookie的区别
1. session存储数据在服务器端,Cookie在客户端
2. session没有数据⼤⼩限制,Cookie有
3. session数据安全,Cookie相对于不安全
4. session可以存储任意类型数据,Cookie只能存储字符串类型
5、session总结
session:
域对象的方法
获得session: HttpSession session = request.getSession();
第一次访问服务器, 会创建session对象, 并且生成JSESSIONID编号
将id编号通过set-cookie发送给客户端保存
再次访问服务器, 客户端会通过cookie将id编号携带到服务器, 通过id来获
得session对象
结论: session依赖于cookie技术
cookie默认生命周期是会话结束就销毁, JSESSIONID就不能保存下去了
JSESSIONID的持久化: 延长JSESSIONID所在的cookie时间 maxAge
创建一个一模一样的cookie, 并且设置持久化时间
生命周期:
创建: 第一次调用getSession()方法时创建
销毁: 1.服务器非正常关闭,
服务器正常关闭时, session中的数据会保存(work/文件) [钝化]
测试: 使用外部Tomcat测试
2.session超时, 默认时间30分钟 - web.xml
<session-config>
<session-timeout>30</session-timeout>
</session-config>
3.手动销毁 session.invalidate()
域对象:
ServletContext域的范围: 一次应用
session域的范围: 一次会话
Request域的范围: 一次请求
cookie: 自动登录使用的账号,密码[Filter]; 未登录状态下的购物车信息等
session: 登录后的用户信息(登录状态); 验证码验证[ajax]