在本章中,我们将讨论JSP中的Cookies处理. Cookie是存储在客户端计算机上的文本文件,用于各种信息跟踪目的. JSP使用底层servlet技术透明地支持HTTP cookie.
识别和返回用户涉及三个步骤 :
服务器脚本向浏览器发送一组cookie.例如,姓名,年龄或身份证号等.
浏览器将此信息存储在本地计算机上以备将来使用.
当下次浏览器向Web服务器发送任何请求时,它会将这些cookie信息发送到服务器,服务器使用该信息来识别用户,或者可能出于某些其他目的好吧.
本章将教你如何设置或重置cookie,如何访问它们以及如何使用JSP程序删除它们.
Cookie通常设置在HTTP标头中(尽管JavaScript也可以直接在浏览器上设置Cookie).设置cookie的JSP可能会发送类似于此内容的标题;
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 = it352.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脚本可以通过请求方法 request.getCookies() 访问cookie一个 Cookie 对象的数组.
下表列出了与Cookie对象相关的有用方法你可以在JSP和minus中操纵cookie时使用它;
S.No. | 方法&描述 |
---|---|
1 | public void setDomain(String pattern) 此方法设置cookie适用的域;例如,it1352.com. |
2 | public String getDomain() 此方法获取cookie适用的域名;例如,it1352.com. |
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) this method设置与cookie关联的值. |
7 | public String getValue() 此方法获取与cookie相关的值. |
8 | public void setPath(String uri) 此方法设置此cookie适用的路径.如果您没有指定路径,则会返回与当前页面以及所有子目录位于同一目录中的所有URL的cookie. |
9 | public String getPath() 此方法获取此cookie适用的路径. |
10 | public void setSecure (布尔标志) 此方法设置布尔值,指示是否应仅通过加密(即SSL)连接发送cookie. |
11 | public void setComment(String purpose) 此方法指定描述cookie用途的注释.如果浏览器向用户提供cookie,则注释很有用. |
12 | public String getComment() 此方法返回描述此cookie用途的注释,如果cookie没有注释,则返回null. |
使用JSP设置cookie涉及三个步骤 :
使用cookie名称和cookie值调用Cookie构造函数,两者都是字符串.
Cookie cookie = new Cookie("key","value");
请注意,名称和值都不应包含空格或以下任何字符和减号;
[ ] ( ) = , " / ? @ : ;
您使用 setMaxAge 指定cookie应该有效的时间长度(以秒为单位).以下代码将设置一个24小时的cookie.
cookie.setMaxAge(60 * 60 * 24);
您使用 response.addCookie 在HTTP响应标头中添加Cookie,如下所示
response.addCookie(cookie);
让我们修改我们的表单示例为第一个和最后一个名称设置cookie.
<% // 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 ); %> <html> <head> <title>Setting Cookies</title> </head> <body> <center> <h1>Setting Cookies</h1> </center> <ul> <li><p><b>First Name:</b> <%= request.getParameter("first_name")%> </p></li> <li><p><b>Last Name:</b> <%= request.getParameter("last_name")%> </p></li> </ul> </body> </html>
我们将上面的代码放在 main.jsp 文件中,并在以下HTML页面中使用它 :
<html> <body> <form action = "main.jsp" 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>
将上述HTML内容保存在文件 hello.jsp 中并输入 hello.jsp 和 main.jsp 在< Tomcat-installation-directory>/webapps/ROOT 目录中.当您访问 http://localhost:8080/hello.jsp 时,以下是上述表单的实际输出.
尝试输入名字和姓氏,然后单击"提交"按钮.这将在屏幕上显示名字和姓氏,还将设置两个cookie firstName 和 lastName .下次单击"提交"按钮时,这些cookie将被传递回服务器.
在下一节中,我们将解释如何在Web应用程序中访问这些cookie.
要读取cookie,需要创建 javax.servlet.http.Cookie 通过调用 HttpServletRequest 的 getCookies()方法对象.然后遍历数组,并使用 getName()和 getValue()方法访问每个cookie和相关值.
现在让我们阅读上一个示例中设置的Cookie :
<html> <head> <title>Reading Cookies</title> </head> <body> <center> <h1>Reading Cookies</h1> </center> <% Cookie cookie = null; Cookie[] cookies = null; // Get an array of Cookies associated with the this domain 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>"); } %> </body> </html>
现在让我们将上面的代码放在 main.jsp 文件中并尝试访问它.如果将 first_name cookie 设置为"John"并将 last_name cookie 设置为"Player",则运行 http://localhost:8080/main. jsp 将显示以下结果 :
Found Cookies Name and ValueName : first_name, Value: JohnName : last_name, Value: Player
删除Cookie非常简单.如果你想删除一个cookie,那么你只需要按照这三个步骤 : 去;
读取一个已经存在的cookie并将其存储在Cookie对象中.
使用 setMaxAge()方法将cookie年龄设置为零以删除现有cookie./p>
将此cookie添加回响应标题.
以下示例将向您展示如何删除名为"first_name"的现有cookie,并在下次运行main.jsp JSP时,它将返回null值first_name.
<html> <head> <title>Reading Cookies</title> </head> <body> <center> <h1>Reading Cookies</h1> </center> <% Cookie cookie = null; Cookie[] cookies = null; // Get an array of Cookies associated with the this domain 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]; 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>"); } %> </body> </html>
现在让我们将上面的代码放在 main.jsp 文件中并尝试访问它.它将显示以下结果 :
Cookies Name and ValueDeleted cookie : first_nameName : first_name, Value: JohnName : last_name, Value: Player
现在再次运行 http://localhost:8080/main.jsp ,它应该只显示一个cookie,如下所示;
Found Cookies Name and ValueName : last_name, Value: Player
您可以手动删除Internet Explorer中的cookie.从"工具"菜单开始,然后选择"Internet选项".要删除所有cookie,请单击"删除Cookies"按钮.