一、会话技术的引入
1.问题:将验证码保存在servletcontext中会有问题,这是一个域对象,并且是一个全局变量,如果有两个人同时去获取验证码,第一个人还没有输入验证码,这个时候第二个人已经重新请求了验证码,所以第一个人会一直显示验证码输入错误
2.需求:每个用户去访问服务器的时候,验证码都应该保存在一个共享内存中,但是这个共享内存必须是每个浏览器独立的
3.会话:打开浏览器到关闭浏览器之间所做的一系列请求,我们称之为一次会话
4.会话技术:在一次会话的多次请求之间共享数据,因为http协议无状态(相互独立,无法共享数据)
二、Cookie的学习
1.使用Cookie的过程演示
2.特点:数据会保存在浏览器中
3.代码实现
//第一次请求服务器,服务器给浏览器响应cookie
Cookie cookie = new Cookie("code",code);
resp.addCookie(cookie);
//再次请求服务器,会携带上一次响应的cookie,然后服务器会获取cookie
Cookie[] cookies = request.getCookies();
if(cookies!=null&&cookies.length>0){
for (int i = 0; i < cookies.length ; i++) {
String name = cookies[i].getName();
String value = cookies[i].getValue();
System.out.println("服务器生成的验证码"+name+":"+value);
}
}
//用户输入的验证码
String checkcode1 = request.getParameter("checkcode1");
System.out.println("用户输入的验证码code:"+checkcode1);
//演示结果
用户输入的验证码code:ocq4p
JSESSIONID:3AC643B6443FAD920FC11D6262F11FD2
服务器生成的验证码code:OCQ4P
Idea-dfc259e4:a9775511-fb8e-4df1-8db7-1a278efd9dd3
4.Cookie在传输过程中存在的位置
响应消息的响应头里面会响应set-Cookie:code=OCQ4P(每一个浏览器必须要支持cookie,cookie在响应头里面),自动保存在浏览器内存中
请求消息的请求头里面会携带Cookie:code=OCQ4P,自动携带
5.cookie的相关方法
//设置cookie的有效路径,以后只有浏览器访问这个路径的资源才会携带这个cookie*/
String code="bianyiit-path_编译IT";
Cookie cookie = new Cookie("code",code);
cookie.setPath("/Cookie03/user");//这里需要设置cookie的真实路径
浏览器访问(localhost:8080/Cookie03/user/servletDemo04);//访问的时候也要加上真实路径
6.在cookie中使用中文会出现乱码问题--响应行和响应头里面不能有中文
中文--非中文--中文 URLEncoder
//URL编码
String code="bianyiit-path_编译IT";
code = URLEncoder.encode(code, "utf-8");
//解码
code = URLDecoder.decode(code, "utf-8");
7.面试题--cookie的分类:持久级别的cookie和会话级别的cookie
会话级别的cookie:
cookie保存在浏览器内存中,浏览器关闭,cookie消失(一次会话范围内有效)
持久级别的cookie:
Cookie cookie = new Cookie("code",code);
//设置cookie的有效时间
cookie.setMaxAge(5*60);//保存五分钟
resp.addCookie(cookie);
删除持久级别的cookie,可以设置cookie的有效时间为0
Cookie cookie = new Cookie("code","");
cookie.setMaxAge(0);
resp.addCookie(cookie);
三、Session的学习
1.使用Session的过程演示
2.特点:数据保存在服务器中
3.代码演示
//产生验证码保存在服务器的Session里面
HttpSession session = req.getSession();
session.setAttribute("code",code);
//第二次请求服务器的时候,从Session取数据
HttpSession session = request.getSession();
Object code = session.getAttribute("code");
关闭浏览器之后,Session里面不会保存之前的数据,因为是在一次会话中
4.基本原理
set-Cookie:JSESSIONID:3AC643B6443FAD920FC11D6262F11FD2
Cookie:JSESSIONID:3AC643B6443FAD920FC11D6262F11FD2
用一个唯一的ID去标识Session,两个用户同时访问服务器的时候,会通过携带过来的ID找到对应的Session
第一次请求的时候没有携带JSessionID,所以第一次请求的时候是创建Session,然后响应JSessionID给浏览器
第二次请求和以后的请求就会标识对应浏览器携带的JSessionID去对应的Session里面去取对应的数据
Session的实现基于cookie
5.Session的一些细节
//关闭浏览器,服务器并不知道浏览器关闭了,所以Session并不会立马销毁,在项目的配置文件web.xml中,我们看见Session的保存时间为30分钟
//Session可以作为域对象存储数据
//三个域对象的作用范围
request :一次请求
session :一次会话的多次请求之间
servletContext:整个web项目
6.Session的生命周期
创建:
浏览器第一次调用request的getSession方法的时候去创建Session
销毁:
1.默认30分钟有效时间到期
2.手动调用session.invalidate();
3.服务器非正常关闭的时候,session会销毁
4.如果正常关闭服务器,Session会被钝化(序列化)到磁盘,下一次重新启动tomcat的时候,Session又会被锐化(反序列化)到内存中
在IDEA中,每次发布项目都会创建tomcat的临时配置,每次重启tomcat,配置文件都会重新生成,之前的会被删除
7.cookie和session的区别
1.cookie的数据是保存在浏览器中的,session的数据是保存在服务器中的
2.cookie相对不安全,而session相对安全
3.cookie只能保存少量的数据到浏览器(对cookie的个数和大小有限制,并且对每个项目的cookie数据也有限制)
4.session对保存的数据量和个数没有限制
8.防止验证码重复使用
//为了防止用户通过浏览器的回退按钮,再次输入原来的验证码还是可以登录进去
//在获取完Session中的验证码之后将服务器中Session的内容移除掉
String code=(String)request.getSession().getAttribute("code");
request.getSession().removeAttribute("code");