什么 Session?

指用户用一个浏览器,访问某个网站只要不关闭浏览器,不管用户点击多少个超链接,直到用户关闭浏览器,整个这个过程我们称为一次会话。

1
2
3
4
5
6
7
8
9
// 创建session
HttpSession session = request.getSession();
// 设置session属性,属性重名,value会被替换
session.setAttribute("name", "gavin");
session.setAttribute("pwd", "123456");
// 获取session属性的值,返回的是一个object对象
session.getAttribute("name");
// 删除session属性
session.removeAttribute("name");

Session 的生命周期,可以去 conf/web.xml 配置,也可在项目下的 web.xml 配置,代码里面也可以设置。

1
2
3
4
// 设置一个秒数,这个秒数表示客户端在不发出请求时,session被Servlet引擎维持的最长时间。
session.setMaxInactiveInterval(100);
// 让session中的所有属性解除绑定
session.invalidate()

服务器为每个浏览器提供单个 Session 服务的原理:

  1. 第一次访问 web 应用时,会创建一个 Session 服务,然后给浏览器返回一个 cookie 里面包含了 Session 的 ID
  2. 第二次访问 web 应用时,cookie 里的 id 会随请求行发给服务器,服务器就能找到 ID 对于的 Session

Session 案例:

  1. 验证用户合法性
  2. 输入验证码的验证
  3. 简单的购物车

【验证码案例】(Java 绘图技术)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 设置浏览器不缓存
response.setDateHeader("Expires", -1);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
// 设置浏览器接收图片
response.setHeader("Content-Type", "image/jpeg");
// 创建一个图片
BufferedImage image = new BufferedImage(50, 20, BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
g.setColor(Color.BLACK);
g.fillRect(0, 0, 50, 20);
g.setColor(Color.WHITE);
g.setFont(new Font(null, Font.BOLD, 20));
// 得到随机生成的密码
String s = getString();
// 把密码存放在session中,进行验证
request.getSession().setAttribute("code", s);
// 把字画在图片上
g.drawString(getString(), 0, 20);
// 把图片传给浏览器
ImageIO.write(image, "jpg", response.getOutputStream());
1
2
3
4
5
6
7
8
private String getString() {
Random r = new Random();
String s = "";
for (int i = 0; i < 4; i++) {
s += r.nextInt(10);
}
return s;
}