Cookie对象

1、Cookie的API
	*方法
		-getName();
			得到Cookie的名称
		-getValue();
			得到Cookie的值
		-setMaxAge(int expiry);
			设置Cookie得有效时长
				*Cookie分类(两种)
					-会话级别的Cookie
						特点是浏览器关闭之后,cookie就销毁了,默认就是会话级别的cookie。
					
					-持久性的Cookie
						在一定的范围内,cookie会一直有效。
						使用到上述的方法,
							//持久性Cookie设置方式
							//设置有效时长
							cfirst.setMaxAge(3600);
							//设置有效路径
							cfirst.setPath("/");
						
						--持久性cookie销毁
							-第一种:到期销毁
							
							-第二种:
								--setMaxAge(0);//设置为0
								--设置有效路径setPath("/");要保证要销毁的cookie路径和设置的路径一样。
								--回写到浏览器内存中

		-setPath(String url);
			有效路径:
				-通过这个访问,会携带cookie信息。比如setPath("day10");
				
				-http://127.0.0.1/day10/aa在地址栏输入地址会携带Cookie信息

				-http://127.0.0.1/day11/aa在地址栏输入地址不会携带cookie信息

			*技巧性设置
				setPath("/");

		-setDomain(String pattern);
			*有效域名的路径
				-通过这个域名访问,会携带cookie信息
				-比如 setDomain("www.sina.com");
					在地址栏输入一个地址 http://www.sina.com会携带cookie信息

					在地址栏输入一个地址http://www.news.sian.com不会携带cookie信息

				-存在一个设置技巧
					setDomain(".sina.com");//设置顶级域名

2、使用cookie记录用户上次访问时间
	*实现功能:
		第一次访问:向页面输出welcome;
		第二次访问:把第一次产生的访问时间显示出来;
		第三个访问:把第二次产生的访问时间显示出来;

	*步骤:
		第一次访问想页面输出欢迎信息,并产生一个访问时间,使用cookie返回到浏览器内存中

		第二次访问,带着内存中第一次时间进行访问,到服务器得到第一次时间,并显示到页面页面上,产生新时间,在通过cookie返回到浏览器内存中,以此类推
		
		-注意如何判断是否是第一次访问?


	*方法:
		- Cookie[] getCookies()  HttpServletRequest 
		 返回一个数组,其中包含客户端通过此请求发送的所有Cookie对象

		- void addCookie(Cookie cookie) HttpServletResponse
		通过cookie把这个值返回到浏览器的内存中(回写)
		向响应添加指定的cookie。可以多次调用此方法来设置多个cookie。
	

		-Cookie(String name ,String value)
		使用cookie的构造函数

		-getName()
		获取cookie名称

	*代码演示
		public void doGet(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
		
			//得到所有的cookie
			Cookie[] cookies = request.getCookies();
			
			//假设访问返回cookit名称是visit,判断是否是第一次访问,使用addCookie方法,可以一个key对应多个value
			Cookie cookie = findCookie(cookies,"visit");
		
			//如果是第一次
			if(cookie == null)
			{
				response.getWriter().write("Welcome");
			}
			else
			{
				//得到上次访问时间
				String time1 = cookie.getValue();
				
				response.getWriter().write(time1);
				
			}
			//产生新的时间
			Date date  = new Date();
			String time = date.toLocaleString();
			
			//把time回写到浏览器内存中
			Cookie cfirst = new Cookie("visit",time);
			response.addCookie(cfirst);
		}
		
		//判断cookie数组里面是否有名称是visit的cookie
		private Cookie findCookie(Cookie[] cookies, String string) {
			if(cookies == null)
			{
				return null;
			}
			
			for (Cookie cookie : cookies) {
				
				//使用方法getName()得到cookie的名字
				if(cookie.getName().equals("visit"))
				{
					return cookie;
				}
			}
			return null;
		}

3、cookie细节问题
	*一个Cookie只能表示一种信息,它至少含有一个标识该信息的名称(Name)和设置值(Value)

	*一个web站点可以给一个web浏览器发送多个cookie,一个web浏览器也可以存储多个web站点提供的cookie
	
	*浏览器一般只允许存放300个cookie,每个站点最多存放20个cookie,每个Cookie的大小限制为4KB

	*如果创建一个cookie,并将它发送到浏览器,默认情况下它是一个回话级别的cookie(即存储在浏览器的内存中,用户退出浏览器之后即销毁)

	*删除持久性的cookie,可以将cookie最大时效设为0,注意,删除cookie时,path必须要保持一致,否则不会删除成功

