HTTP协议自己是无状态的,自己并不能支持服务端保存客户端的状态信息,因而,Web Server中引入了session的概念,用来保存客户端的状态信息。javascript
这 里用一个形象的比喻来解释session的工做方式。假设Web Server是一个商场的存包处,HTTP Request是一个顾客,第一次来到存包处,管理员把顾客的物品存放在某一个柜子里面(这个柜子就至关于Session),而后把一个号码牌交给这个顾 客,做为取包凭证(这个号码牌就是Session ID)。顾客(HTTP Request)下一次来的时候,就要把号码牌(Session ID)交给存包处(Web Server)的管理员。管理员根据号码牌(Session ID)找到相应的柜子(Session),根据顾客(HTTP Request)的请求,Web Server能够取出、更换、添加柜子(Session)中的物品,Web Server也可让顾客(HTTP Request)的号码牌和号码牌对应的柜子(Session)失效。顾客(HTTP Request)的忘性很大,管理员在顾客回去的时候(HTTP Response)都要从新提醒顾客记住本身的号码牌(Session ID)。这样,顾客(HTTP Request)下次来的时候,就又带着号码牌回来了。 咱们能够看到,Session ID其实是在客户端和服务端之间经过HTTP Request和HTTP Response传来传去的。html
1)URL重写。 Web Server在返回Response的时候,检查页面中全部的URL,包括全部的链接,和HTML Form的Action属性,在这些URL后面加上“;jsessionid=XXX”。 下一次,用户访问这个页面中的URL。jsessionid就会传回到Web Server。java
2)Cookie。web
若是客户端支持Cookie,Web Server在返回Response的时候,在Response的Header部分,加入一个“set-cookie: jsessionid=XXXX”header属性,把jsessionid放在Cookie里传到客户端。算法
客户端会把Cookie存放在本地文件里,下一次访问Web Server的时候,再把Cookie的信息放到HTTP Request的“Cookie”header属性里面,这样jsessionid就随着HTTP Request返回给Web Server。数据库
1)当一个用户向服务器发送第一个请求时,服务器为其创建一个session,并为此session建立一个标识号; 2 ) 这个用户随后的全部请求都应包括这个标识号。服务器会校对这个标识号以判断请求属于哪一个session。apache
这种机制不使用IP做为标识,是由于不少机器是经过代理服务器方式上网,无法区分每一台机器。编程
对于session标识号(sessionID),有两种方式实现:cookies和URL重写。api
一、HTTP协议自己是“链接-请求-应答-关闭链接”模式的,是一种无状态协议(HTTP只是一个传输协议); 二、Cookie规范是为了给HTTP增长状态跟踪用的(若是要精确把握,建议仔细阅读一下相关的RFC),但不是惟一的手段; 三、所谓Session,指的是客户端和服务端之间的一段交互过程的状态信息(数据);这个状态如何界定,生命期有多长,这是应用自己的事情; 四、 因为B/S计算模型中计算是在服务器端完成的,客户端只有简单的显示逻辑,因此,Session数据对客户端应该是透明的不可理解的而且应该受控于服 务端;Session数据要么保存到服务端(HttpSession),要么在客户端和服务端之间传递(Cookie或url rewritting或Hidden input); 五、因为HTTP自己的无状态性,服务端没法知道客户端相继发来的请求是来自一个客户的,因此,当使用服务端HttpSession存储会话数据的时候客户端的每一个请求都应该包含一个session的标识(sid, jsessionid 等等)来告诉服务端; 六、会话数据保存在服务端(如HttpSession)的好处是减小了HTTP请求的长度,提升了网络传输效率;客户端session信息存储则相反; 七、 客户端Session存储只有一个办法:cookie(url rewritting和hidden input由于没法作到持久化,不算,只能做为交换session id的方式,即a method of session tracking),而服务端作法大体也是一个道理:容器有个session管理器(如tomcat的 org.apache.catalina.session包里面的类),提供session的生命周期和持久化管理并提供访问session数据的 api; 八、使用服务端仍是客户端session存储要看应用的实际状况的。通常来讲不要求用户注册登陆的公共服务系统(如google)采用 cookie作客户 端session存储(如google的用户偏好设置),而有用户管理的系统则使用服务端存储。缘由很显然:无需用户登陆的系统惟一可以标识用户的就是用 户的电脑,换一台机器就不知道谁是谁了,服务端session存储根本无论用;而有用户管理的系统则能够经过用户id来管理用户我的数据,从而提供任意复 杂的个性化服务; 九、客户端和服务端的session存储在性能、安全性、跨站能力、编程方便性等方面都有必定的区别,并且优劣并不是绝对(譬如 TheServerSide 号称不使用HttpSession,因此性能好,这很显然:一个具备上亿的访问用户的系统,要在服务端数据库中检索出用户的偏好信息显然是低效 的,Session管理器无论用什么数据结构和算法都要耗费大量内存和CPU时间;而用cookie,则根本不用检索和维护session数据,服务器可 以作成无状态的,固然高效); 十、 所谓的“会话cookie”简单的说就是没有明确指明有效期的cookie,仅在浏览器当前进程生命期内有效,能够被后继的Set-Cookie操做清除掉。 当 程序须要为某个客户端的请求建立一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为 session id,若是已包含一个session id则说明之前已经为此客户端建立过session,服务器就按照session id把这个 session检索出来使用(若是检索不到,可能会新建一个),若是客户端请求不包含session id,则为此客户端建立一个session而且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个 session id将被在本次响应中返回给客户端保存。 保存这个session id的方式能够采用cookie,这样在交互过程当中浏览器能够自动的按照规则把这个标识发挥给服务器。通常这个cookie的名字都是相似于SEEESIONID.浏览器
什么时候建立:一 个常见的误解是觉得session在有客户端访问时就被建立,然而事实是直到某server端程序调用 HttpServletRequest.getSession(true)这样的语句时才被建立,注意若是JSP没有显示的使用 <% @page session="false"%> 关闭session,则JSP文件在编译成Servlet时将会自动加上这样一条语句 HttpSession session = HttpServletRequest.getSession(true);这也是JSP中隐含的 session对象的来历。因为session会消耗内存资源,所以,若是不打算使用session,应该在全部的JSP中关闭它。 什么时候删除: a.程序调用HttpSession.invalidate(); b.距离上一次收到客户端发送的session id时间间隔超过了session的超时设置; c.服务器进程被中止(非持久session) 如何作到在浏览器关闭的时候删除cookie? 严格的讲,作不到这一点。能够作一点努力的办法是在全部的客户端页面里使用javascript代码window.oncolose来监视浏览器的关闭动做,而后向服务器发送一个请求来删除session。可是对于浏览器崩溃或者强行杀死进程这些很是规手段仍然无能为力。
一、存放在session中的对象必须是可序列化的吗? 不是必需的。要求对象可序列化只是为了session可以在集群中被复制或者可以持久保存或者在必要时server可以暂时把session交换出内存。 二、如何才能正确的应付客户端禁止cookie的可能性 对全部的URL使用URL重写,包括超连接,form的action,和重定向的URL 三、开两个浏览器窗口访问应用程序会使用同一个session仍是不一样的session
1)cookie机制的基本原理就如上面的例子同样简单,可是还有几个问题须要解决:“会员卡”如何分发;“会员卡”的内容;以及客户如何使用“会员卡”。 2)正统的cookie分发是经过扩展HTTP协议来实现的,服务器经过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript或者VBScript也能够生成cookie。 3) 而cookie的使用是由浏览器按照必定的原则在后台自动发送给服务器的。浏览器检查全部存储的cookie,若是某个cookie所声明的做用范围大于 等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。意思是麦当劳的会员卡只能在麦当劳的店里出示,若是某家 分店还发行了本身的会员卡,那么进这家店的时候除了要出示麦当劳的会员卡,还要出示这家店的会员卡。
主要包括:名字,值,过时时间,路径和域。 路径、域和做用范围:其中域能够指定某一个域好比.google.com,至关于总店招牌,好比宝洁公司,也能够指定一个域下的具体某台机器好比www.google.com或者froogle.google.com,能够用飘柔来作比。 路径就是跟在域名后面的URL路径,好比/或者/foo等等,能够用某飘柔专柜作比。 路径与域合在一块儿就构成了cookie的做用范围。 过时时间:如 果不设置过时时间,则表示这个cookie的生命期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览器会话期的 cookie被称为会话cookie。会话cookie通常不存储在硬盘上而是保存在内存里,固然这种行为并非规范规定的。若是设置了过时时间,浏览器 就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过时时间。 浏览器差别:存 储在硬盘上的cookie能够在不一样的浏览器进程间共享,好比两个IE窗口。而对于保存在内存里的cookie,不一样的浏览器有不一样的处理方式。对于 IE,在一个打开的窗口上按Ctrl-N(或者从文件菜单)打开的窗口能够与原窗口共享,而使用其余方式新开的IE进程则不能共享已经打开的窗口的内存 cookie;对于Mozilla Firefox0.8,全部的进程和标签页均可以共享一样的cookie。通常来讲是用javascript的window.open打开的窗口会与原窗 口共享内存cookie。浏览器对于会话cookie的这种只认cookie不认人的处理方式常常给采用session机制的web应用程序开发者形成很大的困扰。 转自这里。