从零开始的JSP(4)

JSP状态管理

HTTP协议的无状态性

无状态是指,当浏览器发送请求给服务器的时候,服务器响应客户端的请求。但是当同一个浏览器再次发送请求给服务器的时候,服务器并不知道它就是刚刚的那个浏览器。
简单的说,服务器不会记住哪个浏览器访问过自己,所以称为无状态协议。

保存用户状态的两个机制

服务端技术:Session
客户端技术:Cookie

Cookie:Web服务器保存在客户端的一系列文本信息。
典型用法:判断注册用户是否登录网站,信息的相关推荐和记住用户名(xx天内免登录)

JSP创建与使用Cookie

创建Cookie对象

1
Cookie cookie = new Cookie(String Key, Object obj);

写入Cookie对象

1
response.addCookie(cookie)

读取Cookie对象

1
Cookie [] cookiesp = request.getCookies()

Cookie对象的常用方法

  1. void setMaxAge(int expiry) 设置Cookie的有效期,秒/单位
  2. int getMaxAge() 获取Cookie的有效时间
  3. void setValue(String value) 在Cookie创建后,对Cookie进行赋值
  4. String getName() 获取Cookie的名称
  5. String getValue() 获取Cookie的值

使用Cookie实现登录

这个实例使用了三个jsp页面,分别是登录页面login.jsp、处理登录页面dologin.jsp和显示用户信息users.jsp。

login.jsp页面,脚本语言里实现的是如果上次有保存用户名和密码的Cookie,那么就在表单里显示出来。

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
<%
String username="";
String password="";
Cookie[] cookies = request.getCookies();
if(cookies != null && cookies.length > 0){
for(Cookie c : cookies){
if(c.getName().equals("username")){
username = c.getValue();
}
if(c.getName().equals("password")){
password = c.getValue();
}
}
}
%>
<h1>用户登录页面</h1>
<form name="loginForm" action="dologin.jsp" method="post">
<table>
<tr>
<td>用户:</td>
<td><input type="text" name="username" value=<%= username %>></td>
</tr>
<tr>
<td>密码:</td>
<td><input tyepe="text" name="password" value=<%= password %>></td>
</tr>
<tr>
<td colspan="2"><input type="checkbox" name="isUseCookie">十天内免登陆</td>
</tr>
<tr>
<td colspan="3"><input type="submit"></td>
</tr>
</table>
</form>

处理登录页面dologin.jsp

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
<%
String [] isUseCookies = request.getParameterValues("isUseCookie");
//首先判断是否是点击保存Cookie
//如果点击是,那么就要把该用户名和密码保存下来
if(isUseCookies != null && isUseCookies.length > 0){
//通过request请求获取username和password
String username = request.getParameter("username");
String password = request.getParameter("password");
//分别创建username和password的Cookie值
Cookie newUsernameCookie = new Cookie("username", username);
Cookie newPasswordCookie = new Cookie("password", password);
//设置保存时间为10天
newUsernameCookie.setMaxAge(864000);
newPasswordCookie.setMaxAge(864000);
//Cookie信息入库
response.addCookie(newUsernameCookie);
response.addCookie(newPasswordCookie);
}
else{
//如果未点击保存Cookie,需要将已保存的Cookie值给删除
//当然,这只处理username和password的值
Cookie[] cookies = request.getCookies();
if(cookies!=null && cookies.length > 0){
for(Cookie c : cookies){
if(c.getName().equals("username") || c.getName().equals("password")){
c.setMaxAge(0);
response.addCookie(c);
}
}
}
}
%>
<a href="users.jsp" target="_blank">查看用户信息</a>

如果点击了有相应的Cookie被保存,那么就可以查看到我们的用户名和密码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<%
String username="";
String password="";
Cookie[] cookies = request.getCookies();
if(cookies != null && cookies.length > 0){
for(Cookie c : cookies){
if(c.getName().equals("username")){
username = c.getValue();
}
if(c.getName().equals("password")){
password = c.getValue();
}
}
}
%>
<hr>
用户:<%= username %><br/>
密码:<%= password %><br/>

Session和Cookie的对比

共同点:用来保存用户的状态信息且都会过期
不同点:

  1. Session在服务端内存中保存用户信息,Cookie以文本形式保存在客户端
  2. Session保存在Object类型,Cookie保存的是String类型
  3. Session随会话的结束而将其存储的数据销毁,Cookie可以长期保存在客户端
  4. Session安全性较高,保存重要的信息,Cookie保存不重要的用户信息