4、使用cookie记录用户浏览的商品记录
		*步骤
			-使用不同的id区分不同的商品
				超链接<a href="/day10/aa?id=1">aa</a>:类似于get提交
			-第一次购买,在服务器得到商品id,把id值回写到浏览器内存中

			-第二次购买,带着第一次购买的id进行访问,在服务器端获取id,然后把两次的id都返回给浏览器,以此类推

		*判断是否是第一次购买?
			-首先得到所有的cookie
			-遍历cookie数组,判断是否有相同的cookie即可
		
		*判断商品的id值,是否已经存在cookie里面,如果存在,不需要回写,不存在才需要回写到浏览器的内存中
		
		*清空浏览记录
			-销毁cookie,清空浏览记录
				--创建一个和要销毁的cookie相同名称
					Cookie cookie = new Cookie("history","");
				--设置有效时长 0 
					cookie.setMaxAge(0);
				--设置有效路径
					cookie.setPath("/");
				--回写cookie
					response.addCookie(cookie);

		*代码演示
			-CookieDemo2.java
			/**
			 * 实现记录用户浏览的商品
			 */
			public void doGet(HttpServletRequest request, HttpServletResponse response)
					throws ServletException, IOException {

				// 得到id
				String id = request.getParameter("id");

				// 判断是否是第一次浏览
				Cookie[] cookies = request.getCookies();

				// 判断是否有history名称的cookie
				Cookie cookie = MyCookieUtils.findCookie(cookies, "history");

				// 判断第一次
				if (cookie == null) {
					Cookie cookieFirst = new Cookie("history", id);

					// 设置持久性cookie
					cookieFirst.setMaxAge(3600);
					cookieFirst.setPath("/");

					// 回写cookie
					response.addCookie(cookieFirst);
				} else {
					// 得到上一次浏览的id值
					String values = cookie.getValue();

					String[] ids = values.split(",");
					boolean flag = MyCookieUtils.checkID(ids, id);

					// 如果不相同回写
					if (!flag) {
						String newId = values + "," + id;

						Cookie cookieNew = new Cookie("history", newId);

						// 设置持久性cookie
						cookieNew.setMaxAge(3600);
						cookieNew.setPath("/");

						// 回写cookie
						response.addCookie(cookieNew);
					}
				}

				// 回到页面
				response.sendRedirect("/day10/cookie/product.jsp");
			}

			-CookieDemo3.java
				/**
				 *清空浏览记录
				 */
				public void doGet(HttpServletRequest request, HttpServletResponse response)
						throws ServletException, IOException {
						Cookie cookie = new Cookie("history","");
						cookie.setMaxAge(0);
						cookie.setPath("/");
						response.addCookie(cookie);
						response.sendRedirect("/day10/cookie/product.jsp");
				}
			
			-product.jsp
			<body>
				<img alt="1" src="/day10/img/1.jpg" />
				<a href="/day10/CookieDemo2?id=1" />手电
				</a>
				<img alt="2" src="/day10/img/2.jpg" />
				<a href="/day10/CookieDemo2?id=2" />手机
				</a>
				<img alt="3" src="/day10/img/3.jpg" />
				<a href="/day10/CookieDemo2?id=3" />电视
				</a>
				<img alt="4" src="/day10/img/4.jpg" />
				<a href="/day10/CookieDemo2?id=4" />冰箱
				</a>

				<a href="/day10/CookieDemo3">清空浏览记录</a>


				<h1>浏览记录</h1>
				<%
					//得到所有的cookie
					Cookie[] cookies = request.getCookies();

					//判断Cookie是否有名称
					Cookie cookie = MyCookieUtils.findCookie(cookies, "history");
					if (cookie == null) {
						//没有任何浏览信息
				%>
				<h1>没有任何浏览信息</h1>
				<%
					} else {
						//得到cookie里面的值
						String values = cookie.getValue();

						String[] ids = values.split(",");
						for (String id1 : ids) {
							int id = Integer.parseInt(id1);
							String[] names = { "手电", "手机", "电视", "冰箱" };
							String name = names[id - 1];
				%>
				<h3>
					<img src="/day10/img/<%=id%>.jpg" /><%=name%></h3>
				<%
					}
					}
				%>
			</body>


			-MyCookieUtils.java
			public class MyCookieUtils {

				// 判断Cookie是否有这个名称的cookie
				public static Cookie findCookie(Cookie[] cookies, String name) {
					if (cookies == null) {
						return null;
					}
					for (Cookie cookie : cookies) {
						if (cookie.getName().equals(name)) {
							return cookie;
						}
					}
					return null;
				}

				// 核查id是否存在
				public static boolean checkID(String[] ids, String id) {
					for (int i = 0; i < ids.length; i++) {
						if (ids[i].equals(id)) {
							return true;
						}
					}
					return false;
				}
			}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值