Cookie

一会话跟踪技术


1.1什么是会话

        会话,简单来理解的话,可以理解成客户端与服务器的一次会晤,其中包括多级请求和转发。再简单一点说的话,就是从打开浏览器访问服务器上的资源到关闭浏览器的这个过程,我们称之为会话。从用户发起的第一个请求开始,到用户关闭浏览器,会话结束了。


1.2什么是会话跟踪技术

        什么是会话跟踪技术呢?就是我们在一个会话的多次请求中如何共享数据?


1.3用Cookie或是Session完成会话跟踪技术

        我们知道HTTP协议是无状态协议,也就是对每一次请求来说都是独立的请求,无法记住上一次的请求状态。但THHP协议中可以使用Cookie来完成会话跟踪技术。

        在javaweb中,可以用Session来完成会话跟踪技术,Session底层依赖Cookie技术。


二Cookie概述


2.1什么是Cookie

        Cookie翻译成中文就是小甜点,小饼干的意思。在HTTP中它表示服务器送给客服端浏览器的小甜点。Cookie就是一个键一个值构成的。随着服务器的响应被发送到浏览器,然后浏览器会把Cookie保存起来,当下一次访问服务器的时候再带给服务器。


2.2Cookie规范

        *每个Cookie的上限为4kb

        *一个服务器最多在客服端保存20个Cookie

        *一个浏览器最多可以保存300个Cookie

        上面的规范是HTTP的规范,但现实情况是,由于浏览器之间的竞争太激烈了,所有很多浏览器都没有很好的遵守这些规范,比如说,允许每个Cookie的大小为8kb,浏览器可以保持500个Cookie啊等等之类的,不过请你放心的是,就是浏览器能保存500个Cookie,也不会占你很多内存的。

        特别要注意的是:Cookie不能跨浏览器使用,比如说,你用IE浏览器访问服务器,然后服务器把Cookie发给IE浏览器,然后IE把这些Cookie保存起来,然后你用谷歌浏览器去访问服务器,不可能把保存在IE中的Cookie带到服务器去的。


2.3Cookie与HTTP头

        Cookie是通过HTTP响应和请求头在浏览器和服务器之间传递的。

                *****Cookie: 请求头,客服端发送给服务器端;

                格式:Cookie:a=A;b=B.即多个Cookie用分号隔开

                *****Set-Cookie:响应头,服务器向客服端发送

                格式:Set-Cookie: a=A

                           Set-Cookie:b=B


2.4Cookie的覆盖

        如果服务端发送重复的Cookie,那么会覆盖原来的Cookie,比如说第一次请求服务器发回的Set-Cookie:a=A,第二次请求服务器发回的是set-Cookie:a=AA,那么浏览器只会保存一个Cookie即a=AA.


三Cookie的生命


3.1什么是Cookie的生命

        Cookie中不仅有键和值,Cookie也有生命,所谓Cookie的生命,是指,Cookie可以存在多久。

        可以通过setMaxAge(int)来设置Cookie的有效时间

                *****cookie.setMaxAge(-1),Cookie的maxAge属性的默认值是-1,表示只在浏览器来存活,也就是说,一旦浏览器关闭了,Cookie也叫消失了。

                *****cookie.setMaxAge(1 * 60 * 60),表示Cookie可以存在一个小时,当Cookie的maxAge属性的值大于0时,浏览器就会把Cookie保存到本地硬盘上,这样就算浏览器被关闭了,下次开启浏览器后,一样可以使用Cookie。

                *****cookie.setMaxAge(0),如果Cookie的属性maxAge的值被设置为0,这是一个介于-1与大于0之间的数,它表示此Cookie作废,也就是删除Cookie,不管这个Cookie是在浏览器中还是被保存在硬盘中。


3.2案例:显示上次的访问时间

response.setContentType("text/html;charset=UTF-8");
		Cookie cookie = new Cookie("lastTime", new Date().toString());
		cookie.setMaxAge(60*60);
		response.addCookie(cookie);
		
		Cookie[] cookies = request.getCookies();
		String s = "这是您第一次访问!!!";
		if(cookies != null){
			for (Cookie cookie2 : cookies) {
				if(cookie2.getName().equals("lastTime")){
					s = "您上次的访问时间是:" + cookie2.getValue();
				}
			}
		}
		response.getWriter().write(s);


四Cookie的Path


4.1什么是Cookie的路径

        现在比如说有个web项目A,它已经向浏览器发送了10个Cookie,也就是说,以后每次访问项目A的时候,都会把这10个Cookie给带上,但假如说,现在访问的Servlet只需要其中的一个Cookie,如果我们没有设置Cookie的路径,就会把10个Cookie都带上,但其中九个是多余的,也是说浏览器会把多余的Cookie带到服务器去。

        可以通过Cookie的path来给浏览器指定,在访问什么资源时,把什么Cooker带上。


4.2设置Cookie的路径

        设置Cookie的路径,可以使用setPath()方法,例如:cookie.setPath("/AServlet");

        如果没有设置Cookie的路径,则默认的值为当前访问资源的路径

        比如说,当前访问的资源的路径为:

                *****http://localhost:8080/javaee/Aservlet.则此时Cookie的路径为:/javaee

                *****http://localhost:8080/javaee/servlet/Bservlet,则此时Cookie的路径为:/javaee/servlet

                *****http://localhost:8080/javaee/jsp/CServlet,则此时Cookie的路径为:/javaee/jsp


五Cookie中保存中文

        Cookie中键和值都不能使用中文,如果要只用中文的要使用URL进行编码,然后把编码后的中文放在Cookie中。

        代码示例:

        向客服端响应中添加Cookie

String key = "姓名";
		String value = "小明"; 
		key = URLEncoder.encode(key, "UTF-8");
		value = URLEncoder.encode(value, "UTF-8");
		Cookie cookie = new Cookie(key, value);
		cookie.setMaxAge(1 * 60 * 60);
		response.addCookie(cookie);
        从客服端请求中Cookie

response.setContentType("text/html;charset=UTF-8");
		Cookie[] cookies = request.getCookies();
		for (Cookie cookie : cookies) {
			String key = URLDecoder.decode(cookie.getName(), "UTF-8");
			String value = URLDecoder.decode(cookie.getValue(), "UTF-8");
			String s = key + ":" + value;
			response.getWriter().write(s);
		}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值