Servlet和JSP读书笔记(三)之Cookie

一. 浏览器和服务器之间通信的简单介绍引出Cookie和Session(只是简单的简介,不包含协议方面的知识)

  1.当我们在浏览器中输入一个地址后,回车后就可以看到浏览器给我们展示的漂亮页面。在这个过程中浏览器和服务器都做了什么呢?下面的解释只是浏览器与服务器之间

通信的最简单的形式,也称之为一次会话。

     ① 首先我们在地址栏上输入我们想要打开的网址,按下回车。这样一个请求就由浏览器发往服务器。

     ② 服务器的网络设备接收到数据后,在传向服务器软件。

       ③ 服务软件得到请求后,进行一系列逻辑处理,然后生成响应并发向浏览器。  

       ④ 响应通过服务器的网络设备,通过网线传向客户端的网络设备。

⑤ 客户端的网络设备将响应解析,然后传给浏览器软件,浏览器在将响应解析,这样我们就在浏览器上看到了想要看到的网页。

  2. web语言HTTP 是无状态的,所以在服务器处理完客户的请求,并收到客户的应答后,立即就断开与客户端的连接。但是,我们访问一个网站的时候并不是只做一件事,而是

要做好多事情,然而这种无状态的连接让服务器无法识别后续我们发出的请求和前一个请求是同一个人出发的,或者说当有很多人在访问同一个网站时,无法识别谁是谁。因此就出

现了Cookie和Session这两个技术。这两个技术就是保持客户端和服务器会话过程的两个技术。

    Cookies具体是如何实现的呢?当你在浏览网站的时候,Web服务器会先发送一些数据放在你的计算机上,这个数据就叫Cookie。Cookie 会把你在网站上所打的文字或是

一些选择都记录下来。当下次你再访问同一个网站,Web服务器会先看看有没有它上次留下的Cookies资料,有的话,就会依据Cookie里的内容来判断使用者,送出特定的网页内

容给你。因此Cookies是一种客户端技术,它存放在客户端。

    Session是另一种记录客户状态的机制。服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服

务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。

Session是一种服务器端技术,它存放在服务器端。

二.Cookie简介

  Cookie是网站为了辨别用户身份、进行session跟踪而以键值对(key/value)的形式储存在用户本地终端上的数据。

  Cookie是由服务器端生成,发送给浏览器,浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设

置为启用cookie)。这样服务器可以知道该用户是否是合法用户以及是否需要重新登录等,服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。

三.  Java里的Cookie 就是Servlet API 里提供的 javax.servlet.http.Cookie

  1. Cookies的具体信息为:public class Cookie extends java.lang.Objectimplements java.lang.Cloneable

  2. 主要的方法

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

     构造函数,实例化一个Cookie,传入键(name)和值(value)。

      ② public java.lang.String getName()

          获取Cookie的名字。

    ③ public java.lang.String getValue()

      获取Cookie的值。

      public void setValue(java.lang.String newValue)

      设置Cookie的值

    ④ public void setMaxAge(int expiry)

      设置Cookie的最大保存时间,即cookie的有效期,当服务器给浏览器回送一个cookie时,如果在服务器端没有调用setMaxAge方法设置cookie的有效期,

      那么cookie的有效期只在一次会话过程中有效,用户打开浏览器,访问某一网站,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一次会话。

      当用户关闭浏览器,会话就结束了,此时cookie就会失效。

        public int getMaxAge()

      获取Cookies的有效期

    ⑥ public void setPath(java.lang.String uri) 

      设置cookie的有效路径,比如把cookie的有效路径设置为"/abc",那么浏览器访问"abc"目录下的web资源时,都会带上cookie。

      如果把cookie的有效路径设置为"/abc/abcd",那么浏览器只有在访问"abc"目录下的"abcd"这个目录里面的web资源时才会带上cookie一起访问。

     public java.lang.String getPath()

        得到cookie的有效路径

    ⑦ public void setDomain(java.lang.String pattern)

       设置cookie的有效域

     public java.lang.String getDomain()

      得到cookie的有效域

   3.   public interface HttpServletRequest extends ServletRequest 这个接口中有操作Cookie的方法

     public Cookie[] getCookies()

      获取Cookie实例

   4.  public interface HttpServletResponse extends ServletResponse 这个接口同样有操作Cookie的方法

      public void addCookie(Cookie cookie)

     给响应添加Cookie

