初识cookie

package day01.cookies;

import java.io.IOException;
import java.net.URLDecoder;
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;
/**
 * cookie中需要注意的点:
 * 		1) 在cookie中添加中文的value的时候,需要使用
 * 			URLEncoder和URLDecoder进行编码和解码
 * 			URLEncoder.encode()
 * 			URLDecoder.decode()
 * 		2) cookie中有一个设置生存空间的setPath()方法
 * 			作用是cookie在这个设置的路径中,才会被携带
 * 			cookie.setPath(String path)
 * 		3) cookie的生存时间,setMaxAge(int time)
 * 			其中的time:
 * 			
 * 			正整数:在XX秒之后失效
 * 			
 * 			(默认)负整数:在浏览器关闭的时候失效:负数的值没有关系 -1和-10000效果相同
 * 			
 * 			0:
 * 			一般用于删除同名的cookie,比如现在浏览器中有一个stu_name的cookie
 * 			我再创建一个stu_name的cookie,提交覆盖之后,设置它的生存时间为0
 * 			当前就结束。
 * 			Cookie c = new Cookie("stu_name", "xxx");
 * 			c.setMaxAge(0);
 * 	
 * @author mzy
 * 
 * cookie的限制:
 * 		一个浏览器最多放300个cookie,一个站点最多有20个cookie
 * 		每个cookie的大小限制为4kb。
 *		
 *cookie的类型单一(数据类型不丰富)
 *并且在浏览器中可以查看,相对不安全;
 *但是cookie足够简单,并且数据是存在浏览器的,
 *不会占用服务器的资源;减轻服务器的负担;
 *
 *
 *session的引入:
 *		大小没有了限制,且类型更丰富,并且更安全;
 *session就是用来弥补cookie的。
 *
 */
public class CookieDemo01 extends HttpServlet {

	private static final long serialVersionUID = 1271099427163484729L;

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");

		// 1. 使用响应头:(设置cookie中的数据)
		response.setHeader("set-cookie", "name=mzy");
		// 名字相同的cookie属性会覆盖
		// response.setHeader("set-cookie", "name=zxr");
		/*
		 * 每次为服务器的response存入cookie的时候,
		 * 都要进行setHeader的操作,显得比较繁琐;
		 * 设计者引入面向对象的思想进行设计
		 * 设计出了cookie操作的简化版本:
		 * 
		 * response.addCookie(cookie);
		 */
		
		
		// 2. 使用请求头获取cookie里面的数据
		String c1 = request.getHeader("cookie");
		/*
		 * 同样:
		 * 浏览器在下次访问服务器的时候,
		 * 开发者也得通过请求头进行cookie
		 * 数据的传输的话,也显得比较繁琐
		 * 推出getHeader("cookie");的简化
		 * 版本
		 * 
		 * request.getCookie();
		 * 因为cookie中的数据可能有多条
		 * 所以此方法返回的是一个Cookie
		 * 类型的数组
		 * Cookie[] cookies = request.getCookies();
		 */	
				
		// System.out.println(c1);
		
		
		// 全部使用简化版本的操作
		// 1) 创建cookie对象,保存会话数据
		Cookie cookie1 = new Cookie("stu_name", "mzy");
		
		/*
		 * 设置有效路径:(默认如果你不设置的话,就设置到当前的目录下)
		 * cookie的setPath的作用就是设置cookie的使用范围:
		 * 当我们在访问对应的path路径下的时候,才会携带这条cookie
		 * 信息,其它的时候,并不会携带此cookie的信息。
		 */
		// cookie1.setPath("/MyFirstServlet");
		
		/*
		 * 设置有效时间:
		 * 		正整数:表示超过了正整数的数值的时间,cookie就会丢失!(保存在硬盘中)
		 * 		负整数:表示浏览器关闭了,cookie信息就丢失!(保存在浏览器内存)
		 * 		什么都不设置默认情况下就是一个负整数;
		 * 		0:表示删除同名的cookie  
		 * 		删除同名的cookie的原理就是,提交一个同名的cookie;
		 * 		比如都是stu_name		进行提交了之后
		 * 		设置这个cookie的有效时间为0;表示立即消失
		 */
		// cookie1.setMaxAge(20); // 20秒之后就清除这个cookie信息
		cookie1.setMaxAge(-1); // 这个负数的值本身没有关系,负多少都一样
		
		Cookie cookie2 = new Cookie("stu_id", "1633140111");
		/*
 		 *  但是在cookie中存入中文信息的时候要注意
 		 *  如果不对cookie中的中文信息进行加密的话
 		 *  就会出现错误!500(服务器端的错误)
 		 *  
 		 *  使用之前的URLEncoder进行加密
 		 *  使用之前的URLDecoder进行解密
 		 */
 		String name = URLEncoder.encode("张三", "utf-8");
 		Cookie cookie3 = new Cookie("stu_name", name);
 		/*
 		 * cookie中同名的信息只能存储一个。(默认为存储后者)
 		 */
 		response.addCookie(cookie1);
 		response.addCookie(cookie2);
 		response.addCookie(cookie3);
 		
 		Cookie[] cookies = request.getCookies();
 		int len = 0;
 		if(cookies != null) {
 			for (Cookie cookie : cookies) {				
 				String value = cookie.getValue();
 				value = URLDecoder.decode(value, "utf-8");
 				System.out.println(cookie.getName()+"="+value);
 				len++;
 			}
 			System.out.println(len);
 		} else {
 			System.out.println("cookies中没有数据");
 		}
 		
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");	
	}

}

posted @ 2018-05-02 09:25  五彩世界  阅读(102)  评论(0编辑  收藏  举报