# Jsp状态管理
http协议无状态性
保存用户状态的两大机制
Cookie简介
Cookie的创建与使用
Session与Cookie的对比
# http协议无状态性
无状态是指,当浏览器发送请求给服务器,服务器响应浏览器请求;但当同一个浏览器再次发送请求给该服务器时,服务器并不知道它就是之前那个浏览器;简单讲就是服务器不会去记得你,所以就是无状态协议。
# 保存用户状态的两大机制
Session
Cookie
# Cookie简介
Cookie
Cookie(译:小甜饼),是Web服务器保存在客户端的一系列文本信息。 典型应用:判断注册用户是否已经登录网站;购物车的处理等。
作用:
对特定对象的追踪;保存用户网页浏览记录与习惯;简化登录...
安全风险:容易泄露用户信息
# Cookie的创建与使用
创建Cookie对象:
Cookie cookie = new Cookie(String key, Object value);
1
写入Cookie对象:
response.addCookie(cookie);
1
读取Cookie对象:
Cookie[] cookie = request.getCookies();
1
常用方法 | 说明 |
---|---|
void setMaxAge(int expiry) | 设置cookie的有效期,以秒为单位 |
void setValue(String value) | 在cookie创建后,对cookie进行赋值 |
String getName() | 获取cookie的名称 |
String getValue() | 获取cookie的值 |
int getMaxAge() | 获取cookie的有效时间,单位秒 |
实例:实现记忆用户名和密码功能
cookie-login.jsp
<%@ page language="java" import="java.util.*,java.net.*" contentType="text/html; charset=utf-8"%>
<!DOCTYPE>
<html>
<head>
<title>Cookie Login</title>
</head>
<body>
<h1>登录</h1>
<%
request.setCharacterEncoding("utf-8");
String username = "";
String password = "";
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length > 0) {
for (Cookie c:cookies) {
if (c.getName().equals("username")) {
username = URLDecoder.decode(c.getValue(), "utf-8");
}
if (c.getName().equals("password")) {
password = URLDecoder.decode(c.getValue(), "utf-8");
}
}
}
%>
<form action="cookie-do-login.jsp" method="post">
<p>用户名:<input type="text" name="username" value="<%=username %>"></p>
<p>密 码:<input type="password" name="password" value="<%=password %>"></p>
<p>
<label>
<input type="checkbox" name="isUseCookie" checked value="1"> 十天内保存登录状态
</label>
</p>
<p><input type="submit" value="登录"></p>
</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
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
cookie-do-login.jsp
<%@ page language="java" import="java.util.*,java.net.*" contentType="text/html; charset=utf-8"%>
<!DOCTYPE>
<html>
<head>
<title>Cookie Logged</title>
</head>
<body>
<h1>登录成功</h1>
<%
request.setCharacterEncoding("utf-8");
String[] isUseCookie = request.getParameterValues("isUseCookie");
if (isUseCookie != null && isUseCookie.length > 0) {
String username = URLEncoder.encode(request.getParameter("username"), "utf-8");
String password = URLEncoder.encode(request.getParameter("password"), "utf-8");
// 保存用户信息
Cookie usernameCookie = new Cookie("username", username);
Cookie passwordCookie = new Cookie("password", password);
// 保存时间10天
usernameCookie.setMaxAge(864000);
passwordCookie.setMaxAge(864000);
response.addCookie(usernameCookie);
response.addCookie(passwordCookie);
} else {
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length > 0) {
for (Cookie c:cookies) {
if (c.getName().equals("username") || c.getName().equals("password")) {
// 设置cookie失效
c.setMaxAge(0);
// 重新保存
response.addCookie(c);
}
}
}
}
%>
<a href="cookie-user-info.jsp">查看用户信息</a>
</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
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
cookie-user-info.jsp
<%@ page language="java" import="java.util.*,java.net.*" contentType="text/html; charset=utf-8"%>
<!DOCTYPE>
<html>
<head>
<title>Cookie Login</title>
</head>
<body>
<h1>登录</h1>
<%
request.setCharacterEncoding("utf-8");
String username = "";
String password = "";
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length > 0) {
for (Cookie c:cookies) {
if (c.getName().equals("username")) {
username = URLDecoder.decode(c.getValue(), "utf-8");
}
if (c.getName().equals("password")) {
password = URLDecoder.decode(c.getValue(), "utf-8");
}
}
}
%>
<p>用户名:<%=username %></p>
<p>密 码:<%=password %></p>
</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
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