单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,北京传智播客教育,*,高级软件人才实作培训专家,!,JavaWEB,开发,-,会话与状态管理,佟刚,北京传智播客教育,提出问题,HTTP,协议是一种无状态的协议,,,WEB,服务器本身不能识别出哪些请求是同一个浏览器发出的,浏览器的每一次请求都是完全孤立的,即使,HTTP1.1,支持持续连接,但当用户有一段时间没有提交请求,连接也会关闭。,怎么才能实现网上商店中的购物车呢:某个用户从网站的登录页面登入后,再进入购物页面购物时,负责处理购物请求的服务器程序必须知道处理上一次请求的程序所得到的用户信息。,作为,web,服务器,必须能够采用一种机制来唯一地标识一个用户,同时记录该用户的状态,北京传智播客教育,会话和会话状态,WEB,应用中的会话是指一个客户端浏览器与,WEB,服务器之间连续发生的一系列请求和响应过程。,WEB,应用的会话状态是指,WEB,服务器与浏览器在会话过程中产生的状态信息,,借助会话状态,,WEB,服务器能够把属于同一会话中的一系列的请求和响应过程关联起来,。,北京传智播客教育,如何实现有状态的会话,WEB,服务器端程序要能从大量的请求消息中区分出哪些请求消息属于同一个会话,即能识别出来自同一个浏览器的访问请求,这,需要浏览器对其发出的每个请求消息都进行标识,:属于同一个会话中的请求消息都附带同样的标识号,而属于不同会话的请求消息总是附带不同的标识号,这个标识号就称之为会话,ID,(,SessionID,)。,在,Servlet,规范中,常用以下两种机制完成会话跟踪,Cookie,Session,北京传智播客教育,cookie,机制,cookie,机制采用的是在,客户端保持,HTTP,状态信息的方案,Cookie,是在浏览器访问,WEB,服务器的某个资源时,,由,WEB,服务器在,HTTP,响应消息头,中附带传送给浏览器的一个小文本文件,。,一旦,WEB,浏览器保存了某个,Cookie,,那么它在以后每次访问该,WEB,服务器时,,都会在,HTTP,请求头,中将这个,Cookie,回传给,WEB,服务器,。,WEB,服务器通过在,HTTP,响应消息中增加,Set-Cookie,响应头,字段将,Cookie,信息发送给浏览器,浏览器则通过在,HTTP,请求消息中增加,Cookie,请求头,字段将,Cookie,回传给,WEB,服务器。,一个,Cookie,只能标识一种信息,它至少含有一个标识该信息的名称(,NAME,)和设置值(,VALUE,)。,一个,WEB,站点可以给一个,WEB,浏览器发送多个,Cookie,,一个,WEB,浏览器也可以存储多个,WEB,站点提供的,Cookie,。,浏览器一般只允许存放,300,个,Cookie,,每个站点最多存放,20,个,Cookie,,每个,Cookie,的大小限制为,4KB,。,北京传智播客教育,Cookie,的传送过程示意图,第一次访问不存在,Server1,的,Cookie,写入,Server1,的,Cookie,第一次响应,Set-Cookie2:name=value,第一次访问请求,WEB,Server,1,WEB,Server,2,浏览器,Server1,的,Cookie,Server2,的,Cookie,Cookie,存储区,后续访问存在,Server1,的,Cookie,后续访问请求,Cookie:name=value,北京传智播客教育,在,Servlet,程序中使用,Cookie,Servlet,API,中提供了一个,javax.servlet.http.Cookie,类来封装,Cookie,信息,它包含有生成,Cookie,信息和提取,Cookie,信息的各个属性的方法。,Cookie,类的方法:,构造方法:,public,Cookie(String,name,String,value),getName,方法,setValue,与,getValue,方法,setMaxAge,与,getMaxAge,方法,setPath,与,getPath,方法,HttpServletResponse,接口中定义了一个,addCookie,方法,它用于在发送给浏览器的,HTTP,响应消息中增加一个,Set-Cookie,响应头字段。,HttpServletRequest,接口中定义了一个,getCookies,方法,它用于从,HTTP,请求消息的,Cookie,请求头字段中读取所有的,Cookie,项。,北京传智播客教育,cookie,的发送,1.,创建,Cookie,对象,2.,设置最大时效,3.,将,Cookie,放入到,HTTP,响应报头,如果创建了一个,cookie,,并将他发送到浏览器,,默认情况下它是一个,会话级别,的,cookie;,存储在浏览器的内存中,用户退出浏览器之后被删除,。,若希望浏览器将该,cookie,存储在磁盘上,则需要使用,maxAge,,并给出一个以秒为单位的时间。将最大时效设为,0,则是命令浏览器删除该,cookie,。,发送,cookie,需要使用,HttpServletResponse,的,addCookie,方法,将,cookie,插入到一个,Set-Cookie,HTTP,响应报头中。由于这个方法并不修改任何之前指定的,Set-Cookie,报头,而是创建新的报头,因此将这个方法称为是,addCookie,,而非,setCookie,。,北京传智播客教育,会话,cookie,和持久,cookie,的区别,如果不设置过期时间,则表示这个,cookie,生命周期为浏览器会话期间,只要关闭浏览器窗口,,cookie,就消失了。这种生命期为浏览器会话期的,cookie,被称为会话,cookie,。会话,cookie,一般不保存在硬盘上而是保存在内存里。,如果设置了过期时间,浏览器就会把,cookie,保存到硬盘上,关闭后再次打开浏览器,这些,cookie,依然有效直到超过设定的过期时间。,存储在硬盘上的,cookie,可以在不同的浏览器进程间共享,比如两个,IE,窗口。而对于保存在内存的,cookie,,不同的浏览器有不同的处理方式。,北京传智播客教育,cookie,的读取,1.,调用,request.getCookies,要获取有浏览器发送来的,cookie,,需要调用,HttpServletRequest,的,getCookies,方法,这个调用返回,Cookie,对象的数组,对应由,HTTP,请求中,Cookie,报头输入的值。,2.,对数组进行循环,调用每个,cookie,的,getName,方法,直到找到感兴趣的,cookie,为止,北京传智播客教育,跟踪用户上次访问站点的时间,功能:,帮助网站实现提示客户端计算机上次访问网站的时间,实现原理:,将每一个会话作为一次访问过程,将每次会话的开始时间作为每次访问网站的时间,然后将这个时间以,Cookie,的形式存储到客户端的计算机中,客户端进行下次访问时通过该,Cookie,回传上次访问站点的时间值。,为了让,Cookie,信息在客户端浏览器或计算机关闭后仍然保持存在,,Cookie,的保存时间被设置为了一年。,北京传智播客教育,使用,cookie,属性的注意问题,属性是从服务器发送到浏览器的报头的一部分;但它们不属于由浏览器返回给服务器的报头。因此除了名称和值之外,,cookie,属性只适用于从服务器输出到客户端的,cookie,;服务器端来自于浏览器的,cookie,并没有设置这些属性。,北京传智播客教育,session,在不同环境下的不同含义,session,,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作,/,消息,比如打电话是从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个,session,。,session,在,Web,开发环境下的语义又有了新的扩展,它的含义是指,一类用来在客户端与服务器端之间保持状态的解决方案。有时候,Session,也用来指这种解决方案的存储结构。,北京传智播客教育,Session,机制,session,机制采用的是,在,服务器,端保持,HTTP,状态信息的方案,。,服务器使用一种类似于散列表的结构,(,也可能就是使用散列表,),来保存信息。,当程序需要为某个客户端的请求创建一个,session,时,服务器首先检查这个,客户端的请求里,是否包含了一个,session,标识,(,即,sessionId,),如果已经包含一个,sessionId,则说明以前已经为此客户创建过,session,,服务器就按照,session id,把这个,session,检索出来使用,(,如果检索不到,可能会新建一个,这种情况可能出现在服务端已经删除了该用户对应的,session,对象,但用户人为地在请求的,URL,后面附加上一个,JSESSION,的参数,),。如果客户请求不包含,sessionId,,则为此客户创建一个,session,并且生成一个与此,session,相关联的,sessionId,,,这个,session id,将在本次响应中返回给客户端保存,。,北京传智播客教育,保存,session id,的几种方式,保存,session id,的方式可以采用,cookie,,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。,由于,cookie,可以被人为的禁用,必须有其它的机制以便在,cookie,被禁用时仍然能够把,session id,传递回服务器,经常采用的一种技术叫做,URL,重写,,,就是把,session id,附加在,URL,路径的后面,,附加的方式也有两种,一种是作为,URL,路径的附加信息,另一种是作为查询字符串附加在,URL,后面。网络在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个,session id,。,北京传智播客教育,Session cookie,session,通过,SessionID,来区分不同的客户,session,是以,cookie,或,URL,重写为基础的,,默认使用,cookie,来实现,,,系统会创造一个名为,JSESSIONID,的输出,cookie,,这称之为,session cookie,以区别,persistent cookies,(,也就是我们通常所说的,cookie),session,cookie,是存储于浏览器内存中的,并不是写到硬盘上的,,通常看不到,JSESSIONID,,但是当把浏览器的,cookie,禁止后,,web,服务器会采用,URL,重写的方式传递,Sessionid,,这时地址栏看到,session cookie,针对某一次会话而言,会话结束,session cookie,也就随着消失了,而,persistent cookie,只是存在于客户端硬盘上的一段文本。,关闭浏览器,只会是浏览器端内存里的,session cookie,消失,但不会使保存在服务器端的,session,对象消失,同样也不会使已经保存到硬盘上的持久化,cookie,消失。,北京传智播客教育,Session,的创建与删除,一个常见的错误是以为,session,在有客户端访问时就被创建,然而事实是直到某,server,端程序,(,如,Servlet,),调用,HttpServletRequest.getSession(true,),这样的语句时才会被创建。,session,在下列情况下被删除:,A,程序调用,HttpSession.invalidate,(),B,距离上一次收到客户端发送的,session id,时间间隔超过了,session,的最大有效时间,C,服务器进程被停止,注意:关闭浏览器只会使存储在客户端浏览器内存中的,session cookie,失效,不会使服务器端的,session,对象失效。,北京传