session 基础总结

来源:互联网 发布:剑侠情缘3捏脸数据成男 编辑:程序博客网 时间:2024/05/29 03:28

一  Session是什么?

由于HTTP协议是无状态的,而出于种种考虑也不希望使之成为有状态的,因此,后面两种方案就成为现实的选择。

1)cookie机制采用的是在客户端保持状态的方案

2)session机制采用的是在服务器端保持状态的。session机制需要借助于cookie机制来达到保存标识的目的方案。


二 Sessioncookie的区别

1、session保存在服务器,客户端不知道其中的信息;cookie保存在客户端,服务器能够知道其中的信息。

2、session中保存的是对象,cookie中保存的是字符串。  

3. session不能区分路径,同一个用户在访问一个网站期间,所有的session在任何一个地方都可以访问到。而cookie中如果设置了路径参数,那么同一个网站中不同路径下的cookie互相是访问不到的。

三 Session何时创建

   

一个常见的误解是以为session在有客户端访问时就被创建,然而事实是直到某server端程序调用HttpServletRequest.getSession(true)这样的语句时才被创建。

注意如果JSP没有显示的使用<% @pagesession="false"%> 关闭session,则JSP文件在编译成Servlet时将会自动加上这样一条语句HttpSession session = HttpServletRequest.getSession(true);这也是JSP中隐含的session对象的来历

由于session会消耗内存资源,因此,如果不打算使用session,应该在所有的JSP中关闭它。

四 Session何时销毁

session在下列情况下被删除:


A.程序调用HttpSession.invalidate()
B.距离上一次收到客户端发送的session id时间间隔超过了session的最大有效时间
C.服务器进程被停止


五 保存session id的几种方式

1.保存sessionid的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。

2.由于cookie可以被人为的禁止,必须有其它的机制以便在cookie被禁止时仍然能够把session id传递回服务器,

  经常采用的一种技术叫做URL重写,就是把session id附加在URL路径的后面,附加的方式也有两种,

   一种是作为URL路径的附加信息,
   另一种是作为查询字符串附加在URL后面。网络在整个交互过程中始终 保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id。如果客户端Cookie禁用,则服务器可以自动通过重写URL的方式来保存Session的值,并且这个过程对程序员透明。(IE6.0除外)

3.另一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。


六  url重写的缺点

对所有的URL使用URL重写,包括超链接,form的action,和重定向的URL。每个引用你的站点的URL,以及那些返回给用户的URL(即使通过间接手段,比如服务器重定向中的Location字段)都要添加额外的信息。

这意味着在你的站点上不能有任何静态的HTML页面(至少静态页面中不能有任何链接到站点动态页面的链接)。因此,每个页面都必须使用servlet或 JSP动态生成。即使所有的页面都动态生成,如果用户离开了会话并通过书签或链接再次回来,会话的信息都会丢失,因为存储下来的链接含有错误的标识信息-该URL后面的SESSIONID已经过期了。

七  使用隐藏的表单域有什么缺点

仅当每个页面都是有表单提交而动态生成时,才能使用这种方法。

单击常规的<A HREF..>超文本链接并不产生表单提交,

因此隐藏的表单域不能支持通常的会话跟踪,只能用于一系列特定的操作中,比如在线商店的结账过程。



八 Cookie的过期和Session的超时有什么区别

1.session 的超时由服务器来维护,它不同于Cookie的失效日期。

2.Cookie的过期处理是由浏览器完成的。


九 会话cookiesession对象的生命周期是一样的吗

当用户关闭了浏览器虽然session cookie已经消失,

但session对象仍然保存在服务器端,直到其失效时间。


十 是否只要关闭浏览器,session就消失了

1.程序在logoff的时候发个指令去删除session,然而浏览器从来不会主动在关闭之前通知服务器它将要被关闭。因此服务器根本不会有机会知道浏览器已经关闭。服务器会一直保留这个会话对象直到它处于非活动状态超过设定的间隔为止。

2.之所以会有这种错误的认识,是因为大部分session机制都使用会话cookie来保存sessionid,而关闭浏览器后这个session id就消失了,再次连接到服务器时也就无法找到原来的session。

3.迫使服务器为session设置了一个失效时间,当距离客户上一次使用session的时间超过了这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间。

小结:关闭浏览器,只会是浏览器端内存里的session cookie消失,但不会使保存在服务器端的session对象消失,同样也不会使已经保存到硬盘上的持久化cookie消失。

那如果非要在关闭浏览器的时候,清楚服务器端的session,如何做?

严格的讲,做不到这一点。可以做一点努力的办法是在所有的客户端页面里使用javascript代码window.oncolose来监视浏览器的关闭动作,然后向服务器发送一个请求来删除session。但是对于浏览器崩溃或者强行杀死进程这些非常规手段仍然无能为力。

十一 打开两个浏览器窗口访问应用程序会使用同一个session还是不同的session

1.通常会话 cookie是不能跨窗口使用的,当你新开了一个新的浏览器窗口进入相同页面时,系统会赋予你一个新的session id,这样我们信息共享的目的就达不到了。

2.要实现跨窗口的会话跟踪,我们可以先把sessionid保存在persistent cookie中(通过设置session的最大有效时间),然后在新窗口中读出来,就可以得到上一个窗口的session id了,这样通过session cookie和persistent cookie的结合我们就可以实现了跨窗口的会话跟踪。



原创粉丝点击