目录
1.3 Cookie详解
1.3.1 五大属性
2. session
前言: 在未发明之前,互联网是这样工作的:对于同一个网站,你每次都得登录一次,你买的东西必须得是在一次操作中完成,是不是觉得这样挺蠢的,不够人性化。当然了,也可以直接在请求上加上token,token上携带着数据(比如登录的数据),但是token得手动设置,太麻烦了,而且你不可能让普通的用户自己手动设置。正是因为有着这些缺点,人们想创造出一套能让网站记住用户信息的一种机制,这才有了cookie和session的诞生。
1. cookie
维基百科的介绍:Cookie(复数形态Cookies),又称为“小甜饼”。类型为“小型文本文件”,指某些网站为了辨别用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密)。从上面可以知道,cookie就是一个可以保存用户某些信息的工具,它可以让服务器端快速识别出客户端的身份,利用它可以实现很多人性化的功能。比如说:购物车功能,自动登录,广告的精准投放(通过cookie记录你的浏览记录)。
下面以自动登录为例简单介绍一下cookie的实现过程。你第一次登录网站时,勾选自动登录按钮后,服务器会进行以下工作:
- 创建Cookie (服务器端)
① 把你的登录信息保存到数据库,并且分配了一个唯一的cookie ID,创建Cookie对象
② 服务器端自定义Cookie对象。通过Cookie的五个属性:name,value,expires,domain,path(下面会有详细介绍)
③把Cookie对象放进response消息报头的Set-Cookie响应头里,打包成响应报文发回给客户端。
- 浏览器解析保存Cookie
④浏览器解析响应报文获取Cookie后根据Cookie的时效决定是否保存到硬盘中,如果是会话级别,不保存,用户退出浏览器之后会被消除。但是我们这里是自动登录的Cookie,肯定不能那么短命,要想保存更久,我们需要设置最大时效(maxAge)。当时效大于0,保存到硬盘中。
- 再次访问网站
⑤下一次登录该网站,网站会自动构建一个请求,该request中的Cookie字段携带着保存在硬盘的登录cookie。格式为:Cookie:name = value 。如果有多个Cookie,用分号隔开。 Cookie:name1 = value;name2 = value;name3 = value。将该请求报文发给服务器端
⑥ 服务器解析请求报文,与数据库中的cookie匹配。读取Cookie,从中获取登录的相关信息。
图片转载于csdn的Goskalrie https://blog.csdn.net/Goskalrie/article/details/51202741
Cookie有五大属性,在讲解前我们可以先写个小例子
intelllij中新建一个项目 在web
name和value是以键值对的形式书写,name是Cookie的名字,value是值;
expires是有效期,定义该Cookie在客户端的有效存活时间,在实际使用中有两种方式,一种是expires,一种是MaxAge。expires是http1.0协议中Cookie的一部分,在http1.1中被maxAge代替了。expires是设置一个时间点(比如Thu,18 Feb 2019 11:18:00 GMT),MaxAge是设置一个时间段(比如60*60 ,单位是秒)。前者以服务器的时间为准,后者我查找的是说以创建的时间为准下面是具体含义:
<0 表示当浏览器退出对话时删除该Cookie
=0 表示浏览器直接删除该Cookie
>0 表示浏览器把该Cookie保存到硬盘上,保存的时间为MaxAge秒。
默认情况下是<0
不知道你是否会有这样的疑问,一个大型的网站肯定包含很多小的界面,这些界面有可能有不同的cookie。另一种情况是一家超级大型的公司拥有多个域名,多个网站,但是这些网站需要共享cookie。那客户端怎么知道发哪个。这就需要path和domian了。path解决第一个问题,domian解决第二个问题。
domian是域名,path是路径,两个构成了URL中的一大部分,限制了cookie能被哪些url访问,换句话说指定了请求中携带着的cookie。domian决定着哪几个域共享,拿yahoo!举例,它下面会有很多子域名,包括my.yahoo.com,finance.yahoo.com,将一个cookie的domian设置为yahoo.com(path得设置为/)。这些域名就会共享这个cookie。当浏览器要访问这些子域名时,都会将该cookie写入带请求头部中。path看请求url的最后一个/,最后/到域名之间的值就是path
举个例子(下面的网址是虚构的)吧,比如A:http://www.baidu.com/photo/view/123 B:https://fanyi.baidu.com/manual/11 A的domian是baidu.com path是/photo/view ;B的domina是fanyi.baidu.com path是/manual 当浏览器浏览同一个网站不同界面时,看这些请求url包含了哪些cookie的path,有就发出去,路径中包含的cookie都得发出去,而不是只选择路径中最后一个。下图为一个例子
如果domian和path没有设定,则会使用默认值。domian的默认值是设置该cookie的网页所在的域名;path默认值为设置该cookie的网页所在的目录,特殊情况,如果url没有/,那就将path设为“/”,也就是根目录。
你可能会问,不是说就5个属性吗,怎么又多出来2个。其实这两个属性不常见,了解就好了。httpOnly的作用是,如果cookie中携带着这个属性,则 客户端无法通过js去访问cookie(包括删除 修改 读取);secure的作用是,如果cookie携带着secure属性,只有当协议是https或者其他安全协议时,该cookie才可被使用。
cookie的修改
由于cookie的特殊性,这5个属性只能修改value和expires,这样新值就会覆盖旧值。至于为什么只能修改value,其实细想一下就知道了。name作为cookie的标识,肯定是不能改的。domian和path构成“门牌号”,门牌号都没了肯定不是同一个cookie了。
cookie的删除
很简单,其他不变,将expires设定为0就好了。或者不设置,不设置默认为0
cookie的使用有两种,一种是服务端设置cookie,另一种是客户端设置cookie。这里只讲服务端设置cookie
servlet里面已经封装好cookie类,我们可以直接使用这个类创建cookie对象,构造方法中只包含两个属性 name和value,至于其他属性可以通过setXxxx()来实现。
创建一个登录cookie(这里的值如果是实际开发中使用的话都得加密,但是这里从简)
Cookie loginCookie = new Cookie("login","loginID=123456");
loginCookie.setMaxage(60*60*24); //设置存活时间为1天
login.setPath("/LoginServlet");
login.setDomian("domian.com");
login.setHttpOnly(true); //设置该cookie为安全协议下传输
login.setSecure(true);
response.addCookie(loginCookie);
2. session
单纯的讲session有点大,因为session有着多重的含义,我们这里谈论的是HttpSession。
session与cookie相反,cookie是客户端的一种保存用户信息的产物,而session是服务器端用来跟踪用户状态的产物。就好比你开了一家店,cookie是发出去的会员卡,session是店里保存会员卡卡号的产物,不过保存时间可能只有几个小时。
那我会员卡卡号信息得保存到哪呢,只有几个小时的保存时间的话这很鸡肋啊。其实session更类似于缓存,它需要占用内存,会消耗服务器的一般是保存一些与用户密切相关但是又不是很重要的东西,真正重要且需要长时间保存的都会放到数据库中。session是用来维持一段时间内客户端与服务器端的互动状态的
推荐csdn ITOYO的啸笑天的文章:https://justsee.iteye.com/blog/1570652 ps:(我是感觉以我现在没有那么多session开发经验的人还写不出关于session的博客,因此附上一些高质量的关于session的博客给大家参考一下)
从开发角度看待session:https://www.cnblogs.com/sharpxiajun/p/3395607.html 转载于博客园的用户 夏天的森林
cookie与session的对比:http://w ww.360doc.com/content/11/0706/15/3639038_131844581.shtml 转载于360doc的用户 openwudi