cookie和session学习笔记

cookie和session的区别

一、前言

Http协议是无状态的协议,一旦数据交互完毕,客户端和服务器之间的连接就会关闭,再次交互需要一个新的连接,这也是一个新的交互过程了,和之前的交互是没有关系的,总的来说,http协议是一次性的,不具备后续的操作性,例如:用户A将一个商品加入购物车以后,再次添加商品时就不是加入到用户A的购物车中,因为用户A的交互过程已经结束了,在此进行添加,服务器不知道这个还是用户A的交互操作。此时出现了会话技术,会话是跟踪web程序中常用的一种技术,用来跟踪用户的整个会话过程,保证操作的连续性。我们常用的会话跟踪技术是cookie和session.

cookie通过在客户端记录信息确定用户的身份,session通过在服务器端记录信息确认用户。

二、Cookie机制

2.1、什么是cookie

在程序中,会话跟踪是很重要的事情。理论上一个用户的所有请求操作属于一个会话,每个用户都有一个属于自己的会话。cookie能够准确的进行用户的判断,他的工作原理是:但客户端连接服务器成功后会给每个客户端端颁发一个通行证,无论那个客户端进行访问,都需要携带自己的通行证,这样服务器就可以通过这个通行证来判断客户的身份。

cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。

2.2、cookie的常用属性

处理name与value之外,cookie还有其他的常用属性,每个属性对应着getter和setter方法。

属性名描述
String name该cookie的名字。cookie一旦被创建,名称便不可改变
Object value该Cookie的值。如果值为Unicode字符,需要为字符编码。如果值为二进制数据,则需要使用BASE64编码
int maxAge该Cookie失效的时间,单位秒。如果为正数,则该Cookie在maxAge秒之后失效。如果为负数,该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。如果为0,表示删除该Cookie。默认为–1
boolean secure该Cookie是否仅被使用安全协议传输。安全协议。安全协议有HTTPS,SSL等,在网络上传输数据之前先将数据加密。默认为false
String path该Cookie的使用路径。如果设置为“/sessionWeb/”,则只有contextPath为“/sessionWeb”的程序可以访问该Cookie。如果设置为“/”,则本域名下contextPath都可以访问该Cookie。注意最后一个字符必须为“/”
String domain可以访问该Cookie的域名。如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该Cookie。注意第一个字符必须为“.”
String comment该Cookie的用处说明。浏览器显示Cookie信息的时候显示该说明
int version该Cookie使用的版本号。0表示遵循Netscape的Cookie规范,1表示遵循W3C的RFC 2109规范

cookie的属性.png

2.2.1、cookie的有效期(maxAge)

cookie的效期是通过设置属性maxAge决定的(单位:秒),maxAge设置为正数的时候,就是设置cookie的有效期maxAge秒,就算浏览器进行关闭,依旧是有效的,过了时间后就无效了;如果maxAge设置为0时,表示删除当前的cookie,cookie本身没有设置删除的方法,想要删除cookie时,可以使用该方法;当设置maxAge为负数时,则表示该Cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该Cookie即失效。maxAge为负数的Cookie,为临时性Cookie,不会被持久化,不会被写到Cookie文件中。Cookie信息保存在浏览器内存中,因此关闭浏览器该Cookie就消失了。cookie默认的maxAge值为–1

失效的Cookie会被浏览器从Cookie文件或者内存中删除。

2.2.2、cookie的修改与删除

cookie的删除就是设置maxAge为0即可,cookie的修改就是创建一个同名的cookie然后进行覆盖即可。

2.2.3、cookie的域名(domain)

cookie可以通过domian进行二级域名的设置,正常情况下,同一个一级域名下的两个二级域名如www.helloweenvsfei.com和images.helloweenvsfei.com也不能交互使用Cookie,因为二者的域名并不严格相同。但只要在domian设置二级域名即可使用同一个cookie:

cookie.setDomain(".helloweenvsfei.com") // 设置域名

注意:domain参数必须以点(".")开始。另外,name相同但domain不同的两个Cookie是两个不同的Cookie。如果想要两个域名完全不同的网站共有Cookie,可以生成两个Cookie,domain属性分别为两个域名,输出到客户端。

2.2.4、cookie的路径(path)

path属性决定允许访问Cookie的路径(ContextPath)。

Cookie cookie = new Cookie("data", "data");
cookie.setPath("/"); // 所以路径都可使用当前的cookie,‘/’是根路经
cookie.serPath("/mapper/"); // 只有/mapper/路径下的资源可以获取到当前的cookie
2.2.5、cookie的安全属性(secure)

一般的cookie是在http协议中进行传输的,而http协议不是安全的协议,如果希望cookie能够进行安全的传输,可以通过设置cookie.setSecure(ture)让cookie只在https和ssl的安全协议下进行传输。secure属性并不能对Cookie内容加密,因而不能保证绝对的安全性。如果需要高安全性,需要在程序中对Cookie内容加密、解密,以防泄密。

2.3、cookie的不可跨域性

cookie具有不可跨域性,就是一个cookie只能访问他指定的域,根据Cookie规范,浏览器访问Google只会携带Google的Cookie,而不会携带Baidu的Cookie。Google也只能操作Google的Cookie,而不能操作Baidu的Cookie。正是因为如何就算我们的浏览器中保存的很多cookie,但是每次进行网站的访问网站时浏览器会准确的帮我们进行对应的网站cookie的提交。

