Cookie对象——什么是Cookie、Cookie API

1.会话概述:

1.当用户通过浏览器访问Web应用时,通常情况下,服务器需要对用户的状态进行跟踪,在Web开发中,服务器跟踪用户信息的技术称为会话技术。
2.在客户端与服务器端交互的过程中也会产生一些数据。例如用户甲和已,分别登录了购物网站。甲购买了一个手机,已购买了一个iPad。当这两个用户结账时Web服务器需要对用户甲和乙的信息分别进行保存。
3.HttpServletRequest对象和ServletContext对象都可以分别对数据进行保存,但是这两个对象都不可用来保存会话数据,具体原因如下:
(1)客户端请求W0b服务器时,针对每次HTTP请求,Web服务器都会创建一个HttpServletRequest对象,该对象只能保存本次请求所传递的数据。由于购买和结账是两个不同的请求,因此,在发送结账请求时,之前购买请求中的数据将会丢失

(2)使用ServletContext对象保存数据时,由于同一个Web应用共享的是同一个ServletContext对象,因此,当用户在发送结账请求时,由于无法区分那些商品是哪个用户购买的,而会将该购物网站中所有的商品进行结算。

2.什么是Cookie

在现实生活中,当顾客在购物时,商城经常会赠送顾客一张会员卡,卡上记录用户的个人信息(姓名,手机号等)、消费额度和积分额度等。顾客一旦接受了会员卡,以后每次光临该商场时,都可以使用这张会员卡,商场也将根据会员卡上的消费记录计算会员的优惠额度和累加积分。在web应用中,Cookie的功能类似于这张会员卡,当用户通过浏览器访问web服务器时,**服务器会给客户端发送一些信息,这些信息都保存在Cookie中。**这样,当该浏览器再次访问服务器时,都会在请求头中将Cookie发送给服务器,方便服务器对浏览器做出正确的响应。
服务器向客户端发送Cookie时,会在HTTP响应头字段中增加Set-Cookie响应头字段(此功能由服务器自主完成)。Set-Cookie头字段中设置的Cookie遵循以下语法格式

Set-Cookie: user=wang; Path=/;

在上述示例中,user表示Cookie的名称,wang表示Cookie的值,Path表示Cookie的属性。需要注意的是,Cookie必须以键值对的形式存在,其属性可以有多个,但这些属性之间必须用分号和空格分隔。

Cookie在浏览器和服务器之间的传输过程:
在这里插入图片描述
说明:
用户第一次访问服务器时,服务器会在响应消息中增加Set-Cookie头字段,将用户信息以Cookie的形式发送给浏览器。一旦用户浏览器接受了服务器发送的Cookie信息,就会将它保存的浏览器的缓冲区中。这样,当浏览器后续访问该服务器时,都会在请求消息中将用户信息以Cookie的形式发送给Web服务器,从而使服务器端分辨出当前请求是由哪个用户发出的。

3.Cookie API

为了封装Cookie信息,在Servlet API中提供了一个javax.servlet.http.Cookie类,该类包装了生成Cookie信息和提取Cookie信息各个属性的方法。

1.Cookie的构造方法

Cookie类有且仅有一个构造方法,具体语法如下:

public Cookie(java.lang.String name,java.lang.String value)

其中参数name用于指定Cooie名称,value用于指定Cookie的值。需要注意的是,Cookie一旦创建,它的名称就不能更改,Cookie的值可以为任何值,创建后允许被修改。

2.Cookie类的常用方法

Cookie类的常用方法:

方法声明功能描述
public String getName()该方法返回 cookie 的名称。名称在创建后不能改变。
public void setValue(String newValue)该方法设置与 cookie 关联的新值。
public String getValue()该方法获取与 cookie 关联的值。
public void setMaxAge(int expiry)该方法设置 cookie 过期的时间(以秒为单位)。如果不这样设置,cookie 只会在当前 session 会话中持续有效。如果为负整数,浏览器关闭时Cookie信息删除,如果为0时,则通知浏览器立即删除这个Cookie信息
public int getMaxAge()该方法返回 cookie 的最大生存周期(在客户机上保持的有效秒数),默认情况下,-1 表示 cookie 将持续下去,直到浏览器关闭。
public void setPath(String uri)该方法设置 cookie 适用的路径。如果您不指定路径,与当前页面相同目录下的(包括子目录下的)所有 URL 都会返回 cookie
public String getPath()该方法获取 cookie 适用的路径。
public void setDomain(String pattern)该方法设置 cookie 适用的域,例如 runoob.com。
public String getDomain()该方法获取 cookie 适用的域,例如 runoob.com。
public void setVersion(int v)用于设置Cookie项采用的协议版本
public int getVersion()返回Cookie项采用的协议版本
public void setComment(String purpose)设置cookie的注释。该注释在浏览器向用户呈现 cookie 时非常有用。
public String getComment()获取 cookie 的注释,如果 cookie 没有注释则返回 null。
public void setSecure(boolean flag)该方法设置布尔值,表示 cookie 是否应该只在加密的(即 SSL)连接上发送(使用安全协议传送)。
public boolean getSecure( )返回该Cookie项是否只能使用安全的协议传送

4.案例-显示用户上次访问时间

创建Servlet类LastAccessServlet

public class LastAccessServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		String lastAccessTime=null;
		//获取所有cookie
		Cookie[] cks=request.getCookies();
		//遍历cks数组
		for(int i=0;cks!=null&&i<cks.length;i++) {
			if("lastAccess".equals(cks[i].getName())) {
				lastAccessTime=cks[i].getValue();
				break;
			}
		}
		//判断是否存在cookie=lastAccess
		if(lastAccessTime==null) {
			response.getWriter().write("您是首次访问本站!");
		}else{
			response.getWriter().write("您上次访问的时间是:"+lastAccessTime);
		}
		
		//创建cookie,将当前时间作为cookie的值发送给客户端(浏览器)
		String currentTime=new SimpleDateFormat("yyyy-mm-dd hh:mm:ss").format(new Date());
		
		//存着这一个值,当下次访问时检索到lastAccess则表明不是第一次访问,并且存下上次最后访问的时间
		Cookie cookie=new Cookie("lastAccess", currentTime);
		//发送cookie
		response.addCookie(cookie);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

运行结果:

刚访问:
在这里插入图片描述
刷新页面:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏至xz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值