首先Cookies是存储在客户机的文本文件,它们保存了大量用户信息。
从Cookie的源码可以看出它实现了Cloneable接口,
以下是Cookie的构造方法,可以看出它是以键值对的形式存放的
public Cookie(String name, String value) {
if (!isToken(name)
|| name.equalsIgnoreCase("Comment") // rfc2019
|| name.equalsIgnoreCase("Discard") // 2019++
|| name.equalsIgnoreCase("Domain")
|| name.equalsIgnoreCase("Expires") // (old cookies)
|| name.equalsIgnoreCase("Max-Age") // rfc2019
|| name.equalsIgnoreCase("Path")
|| name.equalsIgnoreCase("Secure")
|| name.equalsIgnoreCase("Version")
|| name.startsWith("$")
) {
String errMsg = lStrings.getString("err.cookie_name_is_token");
Object[] errArgs = new Object[1];
errArgs[0] = name;
errMsg = MessageFormat.format(errMsg, errArgs);
throw new IllegalArgumentException(errMsg);
}
this.name = name;
this.value = value;
}
其中可以看出有一个isToken()方法,此方法的作用是什么呢,从源码中可以看出此方法用于比较确定此处的name是否为预留的关键字,如果是则返回false,就在cookie的构造方法之中就会抛出异常;不是预留关键字,则调用此构造函数。
private boolean isToken(String value) {
int len = value.length();
for (int i = 0; i < len; i++) {
char c = value.charAt(i);
if (c < 0x20 || c >= 0x7f || tspecials.indexOf(c) != -1)
return false;
}
return true;
}
那信息传输过程中,cookie是存放在http响应头之中,在jsp中设置一个cookie信息需要将如下信息发送给服务器
HTTP/1.1 200 OK
Date: Fri, 04 Feb 2014 21:03:38 GMT
Server: Apache/1.3.9 (UNIX) PHP/4.0b3
Set-Cookie: name=xyz; expires=Friday, 14-Feb-07 22:03:38 GMT;
path=/; domain=tutorialspoint.com
Connection: close
Content-Type: text/html
如果浏览器被配置成可存储cookies,那么它将会保存这些信息直到过期。如果用户访问的任何页面匹配了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的呢
1)创建一个Cookie对象: 调用Cookie的构造函数,使用一个cookie名称和值做参数,它们都是字符串。
2) 设置有效期:调用setMaxAge()函数表明cookie在多长时间(以秒为单位)内有效。下面的操作将有效期设为了24小时。
3) 将cookie发送至HTTP响应头中:调用response.addCookie()函数来向HTTP响应头中添加cookies。
下面是一个保存用户名和密码的信息到cookie之中的代码
web.xml(web程序的人口之处)
<servlet>
<servlet-name>Cookie</servlet-name>
<servlet-class>com.qzp.servlet.cookieServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Cookie</servlet-name>
<url-pattern>/cookie</url-pattern>
</servlet-mapping>
cookieTest.jsp
<body>
<form action="cookie" method="post">
用户名:<input type="text" name="name" >
密码:<input type="password" name="password" >
<input type="submit" value="登陆">
</form>
</body>
后台创建cookie和设置cookie的代码,cookie的值是通过响应头部添加到本地文件之中。
public class cookieServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
String name=req.getParameter("name");
String password=req.getParameter("password");
//以键值对的形式存放
Cookie cookie1=new Cookie("username",name);
Cookie cookie2=new Cookie("psw",password);
//设置过期时间为24小时
cookie1.setMaxAge(60*60*24);
cookie2.setMaxAge(60*60*24);
// 在响应头部添加cookie
resp.addCookie(cookie1);
resp.addCookie( cookie2 );
req.getRequestDispatcher("cookieResult.jsp").forward(req, resp);
}
}
cookieResult.jsp,通过一个el表达式来获取cookie的值,其格式是
${ cookie. 键. value}(如果对EL表达式不是很熟悉的话,可以看我接下来的教程)
<body>
<center>
<h1>result</h1>
</center>
<ul>
<li><p>
<b>name:</b>
${cookie.username.value}
</p>
</li>
<li><p>
<b>password:</b>
${cookie.psw.value}
</p>
</li>
</ul>
</body>
结果会返回你所输入的用户名和密码的值。(
当然密码的值放在cookie中是很不安全的,建议放到session服务器端之中,此处只做演示之用)
此外还有cookies数组用于输出所有存放在本地的cookie值,如以下代码可以遍历本地所有的cookie值(out是jsp的内置对象,可以用于向页面打印输出)
<center>
<h1>Reading Cookies</h1>
</center>
<%
Cookie cookie = null;
Cookie[] cookies = null;
// 获取cookies的数据,是一个数组
cookies = request.getCookies();
if( cookies != null ){
out.println("<h2> Found Cookies Name and Value</h2>");
for (int i = 0; i < cookies.length; i++){
cookie = cookies[i];
out.print("Name : " + cookie.getName( ) + ", ");
out.print("Value: " + cookie.getValue( )+" <br/>");
}
}else{
out.println("<h2>No cookies founds</h2>");
}
%>