Cookie是存储在客户端计算机上的文本文件,并保留了它们的各种信息跟踪的目的。 Java Servlet透明支持HTTP Cookie。
涉及标识返回用户有三个步骤:
服务器脚本发送到浏览器的一组cookie。对于如: 姓名,年龄,或识别号码等。
浏览器将这些信息存储在本地计算机上,以备将来使用。
下一次浏览器发送任何请求,Web服务器,然后这些cookie发送信息到服务器,服务器将使用这些信息来识别用户。
本章将教你如何设置或重置cookie,如何访问它们,以及如何将它们删除。
Cookies通常设置在HTTP头(虽然JavaScript也可以直接在浏览器上设置一个cookie)。servlet也可以设置一个cookie发送标头,看起来像这样:
HTTP/1.1 200 OK Date: Fri, 04 Feb 2000 21:03:38 GMT Server: Apache/1.3.9 (UNIX) PHP/4.0b3 Set-Cookie: name=xyz; expires=Friday, 04-Feb-07 22:03:38 GMT; path=/; domain=tutorialspoint.com Connection: close Content-Type: text/html
正如你可以看到,Set-Cookie头包含一个名称值对,时间日期,路径和域。将URL名称和值编码。 expires字段是一个指令到浏览器的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
一个servlet就能够访问的cookie通过请求方法request.getCookies()返回一个Cookie对象数组。
以下是有用的方法列表时,可以使用servlet操纵cookies。
S.N. | Method & Description |
---|---|
1 |
public void setDomain(String pattern) 这个方法设置域的cookie适用,例如www.gitbook.net |
2 |
public String getDomain() 此方法获取域的cookie应用,例如gitbook.net |
3 |
public void setMaxAge(int expiry) 此方法设置cookie过期之前多少时间(以秒为单位)间隔。如果不这样设置,cookie将持续只对当前会话。 |
4 |
public int getMaxAge() 此方法返回的最大年龄(周期)cookie,以秒为单位指定,默认情况下,-1表示cookie将继续下去,直到浏览器关闭。 |
5 |
public String getName() 此方法返回的cookie的名称。创建后的名称不能改变。 |
6 |
public void setValue(String newValue) 此方法设置的cookie值。 |
7 |
public String getValue() 这种方法得到的cookie关联的值。 |
8 |
public void setPath(String uri) 这个方法设定这个cookie的路径。如果你不指定路径,Cookie是相同的目录以及当前页面的所有子目录中的所有URL返回。 |
9 |
public String getPath() 这种方法得到这个cookie的路径。 |
10 |
public void setSecure(boolean flag) 这个方法设置布尔值,表示cookie是否应该只发送的加密(如SSL)连接。 |
11 |
public void setComment(String purpose) 本方法规定了注释,说明一个cookie的目的。注释是非常有用的,如果在浏览器的cookie展现给用户。 |
12 |
public String getComment() 此方法返回的注释,描述这个cookie用途或者为null,如果cookie没有注释。 |
设置Cookie的servlet包括三个步骤:
(1) 创建一个Cookie对象:cookie的名称和cookie的值,这两个都是字符串调用Cookie的构造函数。
Cookie cookie = new Cookie("key","value");
请记住,无论是名字,也不值应该包含空格或以下任何字符:
[ ] ( ) = , " / ? @ : ;
(2) 设置将最长生存期:可以使用setMaxAge方法到指定多长时间(以秒为单位),在这时间内cookie应该是有效的。以下将成立一个24小时的cookie。
cookie.setMaxAge(60*60*24);
(3) HTTP响应头的Cookie发送到:使用response.addCookie添加cookie的HTTP响应头如下:
response.addCookie(cookie);
让我们修改我们的表格示例,设置第一个和最后一个名字的Cookie
// Import required java libraries import java.io.*; import javax.servlet.*; import javax.servlet.http.*; // Extend HttpServlet class public class HelloForm extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Create cookies for first and last names. Cookie firstName = new Cookie("first_name", request.getParameter("first_name")); Cookie lastName = new Cookie("last_name", request.getParameter("last_name")); // Set expiry date after 24 Hrs for both the cookies. firstName.setMaxAge(60*60*24); lastName.setMaxAge(60*60*24); // Add both the cookies in the response header. response.addCookie( firstName ); response.addCookie( lastName ); // Set response content type response.setContentType("text/html"); PrintWriter out = response.getWriter(); String title = "Setting Cookies Example"; String docType = "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n"; out.println(docType + "<html>\n" + "<head><title>" + title + "</title></head>\n" + "<body bgcolor=\"#f0f0f0\">\n" + "<h1 align=\"center\">" + title + "</h1>\n" + "<ul>\n" + " <li><b>First Name</b>: " + request.getParameter("first_name") + "\n" + " <li><b>Last Name</b>: " + request.getParameter("last_name") + "\n" + "</ul>\n" + "</body></html>"); } }
编译以上servlet 的 HelloForm和在web.xml文件中创建相应的条目,最后尝试下面的HTML页面调用servlet。
<html> <body> <form action="HelloForm" method="GET"> First Name: <input type="text" name="first_name"> <br /> Last Name: <input type="text" name="last_name" /> <input type="submit" value="Submit" /> </form> </body> </html>
保存上述文件为hello.htm,并把它放在<Tomcat-installation-directory>/webapps/ROOT/目录中HTML内容。
尝试输入First Name和Last Name,然后单击“提交”按钮。这将显示在屏幕上,同时设置两个cookie将被传递回服务器,您需要按“提交”按钮时,下一次的firstName和lastName姓氏和名字。
下一节会解释,如何在Web应用程序中访问这些Cookie的备份。
要读取Cookie,您需要创建一个一系列的javax.servlet.http.Cookie对象调用HttpServletRequest的getCookies()方法。然后循环数组,和使用的getName()和getValue()方法来访问每个cookie和关联的值。
让我们读取cookie,我们已经在前面的例子中:
// Import required java libraries import java.io.*; import javax.servlet.*; import javax.servlet.http.*; // Extend HttpServlet class public class ReadCookies extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Cookie cookie = null; Cookie[] cookies = null; // Get an array of Cookies associated with this domain cookies = request.getCookies(); // Set response content type response.setContentType("text/html"); PrintWriter out = response.getWriter(); String title = "Reading Cookies Example"; String docType = "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n"; out.println(docType + "<html>\n" + "<head><title>" + title + "</title></head>\n" + "<body bgcolor=\"#f0f0f0\">\n" ); 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>"); } out.println("</body>"); out.println("</html>"); } }
编译以上servlet的ReadCookies,并在web.xml文件中创建相应的条目。如果你想有first_name为“John”和last_name的“Player”的cookie的cookie,然后运行http://localhost:8080/ReadCookies将显示以下结果:
Found Cookies Name and ValueName : first_name, Value: JohnName : last_name, Value: Player |
删除cookie是非常简单的。如果你想删除一个cookie,那么你只需要遵循以下三个步骤:
阅读一个已经存在的cookie,并将其存储在Cookie对象。
设置cookie的年龄为零,通过setMaxAge()方法来删除现有的cookie。
将这个Cookie添加到响应头。
下面的例子将删除现有的cookie名为“first_name”,当你将运行ReadCookies的servlet,下一次它会返回空值first_name。
// Import required java libraries import java.io.*; import javax.servlet.*; import javax.servlet.http.*; // Extend HttpServlet class public class DeleteCookies extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Cookie cookie = null; Cookie[] cookies = null; // Get an array of Cookies associated with this domain cookies = request.getCookies(); // Set response content type -by www.gitbook.net response.setContentType("text/html"); PrintWriter out = response.getWriter(); String title = "Delete Cookies Example"; String docType = "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n"; out.println(docType + "<html>\n" + "<head><title>" + title + "</title></head>\n" + "<body bgcolor=\"#f0f0f0\">\n" ); if( cookies != null ){ out.println("<h2> Cookies Name and Value</h2>"); for (int i = 0; i < cookies.length; i++){ cookie = cookies[i]; if((cookie.getName( )).compareTo("first_name") == 0 ){ cookie.setMaxAge(0); response.addCookie(cookie); out.print("Deleted cookie : " + cookie.getName( ) + "<br/>"); } out.print("Name : " + cookie.getName( ) + ", "); out.print("Value: " + cookie.getValue( )+" <br/>"); } }else{ out.println( "<h2>No cookies founds</h2>"); } out.println("</body>"); out.println("</html>"); } }
编译以上DeleteCookies 配置servlet ,并在web.xml文件中创建相应的条目。
现在运行http://localhost:8080/DeleteCookies将显示如下的结果:
Cookies Name and ValueDeleted cookie : first_nameName : first_name, Value: John Name : last_name, Value: Player |
现在尝试运行http://localhost:8080/ReadCookies ,它会显示一个cookie如下:
Found Cookies Name and ValueName : last_name, Value: Player |
您可以手动在Internet Explorer中删除Cookie。在“工具”菜单,选择“Internet选项”。要删除所有Cookie,按“删除Cookies”。