Top

JAVA SERVLETJSP DAY06

  1. 创建Cookie
  2. 查找Cookie
  3. 修改Cookie
  4. Cookie的保存时间
  5. Cookie案例——中文编码
  6. Cookie案例——路径问题

1 创建Cookie

1.1 问题

创建多个Cookie,并使用浏览器内置功能实现查看。

1.2 方案

创建Cookie对象,添加到响应对象response后返回给客户端

1.3 步骤

步骤一:新建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

在浏览器地址栏中输入/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

1.4 完整代码

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="/java.sun.com/xml/ns/javaee" 
	xmlns:xsi="/www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="/java.sun.com/xml/ns/javaee 
	/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>

2 查找Cookie

2.1 问题

输出请求中发送的Cookie信息,如果没有Cookie则输出“无Cookie信息”

2.2 方案

通过request.getCookies()方法获取Cookie,判断是否为空,空代表没有Cookie,非空则遍历数组,通过getName和getValue方法获取cookie的名称和值,并输出。

2.3 步骤

步骤一:创建FindCookieServlet类

图 - 10

步骤二:先访问addCookie,保证浏览器中有Cookie

打开浏览器,先访问addCookie,保证浏览器中有与localhost域名相关的Cookie。通过查看Resources内的Cookie节点可以确定是否存在。

图 - 11

步骤三:再访问findCookie,查看输出

在浏览器内输入/localhost:8080/day06/findCookie ,查看页面输出。

图 - 12

步骤四:重新打开浏览器,直接访问findCookie,查看输出

图 - 13

2.4 完整代码

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="/java.sun.com/xml/ns/javaee" 
	xmlns:xsi="/www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="/java.sun.com/xml/ns/javaee 
	/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>

3 修改Cookie

3.1 问题

修改已有cookie的值

3.2 方案

从request中获取cookie后,根据名字查找指定cookie,使用setValue方法覆盖原有值,再将cookie添加到response中。同名cookie到达浏览器以后会覆盖以前的同名cookie,效果等同为修改。

3.3 步骤

步骤一:新建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覆盖原有信息,实现修改功能。

3.4 完整代码

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="/java.sun.com/xml/ns/javaee" 
	xmlns:xsi="/www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="/java.sun.com/xml/ns/javaee 
	/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>

4 Cookie的保存时间

4.1 问题

设置Cookie的过期时间,使得Cookie保存在客户端硬盘中。

4.2 方案

使用setMaxAge方法设置,单位为秒。

seconds > 0 : 保存在硬盘上的时间

seconds = 0 :立即删除

seconds < 0 :默认,保存在浏览器的内存中

4.3 步骤

步骤一:新建PersistentCookieServlet类

图 -19

步骤二:访问persistentCookie,查看Cookie状态

图 - 20

步骤三:重启浏览器,打开工具栏中的高级设置查看Cookie状态

重启浏览器,从菜单中选择“设置”(“显示高级设置”(“隐私设置”下的“内容设置”

图– 21

图– 22

通过查看本地Cookie文件,发现关闭浏览器以后city已经消失,保留了设置过期时间的uname这个Cookie的值。

4.4 完整代码

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="/java.sun.com/xml/ns/javaee" 
	xmlns:xsi="/www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="/java.sun.com/xml/ns/javaee 
	/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>

5 Cookie案例——中文编码

5.1 问题

在cookie中存储中文

5.2 方案

cookie的值只能是ASCII字符,中文需要转换成ASCII码形式,使用URLEncoder.encode()方法和URLDecoder.decode()方法实现

5.3 步骤

步骤一:新建EncodeCookieServlet

图- 22

步骤二:新建DecodeCookieServlet

图- 23

步骤三:访问encodeCookie,查看响应数据包

图- 24

步骤四:访问decodeCookie,查看页面输出

图- 25

5.4 完整代码

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="/java.sun.com/xml/ns/javaee" 
	xmlns:xsi="/www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="/java.sun.com/xml/ns/javaee 
	/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>

6 Cookie案例——路径问题

6.1 问题

修改Cookie的默认路径,使得对应用的任何访问都能发送该站点的Cookie

6.2 方案

浏览器再向服务器的某个地址发请求时,会先比较cookie的路径与当前要访问的路径是否匹配,只有匹配的路径,才能发送cookie成功。cookie的路径通过setPath(String path)方法设置。缺省的Cookie路径为生成该Cookie的组件路径。只有路径相同或为其子路径时浏览器才会发送Cookie。如图-26所示即为Cookie的路径。

图- 26

6.3 步骤

步骤一:新建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()方法。

6.4 完整代码

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");
	}
%>