3.1.10 Cookie的处理
通过Cookie识别用户的3个步骤如下。
(1)服务器脚本向浏览器发送一组Cookie,如姓名、年龄或识别号码等。
(2)浏览器将这些信息存储在本地计算机上,以便将来使用。
(3)当浏览器下一次向Web服务器发送任何请求时,浏览器会把这些Cookie信息发送到服务器,服务器将使用这些信息来识别用户。
1.通过 Servlet 设置 Cookie
通过Servlet设置Cookie包括以下3个步骤。
(1)创建一个Cookie对象。可以调用带Cookie名称和Cookie值的Cookie构造函数,Cookie名称和Cookie值都是字符串。
语法如下。
Cookie cookie = new Cookie("key","value"); |
(2)设置最大生存周期。可以使用setMaxAge方法来指定Cookie能够保持有效的时间(以秒为单位)。下面将设置一个最长有效期为24小时的Cookie。
语法如下。
cookie.setMaxAge(60*60*24); |
(3)发送Cookie到HTTP响应头。可以使用response.addCookie来添加HTTP响应头中的Cookie。
语法如下。
response.addCookie(cookie); |
2.通过Servlet读取Cookie
为了读取 Cookie,需要通过调用HttpServletRequest的getCookies()方法创建一个javax.servlet.http.Cookie对象的数组,然后遍历数组,并使用getName()与getValue()方法访问每个Cookie和关联值。
3.通过Servlet设置和读取Cookie的示例
在该示例中,先通过表单提交一个网站名和网址,然后把网站名和网址都存放到Cookie中,再通过Cookie读出来并显示在屏幕上。示例分为3个文件。这3个文件在Eclipse项目树中的位置如图3-37所示。
图3-37 3个文件在Eclipse项目树中的位置
首先,创建一个客户端提交的表单,命名为Myform.html。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>This is a setcookie form sample.</title> </head> <body> <form action=/FirstServletProject/SetCookie method="POST"> 请输入网站地址 :<input type="text" name="name"> |
<br /> 请输入网站URL:<input type="text" name="url" /><br> <input type="submit" value="提交" /> </form> </body> </html> |
然后,编写设置Cookie的代码,命名为SetCookie.java。
package ver.son.fsproject; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/SetCookie") public class SetCookie extends HttpServlet { private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //创建 Cookie Cookie name = new Cookie("name",request.getParameter("name")); Cookie url = new Cookie("url",request.getParameter("url")); //为两个 Cookie 设置过期时间为 24 小时后 name.setMaxAge(60*60*24); url.setMaxAge(60*60*24); //在响应头中添加两个 Cookie response.addCookie( name ); response.addCookie( url ); //设置响应内容类型 response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String title = "设置我的 Cookie 实例"; String docType = "<!DOCTYPE html>\n"; out.println(docType + "<html>\n" + "<head><title>" + title + "</title></head>\n" + "<body>\n" + "<h1 align=\"center\">" + title + "</h1>\n" + "<ul>\n" + " <li><b>网站名:</b>:" + request.getParameter("name") + "\n</li>" + " <li><b>网站地址:</b>:" + request.getParameter("url") + "\n</li>" + "</ul>\n" + "</body></html>"); } } |
最后,编写读取Cookie的代码,命名为ReadCookies.java。
package ver.son.fsproject; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/ReadCookies") public class ReadCookies extends HttpServlet { private static final long serialVersionUID = 1L; @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Cookie cookie = null; Cookie[] cookies = null; //获取与该域相关的 Cookie 的数组 cookies = request.getCookies(); //设置响应内容类型 response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String title = "My Cookie read example!"; String docType = "<!DOCTYPE html>\n"; out.println(docType + "<html>\n" + "<head><title>" + title + "</title></head>\n" + "<body>\n" ); if( cookies != null ){ out.println("<h2>以下显示Cookie 名称和值</h2>"); for (int i = 0; i < cookies.length; i++){ cookie = cookies[i]; out.print("名称:" + cookie.getName( ) + "<br/>"); out.print("值:" + cookie.getValue() +" <br/>"); } }else{ out.println( "<h2>No cookie Existing</h2>"); } out.println("</body>"); out.println("</html>"); } } |
4.直接运行Myform.html
这个文件通过<form action=/FirstServletProject/SetCookie method="POST">中指定的action内容,调用SetCookie的Servlet。在运行过程中输入网站名和网址,提交后就会保存Cookie,同时返回运行结果,如图3-38所示。
图3-38 第一次的运行结果
此时再次运行ReadCookie的Servlet,就会看到读出了Cookie,如图3-39所示。
图3-39 第二次的运行结果
版权声明:51Testing软件测试网获得人民邮电出版社和作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。