Javaweb入门笔记-6-cookie和session

Cookie是客户端技术;Session是服务器端技术。这里重点讲一下session。

API:
javax.servlet.http:Class Cookie
javax.servlet.http:Interface HttpSession

session对象概要介绍

web服务器会给每一个用户自动创建一个session对象,为每一个session对象分配一个唯一表识的String类型的ID,这个ID用来区分其他用户。这样每个用户都对应一个session对象,不同用户的session对象互相不同。

  • 当在不同文件夹里放不同的jsp文件并分别运行时:一个用户在同一个web服务目录中只有一个session对象
    • 当用户访问相同的web服务目录的其他页面时,web服务器不会在重新分配session对象,直到用户关闭浏览器或这个session对象达到了它的生存期限。
    • 当用户重新打开浏览器再次访问该web目录时,web服务器为该用户在创建一个新的session对象。
      需要注意的是:同一个用户在多个不同的web服务目录中对应的session对象时不同的,一个服务目录对应一个session对象

生命周期

session对象由服务器创建

  • 创建:调用request对象的getSession方法后才会创建session对象; getSession(false)`只获取, 不创建
  • 销毁:默认30分钟没人使用则自动销毁。失效时间可在web.xml的<session-config>标签中使用<session-timeout>,单位分钟;也可调用session对象的invalidate方法销毁

session对象的应用:

  • 用户登录
  • 防止表单重复提交(暂时还不了解)
  • 一次性验证码的校验(暂时还不了解)

使用session的案例:模拟在线考试系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<%@ page language="java" contentType="text/html; charset=UTF-8"  
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>session1</title>
</head>
<body>
<form action="sessionTest2.jsp" method="post">
考号:
<input type="text" name="id"/>
<p>
一、单项选择题(每题2分)
<br/><br/>
1.下列哪个方法是获取session中关键字是key的对象( )。
<br />
<input type="radio" name="one" value="A"/>
A.public void setAttribute(String key, Object obj)<br/>
<input type="radio" name="one" value="B"/>
B.public void removeAttribute(String key)<br/>
<input type="radio" name="one" value="C"/>
C.public Enumeration getAttributeNames()<br/>
<input type="radio" name="one" value="D"/>
D.public Object getAttibute(String key)<br/>
</p>
<p>
二、判断题(每题2分)
<br/><br/>
1.同一客户在多个Web服务目录中,所对应的session对象是互不相同的。
<br/>
<input type="radio" name="two" value="True"/>
True
<input type="radio" name="two" value="False"/>
False
</p><br/>
<input type="submit" value="提交" name=submit>
<input type="reset" value="重置" name=reset>
</form>
</body>
</html>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<%@ page language="java" contentType="text/html; charset=UTF-8"  
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>session2</title>
</head>
<body>
<form action="sessionTest3.jsp" method="post">
<%
//考号
String id = request.getParameter("id");
//把考号id以“id”为关键字存储到session对象中
session.setAttribute("id", id);
//单项选择第一题
String first = request.getParameter("one");
//把答案first以“one”为关键字存储到session对象中
session.setAttribute("one", first);
//判断第一题
String second = request.getParameter("two");
//把答案second以“two”为关键字存储到session对象中
session.setAttribute("two", second);
%>
您的考号:<%=id%><br/>
一、单项选择题(每题2分)
<br/>
1.<%=first%>
<br />
二、判断题(每题2分)
<br />
1.<%=second%><br/>
<input type="submit" value="确认完毕"/>
<a href="sessionTest1.jsp">重新答题</a>
</form>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<%@ page language="java" contentType="text/html; charset=UTF-8"  
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>session3</title>
</head>
<body>
<%
//获取考号
//获取session中关键字是id的对象(考号)
String id = (String) session.getAttribute("id");
//计算成绩
int sum = 0;
//如果单项选择第一题选中D选项,得2分。
//获取session中关键字是one的对象(选择答案)
String first = (String) session.getAttribute("one");
if ("D".equals(first)) {
sum += 2;
}
//如果判断第一题选中True,得2分。
//获取session中关键字是two的对象(判断答案)
String second = (String) session.getAttribute("two");
if ("True".equals(second)) {
sum += 2;
}
%>
您的成绩公布如下:
<table border="1">
<tr>
<th width="50%">
考号
</th>
<th width="50%">
成绩
</th>
</tr>
<tr>
<td><%=id%></td>
<td align="right"><%=sum%></td>
</tr>
</table>
</body>
</html>

关于cookie

一些细节:

  • 一个cookie只能标识一种信息,至少含有标识该信息的名称和值
  • 浏览器一般只允许存放300个cookie,每个站点最多存放20个,每个cookie大小限制为4KB
  • 默认是会话级别cookie(存储于浏览器内存),浏览器进程关闭则删除。有效期通过maxAge设置,存于硬盘,0表示删除
  • 删除cookie时,path必须一致,否则不会删除
-------------本文结束感谢您的阅读-------------