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,容易误操作(当然前提是域名相同)。