2.4、 cookie记录用户访问次数

Java中把Cookie封装成了javax.servlet.http.Cookie类。每个Cookie都是该Cookie类的对象。服务器通过操作Cookie类对象对客户端Cookie进行操作。通过request.getCookies()获取客户端提交的所有Cookie(以Cookie[]数组形式返回),通过response.addCookie(Cookiecookie)向客户端设置Cookie。

3、 session机制

session是另一种会话机制,他是保存在服务器上面的。当客户端访问服务器的时候,服务器会把客户端的信息以某种形式保存在服务器上面,下去访问时,直接检验保存的信息即可。

Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。

当多个客户端执行程序时,服务器会保存多个客户端的Session。获取Session的时候也不需要声明获取谁的Session。Session机制决定了当前客户只会获取到自己的Session,而不会获取到别人的Session。各客户的Session也彼此独立,互不可见。

注意:Session的使用比Cookie方便,但是过多的Session存储在服务器内存中,会对服务器造成压力。

3.1 、session的生命周期

Session在用户第一次访问服务器的时候自动创建。需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session。如果尚未生成Session,也可以使用request.getSession(true)强制生成Session。

Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session.用户每访问服务器一次,无论是否读写Session,服务器都认为该用户的Session“活跃(active)”了一次。

Session保存在服务器端。为了获得更高的存取速度,服务器一般把Session放在内存里。每个用户都会有一个独立的Session。如果Session内容过于复杂,当大量客户访问服务器时可能会导致内存溢出。因此,Session里的信息应该尽量精简。

3.2、session的有效期

因为session是保存在服务器上面的,当越来越多的用户进行访问时,服务器上保存的session对象也越来越多,过多的session对象会造成内存的溢出。防止这一问题的产生,我们可以设置session的有效期,过了有效期后服务器就会将其删除。
 Session的超时时间为maxInactiveInterval属性,可以通过对应的getMaxInactiveInterval()获取,通过setMaxInactiveInterval(longinterval)修改。Session的超时时间也可以在web.xml中修改。另外,通过调用Session的invalidate()方法可以使Session失效。
 
session默认的有效期是30分钟。

3.3、session和cookie之间的关联

虽然Session保存在服务器,对客户端是透明的,它的正常运行仍然需要客户端浏览器的支持。这是因为Session需要使用Cookie作为识别标志。HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一客户,因此服务器向客户端浏览器发送一个名为JSESSIONID的Cookie,它的值为该Session的id(也就是HttpSession.getId()的返回值)。Session依据该Cookie来识别是否为同一用户。

该Cookie为服务器自动生成的,它的maxAge属性一般为–1,表示仅当前浏览器内有效,并且各浏览器窗口间不共享,关闭浏览器就会失效。
因此同一机器的两个浏览器窗口访问服务器时,会生成两个不同的Session。但是由浏览器窗口内的链接、脚本等打开的新窗口(也就是说不是双击桌面浏览器图标等打开的窗口)除外。这类子窗口会共享父窗口的Cookie,因此会共享一个Session。

注意:新开的浏览器窗口会生成新的Session,但子窗口除外。子窗口会共用父窗口的Session。例如,在链接上右击,在弹出的快捷菜单中选择“在新窗口中打开”时,子窗口便可以访问父窗口的Session。

如果客户端浏览器将Cookie功能禁用,或者不支持Cookie怎么办?例如,绝大多数的手机浏览器都不支持Cookie。Java Web提供了另一种解决方案:URL地址重写。

3.4、URL地址重写

URL地址重写是对客户端不支持Cookie的解决方案。URL地址重写的原理是将该用户Session的id信息重写到URL地址中。服务器能够解析重写后的URL获取Session的id。这样即使客户端不支持Cookie,也可以使用Session来记录用户状态。HttpServletResponse类提供了encodeURL(Stringurl)实现URL地址重写,例如:

<td>

    <a href="<%=response.encodeURL("index.jsp?c=1&wd=Java") %>"> 
    Homepage</a>

</td>

encodeURL(Stringurl)方法会自动判断客户端是否支持Cookie。如果客户端支持Cookie,会将URL原封不动地输出来。如果客户端不支持Cookie,则会将用户Session的id重写到URL中。重写后的输出可能是这样的:

<td>

    <ahref="index.jsp;jsessionid=0CCD096E7F8D97B0BE608AFDC3E1931E?c=
    1&wd=Java">Homepage</a>

</td>

4、 cookie和session的区别

  1. cookie数据存放在客户的浏览器上,session数据放在服务器上。

  2. cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用session。

  3. session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用cookie。

  4. 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。(Session对象没有对存储的数据量的限制,其中可以保存更为复杂的数据类型)。

  5. 两者最大的区别在于生存周期,一个是IE启动到IE关闭.(浏览器页面一关 ,session就消失了),一个是预先设置的生存周期,或永久的保存于本地的文件(cookie)。

  6. 为什么说浏览器一关闭session就无效了:因为session对象创建成功的时候,会向客户端发送一个jsessionid保存在cookie中,这个cookie的有效期是maxAge(-1),一旦页面关闭了,这个cookie就失效了,session时通过这个jsessionid来进行用户的识别,这个cookie没有了,就不能够进行用户身份的验证,所以session就是失效了

参考文档:cookie和session的详解与区别

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值