您的位置:首页 > 编程语言 > Java开发

第三章 Java基础之cookie和session的区别和联系

2016-03-05 16:58 609 查看
         在介绍cookie和session之前先废话两句,最近面试了两家公司,第一家公司在笔试题中问道了对cookie的属性作介绍,第二家在面试的过程中问道了cookie和session的区别,自己只说了两点区别,也没有进行比较深入的介绍,面试官问道了session和cookie的关联,呵呵,我说没有关联。我还介绍了一下以前在工作中遇到了的多台服务器session共享的问题,最后发现自己不能自圆其说,啪啪啪的被打脸,今天花了一点时间在网上找了一些关于cookie和session的博客看了,特别是弄清了被面试官问得不能自圆其说的地方。只怪自己学艺不精,以前虽有使用,但也未系统的总结,今天总结一下。只有自己写出自己的理解才能算是自己的。

    一.总括

         会话:客户端和服务器一些列交互动作可以称为是一个会话。由于HTTP协议是无状态协议,每次客户端和服务器交互完请求后就会断开,再次发送请求时才会连接上,这样就无法判断这个请求是不是同一个用户发来的。这就好比我们在淘宝上买东西的时候将选好的东西放在购物车里,当我们再将另外一件物品放在购物车的时候,服务器如何知晓这两次购买是同一个人,所以为了确定客户端用户的身份就用到了cookie和session这两种机制。cookie是将信息存储在客户端,session是将信息存储在服务器。

    二.cookie

      1.cookie的机制

         当我们第一次访问某一个网站的时候,我们本地是不会有这个网站的cookie的,那cookie是如何产生的呢。当我们第一次访问的时候,服务器会生成一个cookie对象,这个cookie可能会存储一些对需求有用的信息,服务器还会在响应头里加上这样的一句话:set-Cookie,并将cookie信息存储在响应头里。客户端在接受到服务器的请求后,会将响应头里cookie存储起来。当客户端再次向服务器发送请求的时候,客户端会在请求头里面将上cookie:这样的一句话,把cookie放入请求头中。这样服务器就可以在请求头里面拿到cookie了。下图就是cookie传递的几个过程。

                                                                               


      2.cookie的属性

        A.cookie的name属性,getName()和setName()两个方法,name属性用来确定cookie的唯一性。

        B.cookie的value属性,getValue()setValue()两个方法,value只能存储英文,数字以及其他符号,如果要存储中文信息的话首先得将中文编码。一个cookie最多可以存储4K的内容,不同的浏览器存储cookie的个数不一样,一般的浏览器达到了能存储50个cookie;

        C.cookie的path属性,getPath()和setPath()两个方法,path属性是用来确定那个路径下的页面才能取得cookie,例如cookie.setPath("/test/abc/");那就说明只有是在"/test/abc/"路径下的页面才能获得该cookie;

        D.cookie的domian属性,getDomain()和setDomain()两个方法,domain属性是用来确定在什么域名下才能取得该cookie的,例如cookie.setDomain("www.baidu.com"),那么在"m.baidu.com"域名下面就不能取得该cookie。如果设成cookie.setDomain(".baidu.com");那么在"www.baidu.com"和“m.baidu.com”下面都能取得该cookie;

        E.cookie的maxAge属性,getMaxAge()和setMaxAge()两个方法,maxAge属性是用来确定cookie的有效时间的,单位为秒。默认的maxAge为-1,当maxAge为负数的时候,表面客户端不会将该cookie存储在本地硬盘中,而是存储在内存中,当关闭浏览器的时候,该cookie就会失效。如果maxAge为正数,那么浏览器会对cookie做持久化存储在本地,即使关掉浏览器或电脑,cookie在maxAge的时间内还是有效的,如果想删除cookie,就cookie.setMaxAge(0);将maxAge设置为0就表示删除该cookie。如果要想让cookie永久有效就cookie.setMaxAge(Integer.MAX_VALUE);

        F.cookie的secure属性,getSecure()和setSecure()方法,secure属性是用来指定cookie只能在安全协议下传输的,例如在HTTPS,SSL协议下传输,但设置了secure为true后也不会自动对cookie进行加密处理,加密的自己手动处理。

        G.version,版本号,至于何用还不太清楚。

    三.session

     1.session机制

         session是将用户信息保存在服务器端来确定用户身份的一种机制,但是session还是会依赖cookie,因为当请求来到服务器的时候,服务器虽然已经创建了session,但是还是不知道这个请求对应的是哪一个session,所以在这里还需要创建一个JSSESSIONID的cookie用来记录session的id,如果在浏览器禁掉cookie后,服务器可以对url重写,运用response.encodeURL(url);改方法会自动在url后面带上sessionId的参数,这样每次用户请求的时候都会带上sessionId这个参数。记住一点就可以了,在服务器生成session的时候,这个session会有一个id与之对应,服务器会将这个id存储在一个cookie中传给客户端,JSSESSIONID
cookie的maxAge是负数,cookie没有在本地被持久化,所以当我们关掉浏览器的时候,这个cookie也会被清除,我们就找不到这个cookie与之对应的session了,所以我们经常听说关闭浏览器后,这个session的生命周期就结束了。我觉得session如果还在存活期内,它还是存在的,只是我们再也找不到它了。

  2.session属性

attribute属性,void
setAttribute(String,String);String getAttribute(String);void removeAttribute(String)设置和获取session里面的属性。

id属性,String
getId();session的id是自动生成的

createTime,long
getCreateTime();返回session被创建的时间。可以将long型转换为Date型的。

maxInactiveInterval属性,也就是session的有效时间,单位为秒,int
ge MaxInactiveInterval()和void setMaxInactiveInterval();

四.cookie和session的对比

1.cookie中内容是存储在客户端的,session的内容是存储在服务器上的。

2.由于cookie是存储在本地的,所以比较容易拿到cookie并对cookie进行解析和cookie欺骗。session相较于cookie要安全一些。

3.session是放在服务器上的,当访问增多的时候,容易给服务器增加压力,这时可以考虑将session存储的内容放在cookie中。

最后总结一下,cookie和session都是一种跟踪会话,帮助服务器来确定客户端用户身份的一种机制。cookie只是将信息存储在了客户端,session是将信息存储在服务器,session是对cookie有依赖关系的。

        

      
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: