Java对cookie的操作比较简单,主要介绍下建立cookie和读取cookie,以及如何设定cookie的生命周期和cookie的路径问题。建立一个无生命周期的cookie,即随着浏览器的关闭即消失的cookie,代码如下:
Cookie cookie = new Cookie("cookiename","cookievalue");
response.addCookie(cookie);下面建立一个有生命周期的cookie,可以设置他的生命周期
cookie = new Cookie("cookiename","cookievalue");
cookie.setMaxAge(3600);设置路径,这个路径即该工程下都可以访问该cookie 如果不设置路径,那么只有设置该cookie路径及其子路径可以访问
cookie.setPath("/");
response.addCookie(cookie);下面介绍如何读取cookie,读取cookie代码如下:
// 这样便可以获取一个cookie数组
Cookie[] cookies = request.getCookies();
for ( Cookie cookie : cookies ) {
cookie.getName(); // get the cookie name
cookie.getValue(); // get the cookie value
}Cookie cookie = new Cookie("key", "value");
cookie.setMaxAge(60);
cookie.setPath("/test/test2");
response.addCookie(cookie);说明:
(1)setMaxAge用来设置cookie的生存周期。如果设置为负值的话,则为浏览器进程Cookie(内存中保存),关闭浏览器就失效。上面方法设置cookie在60秒后过期。
(2)setPath方法用来设置Cookie路径。如果不设置路径,则为当前路径。对于Servlet来说为request.getContextPath() + web.xml里配置的该Servlet的url-pattern路径部分。
该方法可以读取当前路径以及“直接父路径”的所有Cookie对象,如果没有任何Cookie的话,则返回null。
Cookie[] cookies = request.getCookies();
// 上面删除指定路径上的Cookie,不设置该路径,默认为删除当前路径Cookie;
Cookie cookie = new Cookie("key", null);
cookie.setMaxAge(0);
cookie.setPath("/test/test2");
response.addCookie(cookie);注意:cookie不能直接别删除,我们要删除cookie,只要将生命周期设置为0就是,但是不能设置为小于0的值,因为-1表示其他意思。
下面用一个完整的实例来说明
<%@ page contentType="text/html; charset=utf-8"
language="java" import="java.sql.*" errorPage="" %>
<html>
<head>
<title>cookie测试</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<%
String username = null;
Cookie[] cookies = request.getCookies();
if ( cookies != null ) {
for ( int i = 0; i < cookies.length; i ++ ) {
if( "cookies_user".equals(cookies[i].getName()) ) {
username = cookies[i].getValue();
}
}
if ( "onepc".equals(username) ) {
out.println("Hello");
} else {
%>
<table width="302" border="1">
<form id="form1" name="form1" method="post" action="clogin.jsp">
<tr>
<td width="79">
<div align="center"></div>
</td>
<td width="207">
<input type="text" name="user" id="user" />
</td>
</tr>
<tr>
<td>
<div align="center"></div>
</td>
<td>
<input type="text" name="textfield2" id="textfield2" />
</td>
</tr>
<tr>
<td>
<div align="center"></div>
</td>
<td>
<select name="select" id="select">
<option value="31536000">one year</option>
<option value="120">two min</option>
</select>
</td>
</tr>
<tr>
<td colspan="2">
<label>
<input type="submit" name="button" id="button" value="" />
</label>
</td>
</tr>
</form>
</table>
<%
}
}
%>
</body>
</html>
login.jsp
<%
String user = request.getParameter("user");
Cookie cookie = new Cookie("cookies_user",user);
cookie.setMaxAge(120);
response.addCookie(cookie);
response.sendRedirect("cindex.jsp");
%>test/test2/test345/test555/test666
a)相同名称的Cookie可以存在于不同的路径下。
b)删除时,如果当前路径下没有指定名称的Cookie,则查询全部父路径,检索到就执行删除操作(每次只能删除一个与自己最近的父路径Cookie)。
FF、必须指定与设定cookie时使用的相同路径来删除该cookie,而且cookie的名称不论大写、小写或大小混合都要指定路径
IE、名称小写时,如果当前路径为/test/test2,如果找不到再向上查询/test、/test555、/test345,如果还找不到就查询/(/test555/test666不查询) 。键名大小写混合或大写时,不指定路径则默认删除当前路径,并且不向上查询。
c)读取Cookie时只能读取直接父路径的Cookie。如果当前路径为/test/test2,要读取的键为“key”。当前路径读取后,还要读取/test,/test读取后,还要读取/ 。
d)在做Java的web项目时,由于一般的Web服务器(如Tomcat或Jetty)都用Context来管理不同的Web Application,这样对于每个Context有不同的Path,在一个Server中有多个Web Application时要特别小心,不要设置Path为/的Cookie,容易误操作(当然前提是域名相同)。