Cookie详解
Cookie特点
Cookie技术:会话数据保存在浏览器客户端
Cookie常用的方法
Cookie类:用于存储会话数据(服务器创建Cooike,然后把Cookie发送到浏览器保存起来)
构造Cookie对象
Cookie(String name, String value);
Cookie(String name, String value, String path, Stringdomain[域对象])
Cookie(String name, String value, String path, Stringdomain[域对象],int version[版本])
发送cookie到浏览器端保存
HttpServletResponse respone=null;
respone.addCookie(Cookie cookie); 将指定cookie添加到响应。
服务器接收客户端发送的cookie
HttpServletRequest request=null;
Cookie[ ]request.getCookies() 返回一个数组,其中包含所有的Cookie对象的客户端发送请求。
注意点:
1,当服务器向浏览器发送Cookie的时候,会默认把cookie的信息放在响应头中。
3,浏览器再次向服务器发送请求的时候,会默认将所有保存的cookie信息放到请求头中再次提交给服务器
Cookie 的细节
(1) setPath(String uri)
注释:Specifies a path for the cookie to which the client should returnthe cookie.( 指定一个路径为客户端应该返回)
设置Cookie的有效访问路径。有效路径指的是Cookie的有效路径保存在哪里,那么浏览器在有效路径下访问服务器时就会带着Cookie信息,否则不带Cookie信息。
如果不写setPath,则默认是当前的项目路径。
(2)voidsetMaxAge(intexpiry) : 设置cookie的有效时间。
正整数:表示cookie数据保存浏览器的缓存目录(硬盘中),数值表示保存的时间。
负整数:表示cookie数据保存浏览器的内存中。浏览器关闭cookie就丢失了!!
零:表示删除同名的cookie数据
(3)Cookie数据类型:只能保存非中文字符串类型的。可以保存多个cookie,但是浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
源码分享:
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 创建Cookie对象
Cookie cookie1 = new Cookie("name", "tom");
Cookie cookie2 = new Cookie("email", "tom@qq.com");
cookie1.setPath("/servlet_study/CookieServlet2");
cookie2.setPath("/servlet_study");
// 再次访问http://localhost:8080/1.16Pro/CookieDemo1的时候,只有cookie1的信息会发送给服务器
// 再次访问http://localhost:8080/1.16Pro/的时候,cookie1和cookie2的信息都会发送给服务器
// cookie1 20秒之后过期(20秒指的是从最后一次访问的时间开始算起)
cookie1.setMaxAge(20);
// 关闭浏览器cookie2就消失
cookie2.setMaxAge(-1);
// 删除cookie2,将cookie2发送到浏览器的时候,浏览器存的cookie2的信息会立马过期
cookie2.setMaxAge(0);
// 将cookie发送到浏览器
response.addCookie(cookie1);
response.addCookie(cookie2);
}
运行结果:
细节分细:(了解)
Servlet Cookie 处理需要对中文进行编码与解码,方法如下:(该方法已经过时)
String str = java.net.URLEncoder.
encode("中文"); // 编码String str = java.net.URLDecoder.
decode("编码后的字符串"); // 解码
一,通过Servlet设置Cookie
分为以下三个步骤:
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);
源码及截图
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>设置Cookie</title>
</head>
<body>
<form action="/servlet_study/CookieTest" method="get">
<table style="border: 1px solid:black;">
<tr>
<td>用户名:</td>
<td><input type="text" name="name" id="name"></td>
</tr>
<tr>
<td>网址:</td>
<td><input type="text" name="url" id="url"></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="提交"></td>
</tr>
</table>
</form>
</body>
</html>
页面运行截图
CookieTest Servlet类代码
package com.china.servlet;
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("/CookieTest")
public class CookieTest extends HttpServlet {
private static final long serialVersionUID = 1L;
public CookieTest() {
super();
}
protected void doGet(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设置有效时间
name.setMaxAge(24 * 60 * 60);
url.setMaxAge(24 * 60 * 60);
// 在响应头中添加两个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 PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'>\n";
out.println(doctype + "<html>\n" + "<head><title>" + title + "</title></head><body>用户名:"
+ request.getParameter("name") + "<br/>网址:" + request.getParameter("url") + "</body></html>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
输入网址:
http://localhost:8080/servlet_study/testCookie.jsp
运行结果:
通过 Servlet 读取 Cookie
要读取 Cookie,您需要通过调用 HttpServletRequest 的 getCookies( ) 方法创建一个 javax.servlet.http.Cookie 对象的数组。然后循环遍历数组,并使用 getName() 和 getValue() 方法来访问每个 cookie 和关联的值。
源码演示及截图
package com.china.servlet;
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("/GetCookie")
public class GetCookie extends HttpServlet {
private static final long serialVersionUID = 1L;
public GetCookie() {
}
protected 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 = "getCookie 值的实例";
String dohtml = "<!DOCTYPE html>\n";
out.println(dohtml + "<html>\n<head><title>" + title + "</title></head><body>");
if (cookies != null) {
out.println("<h2>Cookie名称和值是:</h2>");
for (int i = 0; i < cookies.length; i++) {
cookie = cookies[i];
if ((cookie.getName()).compareTo("name") == 0) {
cookie.setMaxAge(0);
response.addCookie(cookie);
out.print("已删除的 cookie:" + cookie.getName() + "<br/>");
}
out.println("名称:" + cookie.getName() + ",");
out.println("值:" + cookie.getValue() + "<br/>");
}
} else {
out.println("<h2 class=\"tutheader\">No Cookie founds</h2>");
}
out.println("</body>");
out.println("</html>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
截图:
输入以下网址: http://localhost:8080/servlet_study/GetCookie
补充:
cookie是如何工作的:(掌握)
1.第一次请求服务器的时候,在服务器创建一个cookie对象,然后将该cookie对象加到响应头中,发送到浏览器
2.浏览器接收到服务器发送过来的cookie信息之后,会将该cookie信息保存起来
3.当浏览器再次向服务器发送请求的时候,会自动将所有保存的cookie信息放到请求头中一起提交到服务器
4.服务器就可以获取来自请求中的cookie数据了
结束。。。?待续。。。。。