创建多个Cookie,并使用浏览器内置功能实现查看。
创建Cookie对象,添加到响应对象response后返回给客户端
步骤一:新建AddCookieServlet
新建工程,在src下右键,新建Servlet,点击Next以后,修改url-pattern为addCookie,确定。
图 - 1
步骤二:部署应用,启动服务
部署应用,假定本次部署应用名称为day06。启动Tomcat,准备访问AddCookieServlet.java。
步骤三:打开Chrome浏览器清空已有Cookie
打开Chrome浏览器,点击菜单中设置,选择开发者工具。
图– 2
在打开的工具控制台中,选择Resources后,选择左边的Cookie(Localhost(右键(Clear,代表清除浏览器当前已有的Cookie,清除后,选中localhost,右边的窗口内不再有Cookie列表。
图 - 3
步骤四:访问addCookie,查看请求及响应数据包
打开Chrome开发者工具窗口中的Network,准备抓取请求响应数据包。
图– 4
在浏览器地址栏中输入http://localhost:8080/day06/addCookie 地址后确定,可以看见Network下面抓取了刚才的请求及响应数据包。点击“addCookie”这个名字后可以查看具体的包内数据。
图– 5
从响应数据包中可以看见以Set-Cookie头信息形式发回的cookie信息。如图-6
图– 6
再次查看Resources下面的cookie信息,会发现从空白增加为两对儿Cookie信息。如图-7
图– 7
步骤五:再次刷新addCookie,查看请求及响应数据包
再次回到Network区域,然后刷新页面,完成第二次对addCookie的访问,会发现在请求数据包中会自动发送存储的Cookie到服务器端,由于请求的Servlet中会执行response.addCookie这样的语句,所以在响应数据包中还是会以Set-Cookie的头信息发回两组添加到response中的信息。如图-8所示。
图 - 8
步骤六:关掉浏览器后再次打开,查看Cookie
关闭浏览器,然后再次打开浏览器,不访问任何地址,查看Resource下面的Cookie节点,会发现刚刚通过访问localhost产生的两组Cookie信息已经不存在了,说明刚刚单独Cookie是保存在浏览器的内存中的,随着浏览器的关闭会被自动销毁掉。
图 - 9
AddCookieServlet.java文件的代码如下:
package web; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class AddCookieServlet extends HttpServlet { public void service( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); // 创建cookie Cookie c1 = new Cookie("uname", "Kitty"); Cookie c2 = new Cookie("city", "Beijing"); // 添加cookie到response response.addCookie(c1); response.addCookie(c2); out.close(); } }
web.xml文件代码如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name></display-name> <servlet> <servlet-name>AddCookieServlet</servlet-name> <servlet-class>web.AddCookieServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>AddCookieServlet</servlet-name> <url-pattern>/addCookie</url-pattern> </servlet-mapping> </web-app>
输出请求中发送的Cookie信息,如果没有Cookie则输出“无Cookie信息”
通过request.getCookies()方法获取Cookie,判断是否为空,空代表没有Cookie,非空则遍历数组,通过getName和getValue方法获取cookie的名称和值,并输出。
步骤一:创建FindCookieServlet类
图 - 10
步骤二:先访问addCookie,保证浏览器中有Cookie
打开浏览器,先访问addCookie,保证浏览器中有与localhost域名相关的Cookie。通过查看Resources内的Cookie节点可以确定是否存在。
图 - 11
步骤三:再访问findCookie,查看输出
在浏览器内输入http://localhost:8080/day06/findCookie ,查看页面输出。
图 - 12
步骤四:重新打开浏览器,直接访问findCookie,查看输出
图 - 13
FindCookieServlet.java文件代码如下:
package web; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class FindCookieServlet extends HttpServlet { public void service( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType( "text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); // 获取Cookie Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie c : cookies) { String name = c.getName(); String value = c.getValue(); out.println("<h3>Name:" + name + " Value:" + value+"</h3>"); } } else { out.println("没有Cookie信息"); } out.close(); } }
web.xml文件代码如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name></display-name> <servlet> <servlet-name>AddCookieServlet</servlet-name> <servlet-class>web.AddCookieServlet</servlet-class> </servlet> <servlet> <servlet-name>FindCookieServlet</servlet-name> <servlet-class>web.FindCookieServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>AddCookieServlet</servlet-name> <url-pattern>/addCookie</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>FindCookieServlet</servlet-name> <url-pattern>/findCookie</url-pattern> </servlet-mapping> </web-app>
修改已有cookie的值
从request中获取cookie后,根据名字查找指定cookie,使用setValue方法覆盖原有值,再将cookie添加到response中。同名cookie到达浏览器以后会覆盖以前的同名cookie,效果等同为修改。
步骤一:新建UpdateCookieServlet类
图 - 14
步骤二:先访问 addServlet,查看访问后浏览器中的Cookie
图– 15
图 - 16
步骤三:再访问 updateServlet,查看访问后浏览器中的Cookie
图– 17
图 - 18
修改Cookie的流程:
第一次访问addServlet时,在响应头信息中使用Set-Cookie将cookie传送到客户端,浏览器在内存中保存了Cookie信息。接下来访问updateServlet时,在请求头信息中,使用cookie将内存中的Cookie信息发送到了服务器端,当服务器端执行到repsonse.add(c)方法时,就将一对儿有新的数据的cookie通过响应的Set-Cookie头发送回了客户端,于是同名Cookie覆盖原有信息,实现修改功能。
UpdateCookieServlet.java文件代码:
package web; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class UpdateCookieServlet extends HttpServlet { public void service( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); // 获取Cookie Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie c : cookies) { String name = c.getName(); if(name.equals("city")){ c.setValue("ShangHai"); response.addCookie(c); } } } out.close(); } }
web.xml文件代码:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name></display-name> <servlet> <servlet-name>AddCookieServlet</servlet-name> <servlet-class>web.AddCookieServlet</servlet-class> </servlet> <servlet> <servlet-name>FindCookieServlet</servlet-name> <servlet-class>web.FindCookieServlet</servlet-class> </servlet> <servlet> <servlet-name>UpdateCookieServlet</servlet-name> <servlet-class>web.UpdateCookieServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>AddCookieServlet</servlet-name> <url-pattern>/addCookie</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>FindCookieServlet</servlet-name> <url-pattern>/findCookie</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>UpdateCookieServlet</servlet-name> <url-pattern>/updateCookie</url-pattern> </servlet-mapping> </web-app>
设置Cookie的过期时间,使得Cookie保存在客户端硬盘中。
使用setMaxAge方法设置,单位为秒。
seconds > 0 : 保存在硬盘上的时间
seconds = 0 :立即删除
seconds < 0 :默认,保存在浏览器的内存中
步骤一:新建PersistentCookieServlet类
图 -19
步骤二:访问persistentCookie,查看Cookie状态
图 - 20
步骤三:重启浏览器,打开工具栏中的高级设置查看Cookie状态
重启浏览器,从菜单中选择“设置”(“显示高级设置”(“隐私设置”下的“内容设置”
图– 21
图– 22
通过查看本地Cookie文件,发现关闭浏览器以后city已经消失,保留了设置过期时间的uname这个Cookie的值。
PersistentCookieServlet.java文件代码:
package web; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class PersistentCookie extends HttpServlet { public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); //创建Cookie Cookie c1 = new Cookie("uname","Kitty"); //设置c1的过期时间 c1.setMaxAge(100); response.addCookie(c1); Cookie c2 = new Cookie("city","Bejing"); response.addCookie(c2); out.close(); } }
web.xml文件代码:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name></display-name> <servlet> <servlet-name>AddCookieServlet</servlet-name> <servlet-class>web.AddCookieServlet</servlet-class> </servlet> <servlet> <servlet-name>FindCookieServlet</servlet-name> <servlet-class>web.FindCookieServlet</servlet-class> </servlet> <servlet> <servlet-name>UpdateCookieServlet</servlet-name> <servlet-class>web.UpdateCookieServlet</servlet-class> </servlet> <servlet> <servlet-name>PersistentCookie</servlet-name> <servlet-class>web.PersistentCookie</servlet-class> </servlet> <servlet-mapping> <servlet-name>AddCookieServlet</servlet-name> <url-pattern>/addCookie</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>FindCookieServlet</servlet-name> <url-pattern>/findCookie</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>UpdateCookieServlet</servlet-name> <url-pattern>/updateCookie</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>PersistentCookie</servlet-name> <url-pattern>/persistentCookie</url-pattern> </servlet-mapping> </web-app>
在cookie中存储中文
cookie的值只能是ASCII字符,中文需要转换成ASCII码形式,使用URLEncoder.encode()方法和URLDecoder.decode()方法实现
步骤一:新建EncodeCookieServlet
图- 22
步骤二:新建DecodeCookieServlet
图- 23
步骤三:访问encodeCookie,查看响应数据包
图- 24
步骤四:访问decodeCookie,查看页面输出
图- 25
EncodeCookieServlet.java文件代码:
package web; import java.io.IOException; import java.io.PrintWriter; import java.net.URLEncoder; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class EncodeCookieServlet extends HttpServlet { public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); //先将中文进行UTF-8编码,再将编码后的字节数组转变为字符串 String city = URLEncoder.encode("北京","UTF-8"); //创建Cookie Cookie c1 = new Cookie("uname","Kitty"); Cookie c2 = new Cookie("city",city); response.addCookie(c1); response.addCookie(c2); } }
DecodeCookieServlet.java文件代码:
package web; import java.io.IOException; import java.io.PrintWriter; import java.net.URLDecoder; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class DecodeCookieServlet extends HttpServlet { public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie c : cookies) { String name = c.getName(); String value = c.getValue(); out.println("<h3>Name:" + name + " Value:" + URLDecoder.decode(value, "UTF-8") + "</h3>"); } }else{ out.println("没有Cookie"); } out.close(); } }
web.xml文件代码:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name></display-name> <servlet> <servlet-name>AddCookieServlet</servlet-name> <servlet-class>web.AddCookieServlet</servlet-class> </servlet> <servlet> <servlet-name>FindCookieServlet</servlet-name> <servlet-class>web.FindCookieServlet</servlet-class> </servlet> <servlet> <servlet-name>UpdateCookieServlet</servlet-name> <servlet-class>web.UpdateCookieServlet</servlet-class> </servlet> <servlet> <servlet-name>PersistentCookie</servlet-name> <servlet-class>web.PersistentCookie</servlet-class> </servlet> <servlet> <servlet-name>EncodeCookieServlet</servlet-name> <servlet-class>web.EncodeCookieServlet</servlet-class> </servlet> <servlet> <servlet-name>DecodeCookieServlet</servlet-name> <servlet-class>web.DecodeCookieServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>AddCookieServlet</servlet-name> <url-pattern>/addCookie</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>FindCookieServlet</servlet-name> <url-pattern>/findCookie</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>UpdateCookieServlet</servlet-name> <url-pattern>/updateCookie</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>PersistentCookie</servlet-name> <url-pattern>/persistentCookie</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>EncodeCookieServlet</servlet-name> <url-pattern>/encodeCookie</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>DecodeCookieServlet</servlet-name> <url-pattern>/decodeCookie</url-pattern> </servlet-mapping> </web-app>
修改Cookie的默认路径,使得对应用的任何访问都能发送该站点的Cookie
浏览器再向服务器的某个地址发请求时,会先比较cookie的路径与当前要访问的路径是否匹配,只有匹配的路径,才能发送cookie成功。cookie的路径通过setPath(String path)方法设置。缺省的Cookie路径为生成该Cookie的组件路径。只有路径相同或为其子路径时浏览器才会发送Cookie。如图-26所示即为Cookie的路径。
图- 26
步骤一:新建jsp/addCookie.jsp
图- 27
步骤二:新建webRoot/findeCookie.jsp
图- 28
步骤三:访问addCookie.jsp页面
图- 29
步骤四:访问webRoot/findCookie.jsp页面
图- 30
步骤五:修改addCookie.jsp的代码后再访问findCookie.jsp
修改addCookie.jsp文件,添加c.setPath()方法。重新部署后,访问addCookie.jsp,会发现path的值与图-29不再一样,由“/day06/jsp“变为 /day06.
图 – 31
图– 32
再次访问findCookie.jsp文件,运行如下
图– 33
结论:只有访问的当前路径与Cookie路径一致或是其子目录时,浏览器才会发送Cookie。需要修改Cookie路径时使用setPath()方法。
jsp/addCookie.jsp文件代码如下:
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%> <% Cookie c1 = new Cookie("uname","Kitty"); //设置路径为应用的根路径 c1.setPath("/day06"); response.addCookie(c1); %>
findCookie.jsp文件代码如下:
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%> <% Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie c : cookies) { String name = c.getName(); String value = c.getValue(); out.println("<h3>Name:" + name + " Value:" + value + "</h3>"); } } else { out.print("没有Cookie"); } %>