Servlet_8th_Cookie

一、保存C/S间状态的两种方式
Session:(服务器端)
1)适合保存大量的数据
2)安全
3)效率高
4)Session跟踪机制中需要cookie来保存和传递sessionId

Cookie:(客户端)
1)不适合保存大量的数据。
2)不安全。
3)效率低。


二、Cookie

1)Cookie是服务器写在客户端本地的用来保存用户状态的一种机制。

2)为什么需要cookie?

客户端访问服务器,建立一个请求连接,如一个购买商品1的请求,则服务器会返回给客户端一个购买页面,然后服务器和客户端之间的连接就断掉了,这是因为HTTP协议具有无连接性。如果再去购买商品2,需要再访问服务器一次,相当于再次建立了新的连接。最后在结算的时候,服务器根本不知道客户端买了哪些东西。

总结:
HTTP协议的无连接性要求出现一种保存C/S间状态的机制,这种机制就是cookies。
也就是说用户买一个商品,服务器把商品记录在客户端本地。

三、如何实现cookies:
1)服务器可以向客户端写内容。
2)只能是文本内容。(不能是一个可执行程序之类的数据,危及客户端安全)
3)客户端可以阻止服务器写入。
4)服务器A只能拿服务器A写入的内容,不能拿服务器B写入的内容。

总结:
cookies就是服务器写入到客户端的文本文件,与特定客户相关。

三、cookie的格式
cookies以“名-值”对的形式保存数据。

四、cookie的生命周期
举例:
package com.hpe.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

@WebServlet("/SetCookies")
public class SetCookies extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
			throws ServletException, IOException {
		
		for(int i=0; i<3; i++) {
			//new了一个cookie
			Cookie cookie = new Cookie("Session-Cookies-" + i, "Cookies-Value-S" + i);
			//没有设置生命周期,只要窗口还开着,cookie就活着,窗口一关闭,cookie就没了
			//将cookie写到客户端本地
			resp.addCookie(cookie);
			
			//new了一个cookie
			cookie = new Cookie("Persistent-Cookies-" + i, "Cookies-P" + i);
			//设置生命周期为3600秒
			cookie.setMaxAge(3600);
			//cookie被写到客户端本地,1小时后,文件就自动删除。
			resp.addCookie(cookie);
		}
		
		resp.setContentType("text/html;charset=UTF-8");
		resp.getWriter().println(
			  "<html>"
			+ "<head>"
			+ 	"<meta charset=\"UTF-8\">"
			+	"<title>设置cookie</title>"
			+ "</head>"
			+ "<body bgcolor=\"#FDF5E6\" >"
			+   "<h1 align=\"center\">"
			+			"Setting Cookies"	
			+   "</h1>"
			+   "There are six cookies associated with this page."
			+   "To see them, visit the "
			+	"<a href=\"ShowCookies\">"
			+		"<code>ShowCokies</code> servlet"	
			+	"</a>."
			+	"<p>"
			+		"Three of the cookies are associated only with the "
			+		"current session, while three are persistent."
			+		"Quit the browser, restart, and return to the " 
			+		"<code>ShowCookies</code> servlet to verify that "
			+		"the three long-lived ones persist across sessions."
			+	"</p>"
			+ "</body>"
			+ "</html>"
		);
	}
}


总结:
①在服务器端,通过new Cookie()来创建一个cookie对象。
②在服务器端,通过cookie.setMaxAge()的方法来设置cookie的存活时间。
③在服务器端,通过resp.addCookie()来将指定cookie写入到客户端本地。

后面会去找本地的cookie文件,但别的浏览器的cookie存放位置不太好找,方便起见,使用IE浏览器来演示:
用IE浏览器访问SetCookies,页面效果:


点击超链接:


ShowCookies.java:
package com.hpe.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

@WebServlet("/ShowCookies")
public class ShowCookies extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		resp.setCharacterEncoding("UTF-8");
		resp.getWriter().println(
			 "<html>"
			+ "<head>"
			+	 "<meta charset=\"UTF-8\">"
			+	 "<title>获取客户端</title>"
			+ "</head>"
			+ "<body bgcolor=\"#FDF5E6\" >"
			+	"<h1 align=\"center\">Active Cookies</h1>"
			+		"<table border=\"1\" align=\"center\">"
			+		"<tr bgcolor=\"#FFAD00\">"
			+		"<th>Cookies Name</th>"
			+		"<th>Cookies Value</th>"		
		);
		
		Cookie[] cookies = req.getCookies();
		if(cookies != null) {
			Cookie cookie;
			for(int i=0; i<cookies.length; i++) {
				cookie = cookies[i];
				resp.getWriter().println(
					  "<tr><td>" + cookie.getName() + "</td>"
					+ "<td>" + cookie.getValue() + "</td></tr>"
				);
			}
		}
		
		resp.getWriter().println(
			    "</table>"		
			+ "</body>"
			+ "</html>"
		);
	}
}
总结:
①在服务器端,通过req.getCookies()来返回一个Cookie数组,即从客户端读取cookie对象。
②使用cookie的getName和getValue方法来获取cookie的名字和值。

cookie文件在哪里:
对于Win10环境下的IE浏览器,其cookies文件存放在C:\Users\{用户名,我的是fuchs}\AppData\Local\Microsoft\Windows\INetCookies目录下,会生成一个cookies文件:


其内容如下所示:
Persistent-Cookies-0
Cookies-Value-P0
localhost/TestServlet/
17408
292404096
30586699
2956596068
30586690
*
Persistent-Cookies-1
Cookies-Value-P1
localhost/TestServlet/
17408
292404096
30586699
2956621114
30586690
*
Persistent-Cookies-2
Cookies-Value-P2
localhost/TestServlet/
17408
292404096
30586699
2956641182
30586690
*

可以看到被设置了存活周期的3个Persistent-Cookies已经被写到了该文件中,还有3个没有被设置存活周期的Session-Cookies在哪儿呢?

这3个Session-Cookies保存在浏览器中,只要用户发出请求而生成的、未设置存活周期的cookie对象所在的这个窗口不关,该cookie就存在。

如果不去请求SetCookies,另外再开一个窗口,并直接访问ShowCookies,页面效果如下:

总结:
说明IE浏览器的多个窗口之间的cookie是共享的。

再开一个Chrome窗口:

总结:
说明浏览器不能访问其他浏览器的cookie。


总结:
①cookie分为两种,一种是通过cookie.setMaxAge(seconds)设置了存活周期的cookie,一种是没有设置存活周期的cookie。
②通过resp.addCookie(cookie)将创建的cookie对象放在客户端。
③设置了存活周期的cookie被存放在客户端的硬盘上以文件形式存储,存活周期一过,cookie文件不会自动删除,但cookie已经消失。
④没有设置存活周期的cookie被存放在浏览器窗口中,相当于存放在内存中,浏览器一旦关闭,cookie自动消失。
⑤cookie消失的意思是指:req.getCookies()来返回一个Cookie数组,该数组中找不到该cookie,即在服务器看来该cookie已经不存在,但存放在客户端的cookie文件依然存在。
⑤同一个浏览器的不同窗口之间的cookie是共享的,可以互相访问。

⑥不同浏览器之间的cookie不共享。






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值