四. Cookie小实例1____服务器端不设置Cookie过期时间

package com.hjj.servlet.three;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name="testCookies",urlPatterns="/testCookies")

public class TestCookies extends HttpServlet{

    protected void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException{
        response.setContentType("text/html");
        response.setCharacterEncoding("UTF-8");
        Cookie[] cookies = request.getCookies(); //第一次访问,结果为空
        PrintWriter pw = response.getWriter();
        if(cookies == null){
            pw.println("您好,您是第一次访问该网站。");
            pw.println("我们会将cookie对象添加到response对象中,这样服务器在输出response对象中的内容时就会把cookie也输出到客户端浏览器");

            //如果是第一次访问该网站,则创建Cookie对象,并把它添加到响应中。这样返回给浏览器的响应中就会带有Cookie
            Cookie cookie = new Cookie("lastAccessTime",System.currentTimeMillis()+"");
            response.addCookie(cookie);

        }else{
            pw.print("您好,您不是第一次访问该网站。上次访问网站的时间是:");
            for(Cookie cookie: cookies){
                //拿到cookie的名字
                String name = cookie.getName();
                if(name.equals("lastAccessTime")){

                    //拿到cookie的值
                    String value = cookie.getValue();

                    //把String类型的值转化为时间类型,在转化会String类型,即把 "1234567"这样的String转化为"2016-2-2 2:02:02"这样String类型
                    String time = new SimpleDateFormat("yyyy-MM-dd HH:mm").format(new Date(Long.parseLong(value)));

                    pw.println(time);
                }

            }
        }

    }

    protected void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException{
        this.doGet(request, response);
    }

}

    1.  第一次在浏览器中输入 http://localhost:8080/one/testCookies

      页面显示:

      请求和响应为:

      

    2.  再次刷新浏览器

      页面显示:

        

        您好,您不是第一次访问该网站。第一次访问网站的时间是:2016-04-30 17:16

      请求和响应为:

      

    3.   1和2两个实验在服务器端没有对cookie的过期时间做设置。因此当你做完前两个试验后,关闭浏览器,此时Cookie已经失效。再次打开浏览器,

      然后重新请求 http://localhost:8080/one/testCookies 就和实验1的结果一样,再次刷新就和实验2的结果一样。 

五. Cookie小实例1____服务器端手动设置Cookie过期时间 

    

package com.hjj.servlet.three;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(urlPatterns="/testSetMaxAge")
public class TestSetMaxAge extends HttpServlet{
    protected void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException{
        response.setContentType("text/html");
        response.setCharacterEncoding("UTF-8");
        Cookie[] cookies = request.getCookies(); //第一次访问,结果为空
        PrintWriter pw = response.getWriter();

        if(cookies == null){
            pw.println("第一次访问该网站");
            Cookie cookie = new Cookie("lastAccessTime",System.currentTimeMillis()+"");
            int time = cookie.getMaxAge();
            pw.println("默认的Cookie过期时间为:"+time);
            //设置Cookies过期时间为24小时,也就是一天
            pw.println("在服务器端手动对Cookies过期时间进行设置");
            cookie.setMaxAge(86400);
            pw.println("设置之后Cookie的过期时间为:"+cookie.getMaxAge());
            response.addCookie(cookie);

        }else{
            pw.print("不是第一次访问该网站。上次访问网站的时间是:");
            for(Cookie cookie: cookies){
                //拿到cookie的名字
                String name = cookie.getName();

                if(name.equals("lastAccessTime")){
                    String value = cookie.getValue();
                    String time = new SimpleDateFormat("yyyy-MM-dd HH:mm").format(new Date(Long.parseLong(value)));
                    pw.println(time);
                }

            }
        }

    }

