JavaWeb(九)Cookie

1、提出问题

(1)HTTP协议是一种无状态的协议,WEB服务器本身不能识别出哪些请求是同一个浏览器发出的 ,浏览器的每一次请求都是完全孤立的

(2)即使 HTTP1.1 支持持续连接,但当用户有一段时间没有提交请求,连接也会关闭。

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

(4)作为 web 服务器,必须能够采用一种机制来唯一地标识一个用户,同时记录该用户的状态。

2、会话和会话状态

(1)WEB应用中的会话是指一个客户端浏览器与WEB服务器之间连续发生的一系列请求和响应过程。

(2)WEB应用的会话状态是指WEB服务器与浏览器在会话过程中产生的状态信息,借助会话状态,WEB服务器能够把属于同一会话中的一系列的请求和响应过程关联起来。

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

(1)WEB服务器端程序要能从大量的请求消息中区分出哪些请求消息属于同一个会话,即能识别出来自同一个浏览器的访问请求,这需要浏览器对其发出的每个请求消息都进行标识:属于同一个会话中的请求消息都附带同样的标识号,而属于不同会话的请求消息总是附带不同的标识号,这个标识号就称之为会话ID(SessionID)。

(2)在 Servlet 规范中,常用以下两种机制完成会话跟踪:Cookie、Session。

4、Cookie机制

(1)cookie机制采用的是在客户端保持 HTTP 状态信息的方案

(2)Cookie是在浏览器访问WEB服务器的某个资源时,由WEB服务器在HTTP响应消息头中附带传送给浏览器的一个小文本文件。

(3)一旦WEB浏览器保存了某个Cookie,那么它在以后每次访问该WEB服务器时,都会在HTTP请求头中将这个Cookie回传给WEB服务器。

(4)底层的实现原理: WEB服务器通过在HTTP响应消息中增加Set-Cookie响应头字段将Cookie信息发送给浏览器,浏览器则通过在HTTP请求消息中增加Cookie请求头字段将Cookie回传给WEB服务器。

(5)一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。

(6)一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。

(7)浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。

5、在Servlet程序中使用Cookie

(1)Servlet API中提供了一个javax.servlet.http.Cookie类来封装Cookie信息,它包含有生成Cookie信息和提取Cookie信息的各个属性的方法。

(2)Cookie类的方法:

构造方法: public Cookie(String name,String value)

getName方法

setValue与getValue方法

setMaxAge与getMaxAge方法

setPath与getPath方法

(3)HttpServletResponse接口中定义了一个addCookie方法,它用于在发送给浏览器的HTTP响应消息中增加一个Set-Cookie响应头字段。

(4)HttpServletRequest接口中定义了一个getCookies方法,它用于从HTTP请求消息的Cookie请求头字段中读取所有的Cookie项。

6、使用Cookie的案例

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

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

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

(1)创建Cookie对象

(2)将Cookie放入到HTTP响应报头

第一次请求

第二次请求

(3)修改一下代码,让它在浏览器上打印出来

(4)关闭浏览器,重新访问该页面

(5)重新加载该页面

(6)设置最大时效

setMaxAge:设置Cookie的最大时效,以秒为单位,若为0,表示立即删除该Cookie;若为负数,表示不存储该Cookie;若为正数,表示该Cookie的存储时间。

(7)关闭浏览器,重新访问两次,让setCookie成功,然后再关闭浏览器,再打开浏览器直接访问就有cookie了。

(8)一分钟过后就没有那个值了

(9)设置Cookie的作用路径

cookie.setPath(request.getContextPath());

Cookie的作用范围:可以作用当前目录和当前目录的子目录,但不能作用于当前目录的上一级目录。可以通过setPath方法来设置Cookie的作用范围,其中/代表站点的根目录,而request.getContextPath()是/JavaWeb04。

7、会话cookie和持久cookie的区别

(1)如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。

(2)如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。

(3)存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存的cookie,不同的浏览器有不同的处理方式。

原文发布于微信公众号 - Java后端生活(javaNotebook)

原文发表时间:2018-05-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏pangguoming

整合spring cloud云架构 - SSO单点登录之OAuth2.0登录认证(1)

之前写了很多关于spring cloud的文章,今天我们对OAuth2.0的整合方式做一下笔记,首先我从网上找了一些关于OAuth2.0的一些基础知识点,帮助大...

2696
来自专栏云计算教程系列

如何在Ubuntu 16.04上使用Git Hooks部署Jekyll站点

Jekyll是一个静态站点生成器,它提供了内容管理系统(CMS)的一些优点,同时避免了此类数据库驱动的站点引入的性能和安全问题。它具有“博客意识”,并包含处理日...

1533
来自专栏一个爱吃西瓜的程序员

Web前端基础【4】--HTTP标准

HTTP协议(超文本传输协议),是用于从www服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,减少网络传输。 一:HTTP请求过程 HTTP协议...

3887
来自专栏小樱的经验随笔

mount命令详解及常见问题汇总

一 、mount命令(用来挂载硬盘或镜像等) 用法:mount [-t vfstype] [-o options] device dir 1、-t vfstyp...

8905
来自专栏决胜机器学习

《Redis设计与实现》读书笔记(三十二) ——Redis事务设计与实现

《Redis设计与实现》读书笔记(三十二) ——Redis事务设计与实现 (原创内容,转载请注明来源,谢谢) 一、概述 redis的事务同数据...

3465
来自专栏土豆专栏

Java面试之Linux常用命令

原作者:https://www.cnblogs.com/yjd_hycf_space/p/7730690.html

1721
来自专栏

从I/O复用谈epoll为什么高效

上一篇文章中,谈了一些网络编程的基本概念。在现实使用中,用的最多的就是I/O复用了,无非就是select,poll,epoll 很多人提到网络就说epoll,认...

2228
来自专栏racaljk

静态库(.a)与动态库(.so)的简明介绍

gcc有很多关于静态库,动态库的选项如-l,-L,-fPIC,-shared -Wl,-soname,看着很复杂容易混淆,其实静态库和动态库都是应需而生,只要有...

1765
来自专栏Java帮帮-微信公众号-技术文章全总结

同一Tomcat不同项目如何实现session共享【面试+工作】

1844
来自专栏DeveWork

WordPress中当评论审核通过时候给评论者发邮件

如果你的WordPress 站点是开启评论审核的,那么如果能让评论者知道TA 的评论是否通过,就能进一步提升“回头率”。Comment Approved就是这么...

1985

扫码关注云+社区

领取腾讯云代金券