Cookie API和记录上次来访时间

1.什么是Cookie?

  • Cookie是一种会话技术,用千将会话过程中的数据保存到用户的浏览器中,从而使浏览器和服务器可以更好地进行数据交互

  • 在现实生活中,当顾客在购物时,商城经常会赠送顾客一张会员卡,卡上记录用户的个人信息(姓名,手机号等)、消费额度和积分额度等。顾客一旦接受了会员卡,以后每次光临该商场时,都可以使用这张会员卡,商场也将根据会员卡上的消费记录计算会员的优惠额度和累加积分。

  • 在Web应用中,Cookie的功能类似千这张会员卡,当用户通过浏览器访问Web服务器时,服务器会给客户端发送一些信息,这些信息都保存在Cookie中。这样,当该浏览器再次访问服务器时,都会在请求头中将Cookie发送给服务器,方便服务器对浏览器做出正确的响应。

 

 

2.Cookie发送方式

  • 服务器向客户端发送Cookie时,会在HTTP响应头字段中增加Set-Cookie响应头字段

  • Set-Cookie头字段中设置的Cookie遵循一定的语法格式,具体示例如下:

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

 3.Cookie传输过程

  • 当用户第一次访问服务器时,服务器会在响应消息中增加Set-Cookie头字段,将 用户信息以Cookie的形式发送给浏览器。

  • 一旦用户浏览器接受了服务器发送的Cookie信息,就会将它保存在浏览器的缓冲 区中

  • 当浏览器后续访问该服务器时,都会在请求消息中将用户信息以Cookie的形式发 送给Web服务器,从而使服务器端分辨出当前请求是由哪个用户发出的。

 4.Cookie API

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

   4.1.构造方法

  • Cookie类有且仅有一个构造方法,具体语法格式如下:
  • Cookie的构造方法中,参数name用千指定Cookie的名称,value用千指定Cookie的值。
  • 需要注意的是,Cookie一旦创建,它的名称就不能更改,他的值可为任何值,创建后允许被修改。

   4.2Cookie常用方法 

    通过Cookie的构造方法创建Cookie对象后,便可调用该类的所有方法

表中列举了Cookie类的常用方法,由千大多数方法  都比较简单,对表中比较难以理解的方法进行介绍:

1)setMaxAge(int expiry)getMaxAge()方法

  • 这两个方法用千设置和返回Cookie在浏览器上保持有效的秒数
  • 如果设置的值为一个正整数时,浏览器会将Cookie信息保存在本地硬盘中。从当前时间开始,在没有超过指定的秒数之前,这个Cookie都保持有效,并且同一台计算机上运行的该浏览器都可以使用这个Cookie信息。
  •  如果设置值为负整数时,浏览器会将Cookie信息保存在的缓存中, 当浏览器关闭时,Cookie信息会被删除。
  • 如果设置值为0时,则表示通知浏览器立即删除这个Cookie信息。默认情况下,Max-Age属性的值是-1

2)setPath(String uri)getPath()方法

  • 这两个方法是针对CookiePath属性的。
  • 如果创建的某个Cookie对象没有设置Path属性,那么该Cookie 只对当前访问路径所属的目录及其子目录有效。
  • 如果想让某个Cookie项对站点的所有目录下的访问路径都有效, 应调用Cookie对象的setPath()方法将其Path属性设置为“/”

3)setDomain(String pattern)getDomain()方法

  • 这两个方法是针对Cookiedomain属性的。domain属性是用来指定浏览器访问的域。
  • 例如,域为“hbxy.com”。那么,当设置domain属性时,其值必须以“.”开头,如domain=.hbxy.com
  • 默认情况下,domain属性的值为当前主机名,浏览器在访问当前主机下的资源时,都会将Cookie信息回送给服务器。需要注意的是,domain属性的值是不区分大小写的。

 

 

 

上代码!

1.创建类

package com.hbxy.web.c03.cookie;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;

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

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 设置服务器输出内容的编码格式为UTF-8防止乱码
        response.setContentType("text/html;charset=utf-8");
        String lastAccessTime = null;
        // 获取所有的cookie并将这些cookie存放到数组中
        Cookie[] cookies = request.getCookies();
        // 遍历cookies数组
        for (int i = 0; cookies != null && i < cookies.length; i++) {
            if ("lastAccess".equals(cookies[i].getName())) {
                // 如果cookie名称为lastAccess,则获取该cookie的值
                lastAccessTime = cookies[i].getValue();
                break;
            }
        }
        // 盘算是否存在名称为lastAccess的cookie
        if (lastAccessTime == null) {
            response.getWriter().print("你首次访问本网站!");
        } else {
            response.getWriter().print("你上次访问本网站的时间是: "
                    + URLDecoder.decode(lastAccessTime, "UTF-8"));
        }
        // 创建cookie,将当前时间作为cookie的值发送给客户端
        String currentTime = new SimpleDateFormat("yyyy- MM-dd hh:mm:ss")
                .format(new Date());
        Cookie cookie = new Cookie("lastAccess",
                URLEncoder.encode(currentTime, "UTF-8"));
            //cookie.setMaxAge(60*60); //设置cookie最大存在时间

        //发送cookie
        response.addCookie(cookie);
    }

    public void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        this.doPost(req, resp);
    }
}

2.配置web.xml

<servlet>
<servlet-name>CookieServlet</servlet-name>
<servlet-class>com.hbxy.web.c03.cookie.CookieServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CookieServlet</servlet-name>
<url-pattern>/CookieServlet</url-pattern>
</servlet-mapping>

 

3.测试

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值