1. 初始化时机
1.1 第一次请求
默认servlet是在第一次请求的时候,调用无参构造创建对象,并调用init方法,并且只执行一次。
Load-on-startup默认 是 -1
<load-on-startup>-1</load-on-startup>
1.2 启动tomcat的时候
初始化时机-1,第一次请求-1。
<load-on-startup>1</load-on-startup>
注解方式
@WebServlet(urlPatterns="/load",loadOnStartup=1)
2. 会话管理
那么这个时候我们就需要更加深入的去了解一些知识,叫会话管理技术
那么再进行会话管理技术之前,我们需要先明白 什么是HTTP的无状态协议
2.1 无状态协议
无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送 HTTP 请求之后,服务器根据请求,会给我们发送数据过来,但是,发送完,不会记录任何信息。
两种用于保持 HTTP 连接状态的技术就应运而生了,一个是 Cookie,而另一个则是 Session。
2.2 会话
一次会话中包含多次请求和响应。
一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止
2.3 功能
在一次会话的范围内的多次请求间,共享数据
比如 你登陆网页版淘宝,登陆成功后,加入了一些商品到购物车中,那么这个过程中,我们只需要登陆一次就可以
因为登陆成功后的一次会话中,淘宝服务端就知道了我要把这些商品加入到哪个用户的购物车中,而不是每次加入购物车都需要重新传递用户信息
2.4 方式
1. 客户端会话技术:Cookie
2. 服务器端会话技术:Session
3 Cookie
3.1 概述
客户端会话技术,将数据保存到客户端
3.2 使用步骤
1. 创建Cookie对象,绑定数据
new Cookie(String name, String value)
2. 发送Cookie对象
response.addCookie(Cookie cookie)
3. 获取Cookie,拿到数据
Cookie[] request.getCookies()
设置cookie的有效时间
setMaxAge(int seconds)
4. Session
4.1 概述
面讲的Cookie是用于客户端的会话技术,现在我们来学习一下服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。HttpSession
4.2 使用步骤
1. 获取HttpSession对象:
HttpSession session = request.getSession();
2. 使用HttpSession对象:
Object getAttribute(String name)
void setAttribute(String name, Object value)
void removeAttribute(String name)
sessiong.invaidate();//删除session
// 清理session,设置session失效,等于session中所有的数据都删除
session.invalidate();
4.3 关闭浏览器,session依然存在
HttpSession session = request.getSession();
// 设置有效时间,单位秒,负数的话,说明时间无限大,不会过期
session.setMaxInactiveInterval(10);
// 设置数据
session.setAttribute("login", "admin");
// 期望客户端关闭后,session也可以继续使用,但是换浏览器肯定不行
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(20);
resp.addCookie(cookie);
5. 验证码
5.1 Junit
导包
// 设置响应类型为图片
resp.setContentType("image/jpg");
// 创建验证码对象
// Captcha captcha = new Captcha(100,50,4,"asasd1235567d");
Captcha captcha = new Captcha(100, 50);
// 获取验证码
String checkCode = captcha.generateCheckCode();
// 把验证码 保存到session中
req.getSession().setAttribute("checkCode", checkCode);
// 生成图片
BufferedImage img = captcha.createCheckImg(checkCode);
// 写出图片
ImageIO.write(img, "jpg", resp.getOutputStream());
03-25
767