Java Web中cookie和session详解

            14年的这个时候我才刚刚开始接触Java web,在这一年中也用这个技术做了不少大大小小的项目,中间也学了几个月的云计算,自己的技术水平提升多少我想这个可以从写博客的水平反映出一个人技术水平的好坏,当然我也很感激我自己可以慢慢的养写博客的习惯,记录自己轨迹。

             这几天的面试使我觉得基础知识真的很重要,我几乎一口气看完了《疯狂java突破程序员基本功的16课》、《深入理解java虚拟机》确实收益颇丰。

         所谓合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下所以在以后的学习中要深挖技术点举一反三。

        Java web中有两个非常重要的机制就是cookie机制和session机制,虽然很基础但是很有必要深入了解一下。

 1、session和cookie的区别:

        Cookies是一种能够让网站服务器把少量数据储存到客户端的硬盘或内存,或是从客户端的硬盘读取数据的一种技术。Cookies是当你浏览某网站时,由Web服务器置于你硬盘上的一个非常小的文本文件,它可以记录你的用户ID、密码、浏览过的网页、停留的时间等信息。 

     session: 当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。

      以上使我搜集出来对它们的不错的解释。

2、cookie机制:采用的是在客户端保持状态的方案,而session机制采用的是在服务端保持状态的方案。同时我们看到由于服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助cookie机制来达到保存标识的目的。

          cookie的内容主要包括:名字、值、过期时间、路径和域。路径和域一起构成cookie的作用范围。所不设置cookie的过期时间那么就称这个cookie是会话级别的cookie,关闭浏览器cookie就消失。会话级别的cookie一般不存储在硬盘上而存储在内存里面。若设置了过期时间浏览器就会把cookie存储到硬盘上,关闭浏览器再打开,cookie会一直存在知道超过过期时间。存储在硬盘上的cookie可以被不同的浏览器所共享.

3、 session机制:session机制是一种服务端的机制,服务器使用一种一种类似散列表的结构(应该就是map结构了吧)

服务器首先检查这个客户端的请求里是否已经包含了一个session标识(session id)如果含有sessionid则说明以前为此客户端创建过session服务器就会把这个按照session Id把session给检索出来(如果检索不到就会重新建立一个session),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此对应的session id,session id是一个不会重复的字符串,该id会在本次响应客户端的时候传送给客户端。

4、保存这个session id的方式:

        a、可以采用cookie,这样就可以在交互的过程中自动的按照规则把这个表示发送给服务器。一般这个cookie的名字类似于SEEESIONID的,但是cookie可以被人为禁止。

        b、所以也经常使用一种使用一种叫做URL重写的技术,就是把sessionid直接附加在URL路径的后面。

        c、还有一种技术叫做表单隐藏字段。就是服务器会自动修改表单添加一个隐藏的字段,在表单提交的时候就会把这个session id传递会服务器。

5、session和cookie的区别:

  •  cookie数据放在客户端,session数据放在服务器端。
  • cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗考虑安全性的话应该使用session。
  • session因为在服务器上保存了很多信息,当在访问量比较大的时候会增加服务器的负担,从这方面考虑应该使用cookie
  • 单个cookie的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie
  • 有人建议将登录信息等重要信息放在session中,非重要的信息可以放在cookie中。

二、不过cookie都可以用在那些地方呢?

       1、可以实现自动登录的功能:

          当用户注册网站的时候我们可以把用来唯一标识用户id的cookie保存到客户端,当用户再次打开我那个站的时候会把这个id发送到服务器,检查用户是否选择自动登录,然后既可以为用户自动执行登陆操作。

     2、cookie的使用方法 :我们需要使用HttpServletResponse的addCookie方法把cookie插入到HTTP请求报头。我们需要使用HttpServletRequest的getCookie方法获得cookie对象的数组。

    3、session的创建:是在用户访问到某个程序致使它执行HttpServletSession.getSession(true)这样的语句的时候才会被创建

   4、session的销毁:

         a、程序调用HttpSession.invalidate()

         b、客户再一次放松sessionId的时间间隔超过了session的最大有效时间

         c、服务器进程被停止

再次注意关闭浏览器只会使存储在客户端浏览器内存中的session cookie失效,不会使服务器端的session对象失效。大部分的Session机制都使用进程中Cookie来保存Session id的,关闭浏览器后这个进程也就自动消失了,进程中的Cookie自然就消失了,那么Session id也跟着消失了,再次连接到服务器时也就无法找到原来的Session了。

       因为服务器是不会知道浏览器关闭了没有(当然,你可以在关闭的时候去通知服务器,但一般都不会这样做),所以关闭浏览器时服务器是不会删除Session的,也正是这个原因服务器才会设置一个Session失效时间的,不然服务器早晚会被撑爆的。等距离上一次使用该Session的时间达到设置的失效时间时,服务器就会认为客户端已停止活动,便会将相应的Session删除。

 5、getSession()/getSession(true)、getSession(false)的区别
  getSession()/getSession(true):当session存在时返回该session,否则新     建一个session并返回该对象
  getSession(false):当session存在时返回该session,否则不会新建           session,返回null

         

  6、将用户从系统中注销并删除所有属于他(或她)的会话
  调用logOut,将客户从Web服务器中注销,同时废弃所有与该用户相关联的会话(每个Web应用至多一个)。这个操作有可能影响到服务器上多个不同的Web应用

相关推荐