HTTP是无状态协议,这意味着每次客户端检索网页时,都要单独打开一个服务器连接,因此服务器不会记录下先前客户端请求的任何信息。
JSP Cookie处理
Cookie是存储在客户机的文本文件,它们保存了大量轨迹信息。
利用cookie技术识别用户。通常有三个步骤:
- 服务器脚本发送一系列cookie至浏览器。比如名字,年龄,ID号码等等。
- 浏览器在本地机中存储这些信息,以备不时之需。
- 当下一次浏览器发送任何请求至服务器时,它会同时将这些cookie信息发送给服务器,然后服务器使用这些信息来识别用户或者干些其它事情。
Cookie剖析
Cookie通常在HTTP信息头中设置(虽然JavaScript能够直接在浏览器中设置cookie)。在JSP中,设置一个cookie需要发送如下的信息头给服务器:
HTTP/1.1 200 OK
Date: Wed, 10 May 2017 03:33:38 GMT
Server: Apache/1.3.9 (UNIX) PHP/4.0b3
Set-Cookie: name=runoob; expires=Wednesday, 10-May-17 04:33:38 GMT;
path=/; domain=runoob.com
Connection: close
Content-Type: text/html
Set-Cookie信息头包含一个键值对,一个GMT(格林尼治标准)时间,一个路径,一个域名。键值对会被编码为URL。有效期域是个指令,告诉浏览器在什么时候之后就可以清除这个cookie。
如果浏览器被配置成可存储cookie,那么它将会保存这些信息直到过期。如果用户访问的任何页面匹配了cookie中的路径和域名,那么浏览器将会重新将这个cookie发回给服务器。浏览器端的信息头长得就像下面这样:
GET / HTTP/1.0
Connection: Keep-Alive
User-Agent: Mozilla/4.6 (X11; I; Linux 2.2.6-15apmac ppc)
Host: zink.demon.co.uk:1126
Accept: image/gif, */*
Accept-Encoding: gzip
Accept-Language: en
Accept-Charset: iso-8859-1,*,utf-8
Cookie: name=xyz
JSP设置Cookie
使用JSP设置cookie包含三个步骤:
/**
* (1)创建一个Cookie对象:
* 调用Cookie的构造函数,使用一个cookie名称和值做参数,它们都是字符串。
*/
Cookie cookie = new Cookie("key","value");
/**
* (2)设置有效期:
* 调用setMaxAge()函数表明cookie在多长时间(以秒为单位)内有效。
*/
cookie.setMaxAge(60*60*24);
/**
* (3) 将cookie发送至HTTP响应头中:
* 调用response.addCookie()函数来向HTTP响应头中添加cookie。
*/
response.addCookie(cookie);
需要注意的是:JSP Cookie 处理需要对中文进行编码与解码。
String str = java.net.URLEncoder.encode("中文","UTF-8"); //编码
String str = java.net.URLDecoder.decode("编码后的字符串","UTF-8"); // 解码
实例:
cookieTest.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Cookie Test</title>
</head>
<body>
<form action="setCookie.jsp" method=GET>
用户: <input type="text" name="name">
<br />
密码: <input type="text" name="pwd" />
<hr>
<input type="submit" value="提交" />
</form>
</body>
</html>
setCookie.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.net.*"%>
<%
// 编码,解决中文乱码
String para_name = URLEncoder.encode(request.getParameter("name"), "utf-8");
String para_pwd = URLEncoder.encode(request.getParameter("pwd"), "utf-8");
// 设置 name 和 url cookie
Cookie name = new Cookie("name", para_name);
Cookie pwd = new Cookie("pwd", para_pwd);
// 设置cookie过期时间为1小时。
name.setMaxAge(60 * 60 * 1);
pwd.setMaxAge(60 * 60 * 1);
// 在响应头部添加cookie
response.addCookie(name);
response.addCookie(pwd);
%>
<html>
<head>
<meta charset="utf-8">
<title>Cookie Test</title>
</head>
<body>
<p>此页在jsp代码里设置了cookie。</p>
<p>请在浏览器查看刚设置的cookie</p>
</body>
</html>
效果图:
运行:
查看cookie:
JSP读取Cookie
JSP读取cookie,需要调用request.getCookies()方法来获得一个javax.servlet.http.Cookie对象的数组。该数组存储了cookie的所有键值对。
接下来我们读取刚才的cookie。
cookieTest.html里的代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Cookie Test</title>
</head>
<body>
<form action="setCookie.jsp" method=GET>
用户: <input type="text" name="name">
<br />
密码: <input type="text" name="pwd" />
<hr>
<input type="submit" value="提交" />
</form>
<br>
<hr>
<form action="getCookie.jsp" method=GET>
<input type="submit" value="getCookie" />
</form>
</body>
</html>
getCookie.jsp里的代码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.net.*"%>
<html>
<head>
<meta charset="utf-8">
<title>Cookie Test</title>
</head>
<body>
<h1>getCookie</h1>
<%
Cookie[] cookies = request.getCookies();
for(int i=0; i<cookies.length; i++){
out.print("<p>");
out.print("key:"+cookies[i].getName());
out.print("<br>");
out.print("value:"+cookies[i].getValue());
out.print("</p><hr>");
}
%>
</body>
</html>
运行效果:
JSP删除Cookie
- 获取一个已经存在的cookie然后存储在Cookie对象中。
- 将cookie的有效期设置为0。
- 将这个cookie重新添加进响应头中。
这个比较简单就不演示了。