HttpSession接口封装了Session的概念,Servlet容器提供了这个接口的实现。当一个会话开始的时候,Servlet容器就创建一个HttpSession对象,在HttpSession对象中存放客户的状态信息,Servlet容器为HttpSession对象分配一个唯一的Session ID,将其作为Cookie(或者作为URL的一部分,利用URL重写机制)发送给浏览器,浏览器在内存中保存这个Cookie。当这个客户再次发送HTTP请求时,浏览器将Cookie随请求一起发送,Servlet容器从请求对象中读取Session ID,然后根据Session ID找到对应的HttpSession对象,从而得到客户的状态信息。
Cookie是在浏览器访问Web资源时,由Web服务器在HTTP响应消息中通过Set-Cookie字段发送给浏览器的一组数据。服务器利用响应报头Set-Cookie来发送Cookie信息。在Servlet规范中,用于会话跟踪的Cookie的名字必须是JSESSIONID。
为了跟踪用户的会话,服务器端在创建Session后,需要将SessionID交给客户端,在客户端下次请求时,将这个ID随请求一起发送回来。采用Cookie的方式,将SessionID发送给客户端。当客户端不接受Cookie的时候,可以使用URL重写的机制来跟踪用户的会话。
URL重写就是在URL中嵌入标示客户的Session ID。服务器将SessionID 作为URL的一部分发送给客户端,客户端在请求URL中再传回来。要跟踪客户端的会话,就需要将所有发往客户端的URL进行编码,这可以通过调用HttpServlet Response接口中的encodeURL方法和encodeRedirectURL方法来实现。
encodeURL方法和encodeRedirectURL方法在执行时,首先判断当前的Servlet是否已经执行了HttpSession对象的invalidate()方法,如果已经执行了,直接返回参数URL。接下来,判断客户端是否禁用了Cookie,如果没有禁用,则直接返回参数URL,如果禁用了Cookie,则在参数URL中附加SessionID,返回编码后的URL。
Session的超时时间间隔也可以在程序中通过调用HttpSession接口的setMaxInactiveInterval()方法来进行设置。如果想改变所有Web应用程序的Session的默认超时值,可以修改%CATALINA_HOME%\conf\web.xml文件中的设置。
Session是一种服务器端技术,Session对象在服务器端创建,在服务器端保存数据信息并通过SessionID进行跟踪。而Cookie在客户端(浏览器内存或硬盘)保存信息(解决方案:会员卡或者目标卡?)。一般来说,登录信息等重要信息存放到session内,其他信息可以放到Cookie中。
通常将用于会话跟踪的Cookie叫做会话Cookie(临时Cookie),名字为JSESSIONID,通常保存在浏览器的内存中。是不能被不同的浏览器进程所共享的。共享只能发生在同一个浏览器进程的不同窗口中。而将会话Cookie保存到硬盘上(永久Cookie)可以在多个浏览器进程之间共享。因为浏览器关闭,则意味着保存SessionID的Cookie(临时Cookie)消失,而Session仍然存在于服务器端,直到超时时间间隔发生。如果会话Cookie保存到硬盘(永久Cookie),那么将SessionID发送给服务器,再次打开的浏览器就能找到原来的Session。
JAVA开发 SESSION和COOKIE的关系
原文:http://blog.itpub.net/26770925/viewspace-1393608/