Cookie
session保持会话状态,cookie进行信息交换。
cookie实际上就是在客户和服务器之间交换的一小段数据(一个名/值String对)。
服务器把cookie发送给客户,客户做出下一个请求时再把cookie返回给服务器。
cookie不需要用户介入,cookie交换是自动完成的(当然,要假设客户端支持cookie)。
利用ServletAPI使用Cookie
对于cookie,你要做的工作都已经封装在3个类的ServletAPI中:HttpServletRequest、HttpServletResponse和Cookie。
创建一个新Cookie
[java] view plain copy
Cookie cookie = new Cookie("username",name);
设置cookie在客户端上存活多久
[java] view plain copy
cookie.setMaxAge(30*60);
把cookie发送到客户
[java] view plain copy
response.addCookie(cookie);
从客户请求得到cookie
[java] view plain copy
Cookie[] cookies = request.getCookies();
if(cookies != null){
for(int i = 0; i < cookies.length; i++){
Cookie cookie = cookies[i];
if(cookie.getName().equals("username")){
String userName = cookie.getValue();
out.println("Hello" + userName);
break;
}
}
}
简单的定制cookie
假设建立一个表单,要求用户提交用户名。这个表单调用一个servlet,由servlet得到用户名请求参数,并使用户名值在响应中设置一个cookie。
[html] view plain copy
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>CookieTestPage</title>
</head>
<body>
<form method="POST" action="CookieTest.do">
UserName:<input type="text" name="username"><br>
<center>
<input type="SUBMIT">
</center>
</form>
</body>
</html>
这个用户下一次请求这个Web应用中的任何servlet时,cookie会随请求返回(假设根据cookie的maxAge设置,这个cookie还存活)。Web应用中的servlet看到这个cookie时,它能把用户名放到动态生成的响应中,业务逻辑就能知道不用再向用户询问他的名字了。
实验
写一个Web应用,实现上面这个场景。包含:一个index.html,两个servlet。
实现思路:
客户访问index.html,假设是(http://localhost:8080/SessionTest/index.html),index.html提交表单用户名,到一个servlet处理接收过来的用户名,该servlet会生成一个cookie,把用户名保存进去,然后response将该cookie返回给客户端。
客户访问第二个servlet,假设是(http://localhost:8080/SessionTest/checkcookie.do),读取request发送过来的cookie,它会遍历cookies,如果上次提交的用户名存在该cookies,就得到它的值,并输出到自己生成的动态网页,显示欢迎他的再次到来。