在WEB设计18条最重要的准则中,关于HTTPSESSION的疑问???

在WEB设计18条最重要的准则中,关于HTTPSESSION的有这样两条:
1、Release HttpSessions when finished
2、Do not create HttpSessions in JSPs by default

请问,我怎样Release HttpSessions ??是用session.removeAttribute吗?

还有,什么叫“Do not create HttpSessions in JSPs by default”

HttpSession释放是在用户退出后释放,可以使用HttpSessionBindingListener监测


后句理解缺省不在Jsp创建,因为这个Jsp可能不会被首先访问,一般在servlet中。

还有尽量不用httpsession,对性能有影响,theserverSide的架构师谈它的网站为什么很快,是因为没有使用HttpSession。

那么TSS用什么管理Session,是用SFSB吗?

BTW,我觉得TSS网站访问速度挺慢的。

tss上有一篇自己网站架构的文章,它使用的是cookie保存信息。
我个人认为对于讨论性质的系统可以这么做,如果是定制性系统就难了。

session底层用什么来实现?好象还是cookie, URLrewrite吧?

我这里说的session 是HttpSession.

请问banq,

即然底层都是一样的机制,那httpSession与cookie不一样的地方在哪里? 是不是区别是: HttpSession放相应的大的数据对象在服务器这边,而cookie是把这个对象放在客户端? 这样行吗?

我认为,JSP的Session机制是JSP服务器端容器维护了一个Session列表,在客户端写了一个Cookie,这个Cookie是jsessionid,也就是在服务器端Session的Key,用这个jsessionid来取出session,服务器端可以将session存放在静态变量里,也可以保存成文件,当然也可以是数据库。
现在很多网站由于跨服务器的需要,大多使用了Cookie来保存用户的信息,这样大大减轻了服务器的负荷(我在网易工作的时候,就是用Cookie保存用户信息),但是Cookie所能保存的信息毕竟有限,大概是4000字节,而且Cookie只能保存文本不能保存对象,所以Session和Cookie的选择是由产品和项目决定的!

To laoer,

我的理解跟你的理解是一样的。只不过banq说HttpSession有效率问题,说cookie更好一些,我不太清楚为什么? 不知banq能不能说得更清楚一些,谢谢了。


HttpSession实际是一个HashMap,效率主要是指多个Web服务器集群时采取HttpSession复制有问题,好像我贴过一篇这方面文章。

Cookie、HttpSession和EJB SFSB都是保存用户状态的,包含内容是从少到多,从轻量到重量。如何在应用系统中选择使用,需要根据情况。

HttpSession实际是一个HashMap,效率主要是指多个Web服务器集群时采取HttpSession复制有问题,好像我贴过一篇这方面文章。

猜测斑竹的意思不是效率问题,而是 session 对内存消耗问题,大量占用内存必然导致系统开销加大。
(如果堆超过实际内存,会使系统变得奇慢。)
不管用什么技术,大型网站一般没有使用 session 的,对不对?

谢谢banq,

集群应可以用来维持session状态不会消失在某台机子crash或重启之后,你所说的效率问题好象是在集群的情况下,如果没有cluster,我想效率应相关不大。

Java中HttpSession使用简单,我个人认为应较多使用。

只用cookie的存session状态的话,服务器端不用存任何信息,这样cluster时,没有多余的复制消耗,即使没有cluster时且down机时, 由于服务器端没有存session信息,所以也不会影响到session的状态。

但是,由于session状态信息在client端,必然会有session状态在client and server之间的传输消耗。使用cookie也不安全。由于cookie本身有大小限制,所以session状态的数据不能太大,这样如果在企业级的应用中,没有扩展性。也是个大问题。

如何管理session中的对象??

关于HttpSession的误解实在是太多了,本来是一个很简单的问题,怎会搞的如此的复杂呢?下面说说我的理解吧:
1、HTTP协议本身是“连接-请求-应答-关闭连接”模式的,是一种无状态协议(HTTP只是一个传输协议);
2、Cookie规范是为了给HTTP增加状态跟踪用的(如果要精确把握,建议仔细阅读一下相关的RFC),但不是唯一的手段;
3、所谓Session,指的是客户端和服务端之间的一段交互过程的状态信息(数据);这个状态如何界定,生命期有多长,这是应用本身的事情;
4、由于B/S计算模型中计算是在服务器端完成的,客户端只有简单的显示逻辑,所以,Session数据对客户端应该是透明的不可理解的并且应该受控于服务端;Session数据要么保存到服务端(HttpSession),要么在客户端和服务端之间传递(Cookie或url rewritting或Hidden input);
5、由于HTTP本身的无状态性,服务端无法知道客户端相继发来的请求是来自一个客户的,所以,当使用服务端HttpSession存储会话数据的时候客户端的每个请求都应该包含一个session的标识(sid, jsessionid 等等)来告诉服务端;
6、会话数据保存在服务端(如HttpSession)的好处是减少了HTTP请求的长度,提高了网络传输效率;客户端session信息存储则相反;
7、客户端Session存储只有一个办法:cookie(url rewritting和hidden input因为无法做到持久化,不算,只能作为交换session id的方式,即a method of session tracking),而服务端做法大致也是一个道理:容器有个session管理器(如tomcat的org.apache.catalina.session包里面的类),提供session的生命周期和持久化管理并提供访问session数据的api;
8、使用服务端还是客户端session存储要看应用的实际情况的。一般来说不要求用户注册登录的公共服务系统(如google)采用cookie做客户端session存储(如google的用户偏好设置),而有用户管理的系统则使用服务端存储。原因很显然:无需用户登录的系统唯一能够标识用户的就是用户的电脑,换一台机器就不知道谁是谁了,服务端session存储根本不管用;而有用户管理的系统则可以通过用户id来管理用户个人数据,从而提供任意复杂的个性化服务;
9、客户端和服务端的session存储在性能、安全性、跨站能力、编程方便性等方面都有一定的区别,而且优劣并非绝对(譬如TheServerSide号称不使用HttpSession,所以性能好,这很显然:一个具有上亿的访问用户的系统,要在服务端数据库中检索出用户的偏好信息显然是低效的,Session管理器不管用什么数据结构和算法都要耗费大量内存和CPU时间;而用cookie,则根本不用检索和维护session数据,服务器可以做成无状态的,当然高效);

另外,经常在论坛看到或听到同事说ie关掉了,session就没了,而且还争论的唾沫横飞,偶就感到很好玩,只能不置可否地笑笑。这里只提示一下:以Ctrl+N或Shit+点击链接方式打开的IE窗口是运行在同一个进程空间的,cookie数据在进程空间中是共享的,而双击桌面上的ie图标打开的是一个新的进程,会话级的cookie(未明确指定生存期的cookie)在新的IE窗口里面是无法访问到的。