- 初始化时机
- 第一次请求
默认servlet是在第一次请求的时候,调用无参构造创建对象,并调用init方法
并且只执行一次
Load-on-startup默认 是 -1
-
- 启动tomcat的时候
或者是注解方式
启动tomcat的时候初始化
当我们发送请求的时候 只需要执行doGet即可
- 会话管理
通过前两天的编码,我们已经掌握了Servlet+JSP的使用,能够做到使用http请求进行前后端交互
那么这个时候我们就需要更加深入的去了解一些知识,叫会话管理技术
那么再进行会话管理技术之前,我们需要先明白 什么是HTTP的无状态协议
-
- 无状态协议
无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送 HTTP 请求之后,服务器根据请求,会给我们发送数据过来,但是,发送完,不会记录任何信息。
HTTP 是一个无状态协议,这意味着每个请求都是独立的。
缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
HTTP 协议这种特性有优点也有缺点,优点在于解放了服务器,每一次请求“点到为止”不会造成不必要连接占用,缺点在于每次请求会传输大量重复的内容信息。
客户端与服务器进行动态交互的 Web 应用程序出现之后,HTTP 无状态的特性严重阻碍了这些应用程序的实现,毕竟交互是需要承前启后的,简单的购物车程序也要知道用户到底在之前选择了什么商品。于是,两种用于保持 HTTP 连接状态的技术就应运而生了,一个是 Cookie,而另一个则是 Session。
-
- 会话
一次会话中包含多次请求和响应。
一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止
-
- 功能
在一次会话的范围内的多次请求间,共享数据
比如 你登陆网页版淘宝,登陆成功后,加入了一些商品到购物车中,那么这个过程中,我们只需要登陆一次就可以
因为登陆成功后的一次会话中,淘宝服务端就知道了我要把这些商品加入到哪个用户的购物车中,而不是每次加入购物车都需要重新传递用户信息
-
- 方式
1. 客户端会话技术:Cookie
2. 服务器端会话技术:Session
- Cookie
- 概述
客户端会话技术,将数据保存到客户端
-
- 使用步骤
使用步骤:
1. 创建Cookie对象,绑定数据
new Cookie(String name, String value)
2. 发送Cookie对象
response.addCookie(Cookie cookie)
3. 获取Cookie,拿到数据
Cookie[] request.getCookies()
设置cookie的有效时间
setMaxAge(int seconds)
-
- 添加cookie
-
- 获取cookie
-
- 案例
- 需求
- 案例
1. 访问一个Servlet,如果是第一次访问,则提示:您好,欢迎您首次访问。
2. 如果不是第一次访问,则提示:欢迎回来,您上次访问时间为:显示时间字符串
-
-
- 分析
-
1. 可以采用Cookie来完成
2. 在服务器中的Servlet判断是否有一个名为lastTime的cookie
1. 有:不是第一次访问
1. 响应数据:欢迎回来,您上次访问时间为:2018年6月10日11:50:20
2. 写回Cookie:lastTime=2018年6月10日11:50:01
2. 没有:是第一次访问
1. 响应数据:您好,欢迎您首次访问
2. 写回Cookie:lastTime=2018年6月10日11:50:01
-
-
- 代码
-
package cookie;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/cookie3")
public class CookieDemo_03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 设置响应类型
response.setContentType("text/html;charset=utf-8");
// 时间格式化对象
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
// 获取输出流
PrintWriter pw = response.getWriter();
// 1 获取cookie
Cookie[] cs = request.getCookies();
// 是否有lastTime这个cookie 默认没有
boolean flag = false;
// 2 判断是否有
if (cs != null) {
// 2.2 如果有响应cookie的value,并设置cookie时间
for (Cookie cookie : cs) {
// 2.2.1 获取对应cookie的value
if ("lastTime".equals(cookie.getName())) {
// 设置 有这个cookie
flag = true;
// 2.2.2 响应value
// 解码
String strTime = URLDecoder.decode(cookie.getValue());
pw.println("欢迎回来,上次登录时间:"+strTime);
// 2.2.3 重新设置cookie的value
// 编码保存
cookie.setValue(URLEncoder.encode(sdf.format(new Date())));
cookie.setMaxAge(60 * 60 * 24 * 30);
response.addCookie(cookie);
break;
}
}
}
// 判断是否有这个cookie
if(!flag){
// 2.1 没有响应首次访问,并设置cookie时间
// 创建cookie并响应
Cookie cookie = new Cookie("lastTime", URLEncoder.encode(sdf.format(new Date())));
cookie.setMaxAge(60 * 60 * 24 * 30);
response.addCookie(cookie);
pw.println("您好,欢迎首次访问~");
}
}
}
- Session
- 概述
上面讲的Cookie是用于客户端的会话技术,现在我们来学习一下服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。HttpSession
-
- 使用步骤
1. 获取HttpSession对象:
HttpSession session = request.getSession();
2. 使用HttpSession对象:
Object getAttribute(String name)
void setAttribute(String name, Object value)
void removeAttribute(String name)
-
- 设置数据
-
- 获取数据
-
- 删除数据
-
- 一定时间内关闭浏览器也有有效
- 验证码
- JUnit
导包JUnit4
-
- 案例需求
1. 访问带有验证码的登录页面login.jsp
2. 用户输入用户名,密码以及验证码。
如果用户名和密码输入有误,跳转登录页面,提示:用户名或密码错误
如果验证码输入有误,跳转登录页面,提示:验证码错误
如果全部输入正确,则跳转到主页success.jsp,显示:用户名,欢迎您
-
- 分析
1 编写一个生成验证码的java程序
2 页面中通过js去请求验证码程序,完成验证码的生成并保存入session中(注意每次请求都需要加上一个时间,否则容易出现缓存问题)
3 登陆的时候,把验证码和用户名、密码都传递到servlet,并在servlet中获取
4 然后获得session中的验证码,和传递的验证码进行比较,如果成功再比较用户名和密码
5 不管成功还是失败都需要把session中的验证码都删除,由页面重新生成
6 再根据登陆成功还是失败 跳转对应的页面和响应的提示
-
- 验证码
参考 Captcha 和 CheckCodeTest