    protected void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException{
        this.doGet(request, response);
    }
}

    1.  第一次请求浏览器输入:http://localhost:8080/one/testSetMaxAge

      页面显示:

      请求和响应为:

            响应头

    2. 刷新页面

     页面显示:

              

请求和响应为:

      

    

    3. 关闭浏览器,然后再次打开浏览器重新请求,因为设置了Cookie的过期时间为24小时,因此再次访问之前的Cookie依然有效。

    页面显示如下:

请求和响应为:

六.  Cookies小结

  1. 一个Cookie是以键值对的形式存在的,设置一个Cookie必须包含name和value。
  2. 一个网站可以给一个浏览器发送多个Cookie,一个浏览器也可以存储多个网站提供的Cookie。
  3. 浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
  4. 如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。

七. 删除Cooike

  

package com.hjj.servlet.three;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(urlPatterns="/testDeleteCookie")
public class TestDeleteCookie extends HttpServlet {
    protected void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException{
        response.setContentType("text/html");
        response.setCharacterEncoding("UTF-8");
        Cookie[] cookies = request.getCookies(); //第一次访问,结果为空
        PrintWriter pw = response.getWriter();
        Cookie cookie = new Cookie("lastAccessTime",System.currentTimeMillis()+"");
        //删除cookie的方法
        cookie.setMaxAge(0);
        response.addCookie(cookie);
        pw.print("我删除了cookie");

    }

    protected void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException{
        this.doGet(request, response);
    }
}

    1. 浏览器请求:http://localhost:8080/one/testDeleteCookie

      页面显示:

        

    请求和响应为:

      

  2.  之后每一次刷新页面,服务器返回的响应中都带有Set-Cookie。

    

时间: 2024-08-06 20:13:38

Servlet和JSP读书笔记(三)之Cookie的相关文章

《大型网站技术架构》读书笔记三:大型网站核心架构要素

一.性能—响应时间决定用户 (1)浏览器端: ①浏览器缓存: ②使用页面压缩: PS:Gzip压缩效率非常高,通常可以达到70%的压缩率,也就是说,如果你的网页有30K,压缩之后就变成了9K左右.想要启用Gzip压缩,提高浏览速度,可以浏览这篇文章:http://www.chinaz.com/web/2012/1017/278682.shtml ③合理布局页面: CSS:把样式表置于顶部:避免使用CSS表达式(expression_r):使用外部JavaScript和CSS:削减JavaScri

《你必须知道的.NET》读书笔记三:体验OO之美

一.依赖也是哲学 (1)本质诠释:"不要调用我们,我们会调用你" (2)依赖和耦合: ①无依赖,无耦合: ②单向依赖,耦合度不高: ③双向依赖,耦合度较高: (3)设计的目标:高内聚,低耦合. ①低耦合:实现最简单的依赖关系,尽可能地减少类与类.模块与模块.层次与层次.系统与系统之间的联系: ②高内聚:一方面代表了职责的统一管理,一方面又代表了关系的有效隔离: (4)控制反转(IoC):代码的控制器交由系统控制而不是在代码内部,消除组件或模块间的直接依赖: (5)依赖注入(DI): ①

《世界是数字的》读书笔记 三

<世界是数字的>读书笔记 三 第六章 软件系统 操作系统是软件中的基础层,他负责管理计算机硬件,并为其他被称作应用程序的程序运行提供支持. 6.1操作系统 操作系统控制和分配计算机资源.首先,他负责管理CPU,调度和协调当前运行的程序.操作系统通常都需要管理数十个同时运行的进程或任务. 其次,操作系统管理RAM.他把程序加载到内存中以便执行指令. 最后,操作系统管理和协调外接设备的活动. 6.2操作系统怎么工作 计算机启动时首先要加载代码,加载的过程中还要检查硬件,比如哪些设备已经接入电脑,,

