一: 前提概要
1>会话:
会话指的是用户打开浏览器, 访问某些web服务器资源的时候, 会话就会进行建立, 直到有一方断开, 那么会话才会结束, 需要注意的一点是, 一次的会话可以有多次的请求以及响应
2>会话跟踪:
是一种用于维护浏览器状态的方法, 服务器需要识别多次的请求, 分别来自于那些会话, 以便在一次的会话当中的多次请求已经响应当中, 实现 "数据共享"
3>服务器为什么不能够识别这些请求来自哪个浏览器?
因为服务器跟浏览器之间使用的是HTTP协议, HTTP协议是无状态的, 每次浏览器向服务器进行请求的时候, 服务器都会将其视作新的请求, 所以我们需要会话跟踪技术实现会话之间的数据共享
4>实现方式:
1.客户端会话跟踪技术: Cookie
客户端会话跟踪技术, 实际上就是将一些共享的数据存储在客户端
2.服务端会话跟踪技术: Session
服务端会话跟踪技术, 实际上就是将共享的数据存储在服务端
两者实现的功能其实都是一样的,都是为了解决一次会话中, 多次请求的问题
二: 实现方式--Cookie
1>基本使用:
1.发送Cookie:
// 发送cookie
//创建cookie 进行发送cookie
//1.创建cookie对象
Cookie cookie = new Cookie("username", "zs");
resp.addCookie(cookie);
2.获取Cookie:
// 获取响应的cookie
//在这里, 我们通过req获得的cookie包括了其中所有的cookie, 所以需要通过数组进行相应的接收
Cookie[] cookies = req.getCookies();
// 之后通过循环 以及一些判断的方式来获响应的数据, 键值对
for (Cookie cookie : cookies) {
String name = cookie.getName();
// 进行判断, 我们仅仅只需要我们所输入的键值对即可
if ("username".equals(name)){
String value = cookie.getValue();
System.out.println(name+" "+value);
break;
}
2>Cookic原理:
需要知道的一点是: COOKIE的实现都是基于HTTP协议的!
举例:
在浏览器发送请求之后, 服务端识别出来是cookie, 这个时候服务端会将相应的共享数据存储在响应头(set-cookie)当中, 之后, 将其相应到浏览器当中, 并且将相应的数据存储在浏览器内存中
之后, 浏览器在同一个会话当中再次发送请求, 并且将刚才存储的共享数据放在请求头 (cookie)当中, 以请求的方式放入服务端, 从而实现数据的共享
3>Cookie的使用细节:
1.存活时间:
默认的情况下, Cookie会存储在浏览器当中 , 浏览器关闭的时候相应的Cookie会自动的进行销毁
2.手动设置Cookie的存活时间:
通过这种方式, 可以实现某些记住账号, 密码的任务
Cookie cookie = new Cookie("username", "zs");
// 设置存活时间: 一周
cookie.setMaxAge(60*60*24*7);
resp.addCookie(cookie);
3.Cookie存储中文:
实际上Cookie不能够直接存储相应的中文信息, 比如在这里, 我将相应的值设置为 '张三'
Cookie cookie = new Cookie("username", "zs");
进行访问就会出现以下的错误:
*解决方式:URL编码*
通过使用URL编码 URL解码 的方式进行转码:
String value="张三";
//URL编码:
value = URLEncoder.encode(value,"UTF-8");
System.out.println(value);
Cookie cookie = new Cookie("username", value);
System.out.println("username"+" "+value);
if ("username".equals(name)){
String value = cookie.getValue();
//url解码
value = URLDecoder.decode(value, "UTF-8");
// 进行打印
System.out.println(name+" "+value);
break;
}
问题得到解决
三: 实现方法 -- Session:
1>基本使用:
1.发送Session:
// 存储到Session当中
// 1.获取Session对象
HttpSession session = req.getSession();
//2.存储数据
session.setAttribute("username","zs");
2.获取Session:
//获取数据
//1获取Session对象:
HttpSession session = req.getSession();
Object username = session.getAttribute("username");
System.out.println(username);
2>Session原理:
结论 : Session是基于Cookie来进行实现的
示例:
服务器在接收到相应的请求之后, 发现使用的是Session的方式, 之后就会解析Session的ID, 将其进行记录, 之后再将其通过Cookie的方式, 使用请求头(set-cookie)并且在其中保存ID的值, 传给客户端, 之后客户端将相应的值保存在浏览器当中, 之后再进行响应, 将刚才的数据以响应头(cookie)并且附带之前的地址值传给服务端
3>Session的使用细节:
1.Session的钝化, 活化:
在服务器进行重启之后, Session之前进行提交的数据是否还会存在?(这里指的是正常的关闭, 在IDEA的控制面板当中, 如果直接停止程序是非正常关闭系统)
①钝化:
指的是在服务器进行正常的关闭之后, Tomcat会自动的将Tomcat当中的数据存在硬盘当中
②活化:
再次进行启动服务器之后, 从文件当中加载数据到Session当中, 即在正常关闭之后, 之前的Session是不会被立刻的销毁的, 再次进行启用的时候就会继续加上上一次的数据到Session当中
TIPS:需要注意的一点是, 如果不关闭服务器, 而是在启动服务器之后在浏览器进行访问, 关闭网页, 再次进行访问, 这个时候对应的Session并不是同一个的Session地址值会发生改变, 不再是同一个地址值
2.Session的销毁:
第二种自我销毁的方式, 常常会被用于在退出登录的时候, 销毁相应的Session对象