会话技术 Cookie&Session
会话技术的抽象理解
浏览器第⼀次给服务器资源发送请求,会话建⽴,直到有⼀⽅断开为⽌的过程,称为⼀次会话。
会话技术就是记录这次会话中客户端的状态与数据的。⼀次会话中包含多次请求和响应。
会话技术的功能:在⼀次会话的范围内的多次请求间,共享数据
Cookie技术
客户端会话技术:Cookie
我们可以将Cookie理解为一把钥匙,这个钥匙存储着我们登陆而保存的钥匙.
- 优缺点:
数据存储在客户端本地,减少服务器端的存储的压⼒,但安全性不好,因为客户端可以清除cookie
Cookie的创建与发送
Cookie cookie1 = new Cookie("username", "zhangsan");
response.addCookie(cookie1);
多个Cookie的创建与发送
Cookie cookie1 = new Cookie("username", "zhangsan");
Cookie cookie3 = new Cookie("username", "lisi");
Cookie cookie2 = new Cookie("password", "123456");
response.addCookie(cookie1);
response.addCookie(cookie2);
response.addCookie(cookie3);
Cookie存在时间的设置
- 默认情况下,当浏览器关闭后,Cookie数据被销毁
- 持久化存储:setMaxAge(int seconds)
- 正数:将Cookie数据写到硬盘的⽂件中。持久化存储。并指定cookie存活时间,时间到后,cookie⽂件⾃动失效
- 负数:默认值30分钟
- 零:删除cookie信息
Cookie cookie1 = new Cookie("username", "zhangsan");
Cookie cookie2 = new Cookie("password", "123456");
cookie1.setMaxAge(-1);//默认值30分钟
cookie2.setMaxAge(60 * 5);//300秒
Cookie设置携带路径: setPath()
1.同一目录的Servlet可以携带Cookie
2.同一应用的Servlet需要设置路径:request.getContextPath()
3.同一服务器下的Servlet设置路径:"/"
Cookie cookie1 = new Cookie("username", "zhangsan");
Cookie cookie2 = new Cookie("password", "123456");
//cookie1设置携带路径为当前服务器
cookie1.setPath("/");
//cookie2设置携带路径为当前应用
cookie2.setPath(request.getContextPath());
Cookie的中文支持
编码: URLEncoder.encode(“张三”, “utf-8”);
解码: URLDecoder.decode(value, “utf-8”);
String name = URLEncoder.encode("张三", "utf-8");
Cookie cookie3 = new Cookie("name", name);
response.addCookie(cookie3);
Session技术
服务器端会话技术:Session
第一次访问服务器, 会创建session对象, 并且生成JSESSIONID编号,
将id编号通过set-cookie发送给客户端保存,再次访问服务器,
客户端会通过cookie将id编号携带到服务器, 通过id来获得session对象
JSESSIONID的持久化:
- 优缺点:
在服务器响应的时候,把更新后的Cookie返回给客户端,以便于下次发起请求
将数据存储到服务器端,安全性相对好,增加服务器的压⼒。
Session的简单创建
延长JSESSIONID所在的cookie时间maxAge()
创建一个cookie, 并且设置持久化时间
HttpSession session = request.getSession();//获得Session对象
session.setAttribute("name","张三");//设置Session对象内容,Session支持任意类型
String id = session.getId();//获得JSESSIONID
Cookie cookie = new Cookie("JSESSIONID", id);//将JSESSIONID传入到Cookie中
cookie.setPath(request.getContextPath());//设置Cookie的携带路径为当前应用
cookie.setMaxAge(Integer.MAX_VALUE);// 设置Cookie的持久化时间
response.addCookie(cookie);//添加Cookie到响应头中
细节
- 当客户端关闭后,服务器不关闭,两次获取session是否为同⼀个?
默认情况下。不是。
如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最⼤存活时间,让cookie持久化保存。
- 客户端不关闭,服务器关闭后,两次获取的session是同⼀个吗?
不是同⼀个,但是要确保数据不丢失。tomcat⾃动完成以下⼯作:
- session的钝化:在服务器正常关闭之前,将session对象序列化到硬盘上
- session的活化:在服务器启动后,将session⽂件转化为内存中的session对象即可
- session什么时候被销毁?
- 服务器关闭
- session对象调⽤invalidate()
- session默认失效时间 30分钟
Cookie与Session的区别
- session存储数据在服务器端,Cookie在客户端
- session没有数据⼤⼩限制,Cookie有
- session数据安全,Cookie相对于不安全
- session可以存储任意类型数据,Cookie只能存储字符串类型