目录
一、会话技术的概述
1.什么是会话
会话简单理解为:用户打开一个浏览器,点击多个超链接访问服务器的web资源,然后关闭浏览器,整个过程称为是一次会话。
2.为什么要学习会话
每个用户与服务器进行交互过程中,产生一些各自的数据,程序想要把这些数据进行保存,就需要使用会话技术。
例如:用户点击超链接购买一个商品,程序应该保存用户所购买的商品,以便于用户点击结账可以得到用户所购买的商品信息。
思考:用户购买的商品保存在request或ServletContext中是否可以?
不可以,request在服务器相应之后就销毁了,里面的数据也就丢失了,而ServletContent里面的内容是共用的,不能所有人买的东西都放在一起。
3.会话技术分类
1.Cookie技术
Cookie是客户端技术,程序把每个用户的数据以cookie的形式保存到各自浏览器中。当用户使用浏览器再次访问服务器中的web资源的时候,就会带着各自的数据过去。这样,web资源处理的就是用户各自的数据了。
2.Session技术
Session是服务器端技术,利用这个技术,服务器在运行时为每一个用户的浏览器创建一个独享的session对象。由于session为用户浏览器独享,所有用户在访问服务器的时候,可以把各自的数据放在各自的session中,当用户再次访问服务器中的web资源的时候,其他web资源再从用户各自的session中取出数据为用户服务。
3.Cookie的实现原理
客户端发送购买笔记本的请求,然后服务器接受之后,用set-cookie把信息返回给浏览器,并保存保存在浏览器的内存中,等你购买手机的时候,向服务器发送请求,这时候cookie会把前面的笔记本和手机都发送给服务器,然后服务器用set-cookie把笔记本和手机的信息返回给浏览器,保存在其内存中。当点击结账的时候,cookie把笔记本和手机的信息发送给服务器进行结账。
4.Session的实现原理
客户端发送购买笔记本的请求,这时候服务器会为浏览器开辟一个空间,并为其设置一个单独的唯一标识的ID,响应之后,会把这个唯一标识的ID返回给浏览器,保存在其内存中。当你购买手机的时候,就会把带着这个唯一标识ID和手机的发送给服务器,然后服务器根据这个ID,把手机的信息存入到开辟的空间中,响应之后,服务器会把这个唯一的标识ID又返回给浏览器。当你结账的时候,浏览器带着唯一的标识ID,去打开服务器的对应的空间,客户这个客户端所购买的商品,计算金额结账处理。
总的来看,cookie是把客户的信息由服务器返回给浏览器,保存在浏览器的内存中,而Session是把客户信息保存在服务器开辟的空间中,返回给浏览器一个唯一标识的ID,然后浏览器保存的是这个ID。这就是两种技术的区别。
4.记录用户上次访问时间的分析
1.分析需求和流程
2.记录用户上次访问时间的代码实现
1.获得从浏览器带过来的Cookie
通过HttpServletRequest对象中的方法:
2.向浏览器回写Cookie
通过HttpServletResponse对象中的方法:
3.Cookie的构造
4.案例代码实现
4.1创建一个web项目
4.2创建包结构
4.3编写工具类
4.4编写Servlet
二、Cookie的概述
1.Cookie的分类
案例存在问题:用户访问Servlet,记录用户的上次访问时间。但是如果用户将浏览器关闭,重新打开浏览器访问程序,程序就会把其当成是第一次访问:(显示,您好,欢迎来到本网站)。
1.默认级别的Cookie
指的是没有设置有效时间的Cookie,默认的情况下只要关闭了浏览器,Cookie也会被销毁。(Cookie存在于浏览器的内存中,当关闭了浏览器Cookie就销毁了)。
2.持久级别的Cookie
指的是有有效时间的Cookie,这种Cookie的内容不是保存在浏览器的内存中,将Cookie的内容保存(持久化)到硬盘上。这个时候,关闭浏览器,再次打开浏览器会加载硬盘上的文件,从而Cookie中的数据就不会丢失。
案例问题解决:
给Cookie设置有效路径和有效时长之后就会变为一个持久化的Cookie,就会保存到硬盘上,而不是浏览器的内存上。
2.Cookie的API的概述
1.构造方法
Cookie(String name,String value);
2.其他的方法
2.1获得Cookie的名称的方法
2.2获得Cookie的值的方法
2.3设置Cookie的有效域名
2.4设置Cookie的有效路径
2.5设置Cookie的有效时长
3.Cookie的使用细节总结
- 一个Cookie只用标识一种信息,至少含有一个标识该信息的名称和值。
- 一个web站点可以给一个浏览器发送多个Cookie。一个web浏览器可以存储多个web站点的Cookie。
- 浏览器一般只允许存放300个Cookie,每个站点最多可以存放20个Cookie,每个Cookie的大小限制为4KB(老版本浏览器)。-----浏览器存放的Cookie的大小和个数是有限制的。
- 如果创建了一个Cookie,并发送到浏览器,默认情况下它是一个会话级别的Cookie。用户退出浏览器就被删除。如果希望将这个Cookie存到磁盘上,需要设置有效时长调用setMaxAge(int maxAge)方法,以秒为单位的。
- 需要手动删除持久性Cookie,可以将Cookie的有效时长设置为0.必须注意:删除Cookie时候,path必须一致,否则无法删除。
三、Session的概述
1.什么是Session
Session称为是一次会话,Cookie将用户产生的私有的数据保存到浏览器端,Session将用户产生的私有的数据保存到服务器端。注意:一个浏览器独占一个session对象。因此,在需要保存用户数据时候,服务器程序可以将用户数据写到session对象中,当用户使用浏览器访问其他程序时,其他程序可以从用户的session中取出该用户的数据,为用户服务。
2.为什么有Cookie还要有Session
1.Cookie局限性:
- Cookie保存的数据是有个数和大小的限制的。
- 数据是保存客户端浏览器上(相对不是很安全)。
2.Session:
- Session没有个数和大小限制。
- 数据是保存在服务器上(相对比较安全)。
3.Session如何保存用户数据
Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到Session对象。
4.Session的实现原理
服务器是如何实现一个session为一个用户浏览器服务的?
Session的实现原理:基于Cookie的,基于Cookie回写了一个Session的ID。
5.Session作为域对象存取数据
1.Session作为域对象的API
①向session中存入数据:
②从session域中获取数据:
③从session域中移除数据:
2.Session作为域对象的作用范围
Session作为域对象,作用范围就是一次会话的范围。一次会话,指的是用户打开浏览器点击多个超链接,访问服务器资源,到最后关闭浏览器的过程。
6.Servlet的域对象的总结
1.请求范围(ServletRequest)
①何时创建和销毁的:
- 创建:当用户向服务器发送一次请求,服务器创建一个request对象。
- 销毁:当服务器对这次请求作出了响应,服务器就会销毁这个request对象。
②如何存取数据:
- 存数据:void setAttribute(String name,Object value);
- 取数据: Object getAttribute(String name);
③作用范围: 作用范围:一次请求。(转发就是一次请求)。
2.会话范围(HttpSession)
①何时创建和销毁的:
- 创建:服务器端第一次调用getSession()方法的时候。
- 销毁:三种情况:
Session过期,默认的过期时间30分钟(web.xml中配置)。
非正常关闭服务器。(正常关闭服务器—session会被序列化)。
手动调用session.invalidate();
②如何存取数据:
- 存数据:void setAttribute(String name,Object value);
- 取数据: Object getAttribute(String name);
③作用范围:一次会话(多次请求)
3.应用范围(ServletContext)
①何时创建和销毁的:
- 创建:服务器启动的时候创建,为每个web项目创建一个单独ServletContext对象。
- 销毁:服务器关闭的时候,或者项目从服务器中移除的时候。
②如何存取数据:
- 存数据:void setAttribute(String name,Object value);
- 取数据: Object getAttribute(String name);
③作用范围:整个应用
四、案例需求描述
1.案例功能分析
2.案例准备
2.1创建web项目
2.2引入jar包
2.3创建包结构
2.4引入工具类和配置文件
2.5引入相关的类并修改
修改配置文件:
2.6创建登录页面
2.7用户登录流程
用户输入用户名或密码进行登录:
- 如果用户名或密码错误,保存错误信息,回到登录页面。
- 如果用户名或密码正确,将用户的信息保存到会话中,跳转到成功页面。
2.8用户登录代码实现
2.8.1在登录页面回显错误信息:
2.8.2用户登录代码实现
2.8.3编写success.jsp
2.9一次性验证码
2.9.1一次性验证码作用
一次性验证码作用:防止恶意灌水。而且一次性验证码只能够使用一次,不管成功或者失败,验证码都将失效。
2.9.2一次性验证码的校验
一次性验证码生成(随机生成4个字母或数字,由response生成一张图片响应到页面)。
2.9.3一次性验证码实现
1.生成验证码图片:
- 复制Servlet到指定的包下
- 修改web.xml完成该Servlet的配置
2.在页面中引入Servlet
3.将随机生成的字母或数字保存到session中
// 定义一个StringBuffer
StringBuffer buffer = new StringBuffer();
// 定义x坐标
int x = 10;
for (int i = 0; i < 4; i++) {
// 随机颜色
graphics2d.setColor(new Color(20 + random.nextInt(110), 20 + random
.nextInt(110), 20 + random.nextInt(110)));
// 旋转 -30 --- 30度
int jiaodu = random.nextInt(60) - 30;
// 换算弧度
double theta = jiaodu * Math.PI / 180;
// 生成一个随机数字
int index = random.nextInt(words.length()); // 生成随机数 0 到 length - 1
// 获得字母数字
char c = words.charAt(index);
// 将随机产生的字符存入到字符串中:
buffer.append(c);
// 将c 输出到图片
graphics2d.rotate(theta, x, 20);
graphics2d.drawString(String.valueOf(c), x, 20);
graphics2d.rotate(-theta, x, 20);
x += 30;
}
// 将buffer转成字符串对象:
String checkcode = buffer.toString();
// 将其存入到session中
request.getSession().setAttribute("checkcode", checkcode);
4.校验一次性验证码
5.一次性验证码的点击按钮切换图
5.1提供超链接:
5.2编写JS的函数
6.记住用户名的实现
6.1需求概述
如果在登录的过程中,将记住用户名的复选框勾选了,而且在登录成功情况下,需要记住用户名,在关闭浏览器,下次访问该网站的登录页面的时候,会在用户名的文本框中自动呈现出用户名。
6.2记住用户名的后台代码
6.3在页面的文本框中回显用户名
7.系统退出
7.1提供一个退出的链接
7.2编写LogoutServlet