• 初识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");	
    	}
    
    }
    

  • 相关阅读:
    Day 20 初识面向对象
    Day 16 常用模块
    Day 15 正则表达式 re模块
    D14 模块 导入模块 开发目录规范
    Day 13 迭代器,生成器,内置函数
    Day 12 递归,二分算法,推导式,匿名函数
    Day 11 闭包函数.装饰器
    D10 函数(二) 嵌套,命名空间作用域
    D09 函数(一) 返回值,参数
    Day 07 Day08 字符编码与文件处理
  • 原文地址:https://www.cnblogs.com/mzywucai/p/11053511.html
Copyright © 2020-2023  润新知