悟道—位IT高管20年的职场心经(读书笔记三)

悟道--一位IT高管20年的职场心经 第三章 世事洞明皆学问 职场就是你的大半个世界 是你一辈子也读不完的一大本书 想明白一个道理, 看明白一件事儿, 你就向成功迈进了一步. 1.1  "四行"说 四行是指: 第一,  你自己得行.自己的基础的能力是必须的,得靠自己学习. 第二,  得有人说你行.需要有伯乐,实际上是你得有一个自己的圈子,并且这些人都人认同你. 第三,  说你行的人得行.自己周围的圈子,里面也必须有牛人,只有在牛人的范围内,才能突显你自己的才能. 第四,  你身子骨得行

《R实战》读书笔记三

第二章  创建数据集 本章概要 1探索R数据结构 2使用数据编辑器 3数据导入 4数据集标注 本章所介绍内容概括如下. 两个方面的内容. 方面一:R数据结构 方面二:进入数据或者导入数据到数据结构 理解数据集 一个数据集通常由一个表格组合而成,行表示观测,列表示变量.病人的数据集如表1所示. 表1 病人数据集 数据集能够反映数据结构.数据类型和内容. 数据结构 R数据结构如图2所示. 图2:R数据结构 数据结构即数据的组织方式,R数据结构包括向量.矩阵.数组.数据框和列表等. R向量 R向量是一

Struts2技术内幕 读书笔记三 表示层的困惑

表示层能有什么疑惑?很简单,我们暂时忘记所有的框架,就写一个注册的servlet来看看. index.jsp <form id="form1" name="form1" method="post" action="loginServlet"> <table width="357" border="0" align="center"> <t

《淘宝技术这十年》读书笔记 (三). 创造技术TFS和Tair

前面两篇文章介绍了淘宝的发展历程和Java时代的变迁: <淘宝技术这十年>读书笔记 (一).淘宝网技术简介及来源 <淘宝技术这十年>读书笔记 (二).Java时代的脱胎换骨和坚若磐石 马云说过"创新不是为了与对手竞争,而是跟明天竞争",所以这篇文章讲述淘宝的创新技术TFS和Tair及创新的产品. 该篇文章不仅仅对在读大学生非常有所帮助,因为你能从文章中看到很多你需要学习的知识,不仅仅包括数据库.计算机网络.操作系统.数据结构等基础课程:还根据时代的技术变迁讲述了

《算法导论》读书笔记(三)

本章介绍了快速排序及其算法分析,快速排序采用的是分治算法思想,对包含n个数的输入数组,最坏情况下运行时间为θ(n^2),但是平均性能相当好,期望的运行时间为θ(nlgn).另外快速排序能够就地排序(我理解是不需要引入额外的辅助空间,每次划分能确定一个元素的具体位置),在虚拟环境中能很好的工作. 1.快速排序的描述 快速排序算法采用的分治算法,因此对一个子数组A[p-r]进行快速排序的三个步骤为: (1)分解:数组A[p...r]被划分为两个(可能为空)子数组A[p...q-1]和A[q+1...

软件需求模式 读书笔记三

通过这一个月的阅读,我终于读完了<软件需求模模式>这本书,前两个读书笔记已经把这本书的几种模式介绍了,之前有基础需求模式,信息需求模式,数据实体需求模式,用户功能需求模式.这次介绍的是性能需求模式,适应性需求模式,访问控制需求模式和商业需求模式. 性能需求模式包括五种的性能的需求模式:影响时间(系统需要多少时间完成一个请求).动态容量(系统能够同时处理多少件事).吞吐量(系统处理时间的速率).静态容量(系统可以保存多少某种类型烦的实体)和可用性(什么时候系统对用户是可用的,以及多么可靠). 当