Cookie概述

Cookie学习

  • Cookie概述
    • 1)提出问题
    • 2)会话和会话状态
    • 3)如何实现有状态的会话
    • 4)Cookie机制
    • 5)Cookie的传送过程示意图
    • 6)在Servlet中使用Cookie
    • 7)Cookie的发送
    • 8)会话cookie和持久化cookie
    • 9)Cookie的读取
    • 10)具体实现

Cookie概述

1)提出问题

  • HTTP是一种无状态的协议,WEB服务器本身不能识别出那些请求是同一个浏览器发出的,浏览器的每一次请求都是完全孤立的。
  • 即使HTTP1.1支持持续连接,但当用户有一段时间没有提交请求,连接也会关闭。
  • 作为web服务器,必须能够采用一种机制来唯一的标识一个用户,同时记录该用户的状态。

问题思考: 怎么才能实现网上商店中的购物车呢:某个用户从网站的登录页面登入后,再进入购物页面购物时,负责处理购物请求的服务器程序必须知道处理上一次请求的程序所得到的用户信息?

2)会话和会话状态

  • WEB应用中的会话指的是一个客户端浏览器与WEB服务器之间连续发生的一系列请求与响应过程。
  • WEB应用中的会话状态是指WEB服务器与浏览器在会话过程中产生的状态信息,借助会话状态,WEB服务器能够把属于同一会话中的一系列请求和响应过程关联起来。

3)如何实现有状态的会话

  • WEB服务器程序要能从大量的请求消息中区分哪些请求消息属于同一个会话,既能识别出来自同一个浏览器的访问请求,这需要对浏览器对其发出的每个请求信息都进行标识;属于同一个会话中的请求信息都附带同样的标识,而属于不同会话的请求信息总是附带不同的标识号,这个标识号就称之为会话ID(SessionID)。
  • 在Servlet规范中,常用以下两种机制完成会话跟踪:
--Cookie
--Session

4)Cookie机制

  • cookie机制采用的是在客户端保持HTTP状态信息的方案;
  • Cookie是在浏览器访问WEB服务器的某个资源是,由WEB服务器在HTTP响应消息头中附带传送给浏览器的一个小文本文件;
  • 一旦WEB浏览器保存了某个Cookie,那么它在以后每次访问该WEB服务器是,都会在HTTP请求头中将这个Cookie回传给WEB服务器;
  • 底层的实现原理:WEB服务器通过在HTTP响应消息中增加Set-Cookie响应头字段将Cookie信息发送给浏览器。浏览器则通过HTTP请求消息中增加Cookieq请求头字段将Cookie传给WEB服务器;
  • 一个Cookie只能标识一种信息,它至少含有一个标识该字段的名称(NAME)和设置值(VALUE);
  • 一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie;
  • 浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。

5)Cookie的传送过程示意图

Cookie概述_第1张图片

6)在Servlet中使用Cookie

  • Servlet API中提供了一个javax.servlet.http.Cookie类来封装Cookie信息,它包含有生成Cookie信息和使用Cookie信息的各个属性的方法。
  • Cookie类的方法:
[1]构造方法:public Cookie(String name,String value)
[2]getName()方法
[3]setValue与getValue方法
[4]setMaxAge与getMaxAge方法
[5]setPath与getPath方法

  • HttpServletResponse接口中定义了一个addCookie方法,它用于在发送给浏览器的HTTP响应消息中增加一个Set-Cookie响应头信息;
  • HttpServletRequest接口中定义了一个getCookie方法,它用于从HTTP请求消息的Cookie请求头字段中读取所有的Cookie项。

7)Cookie的发送

  • 创建Cookied对象;
  • 设置最大时效;
  • 将Cookie放入到HTTP响应报头;

如果创建了一个Cookie,并将它发送到浏览器,默认情况下它是一个会话级别的Cookie,存储在浏览器的内存中,用户退出浏览器之后被删除。若希望浏览器将该Cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该Cookie。

发送Cookie需要使用HttpServletResponse的addCookie方法,将Cookie插入到一个Set-Cookie HTTP响应接头中。由于这个方法并不修改任何之前指定的Set-Cookie接头,而是创建新的接头,因此将这个方法称之为addCookie,而非setCookie

8)会话cookie和持久化cookie

  • 如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。
  • 如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后在此打开浏览器,这些cookie依然有效,直到超过设定的过期时间。
  • 存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存中的cookie,不同的浏览器有不同的处理方式。

9)Cookie的读取

  • 调用request.getCookies要获取浏览器发送来的cookie,需要调用HttpServletRequest的getCookies方法,这个调用返回Cookie对象的数组,对应由HTTP请求中Cookie头输入的值;
  • 对数组进行循环,调用每个cookie的getName方法,直到找到感兴趣的cookie为止。

10)具体实现

cookie.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" session="false" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		/* 在JavaWeb中 规范使用Cookie代表cookie */
		
		/* 1、创建一个Cookie对象 */
		//Cookie cookie=new Cookie("name","xiaoyan");
		/* 2、调用response的一个方法把cookie传给客户端 */ 
		//response.addCookie(cookie);
		
		//1、获取Cookie
		Cookie[] cookies=request.getCookies();
		if(cookies!=null&&cookies.length>0){
			for(Cookie cookie:cookies){
				//2、获取Cookie的名字和value
				out.print(cookie.getName()+":"+cookie.getValue());
				out.print("
"
); } }else{ out.print("没有一个Cookie,正在创建并返回"); /* 1、创建一个Cookie对象 */ Cookie cookie=new Cookie("name","xiaoyan"); //setMaxAge:设置Cookie的最大时效,以秒为单位,若为0 //表示立即删除该Cookie;若为负数,表示不存储该Cookie; //若为正数,表示该Cookie的存储时间。 cookie.setMaxAge(30); /* 2、调用response的一个方法把cookie传给客户端 */ response.addCookie(cookie); } %> </body> </html>

你可能感兴趣的:(笔记,javaweb,servlet,java,服务器,tomcat)