banq兄:我发现这个论坛的“在线人数”有BUG,完全不准

这两天夜里上论坛,发现在线人数和白天一样多,甚至一更多,感觉不合常理。

试了一下,应该是系统对不支持cookie的浏览器访问的处理有问题:这种浏览器每刷新一次页面,就会增加一个或多个用户。这样网络爬虫梢一动就是几十个伪在线用户。
[该贴被leebai于2007年04月12日 00:47修改过]

可查JiveJdon3源码,是根据服务器内部Session来计数的,这是一个简单的通用的在线人数。

banq兄,通用在线人数统计(像discus!,DVBBS,天涯,西词,csdn。。。。99%的有统计在线的网站的session都基于cookie实现)一般是不会把不接受cookie的客户机当成在线会话的。

你可以试一下:把浏览器设成不支持cookie,再访问那些网站首页,无论你刷新多少次,在线人数都不会增长的。而JiveJdon每刷一次就长几个,试了一下其他基于Jive的论坛,发现也都不对,应该是根上的题。

看来Jive论坛之所以没有流行起来,还是自身原因的。
[该贴被leebai于2007年04月13日 11:44修改过]

多谢,源码是网上流行的java HttpSession统计人数,很简单,如果有问题,就出在Tomcat的HttpSession机制上了,这方面还没有仔细研究,也可能出现你讲的情况。

另外Session生存期是15分钟,也就是在线人数是15分钟内访问本站的session个数。显示在线人数,主要是让大家对JiveJdon在较大负载下运行的信心,否则总以为免费没好货。在线数字只是参考,前后对比就有点意思,比如刚才10分钟前是400人,现在是200人,说明午饭时间吃饭去了,减少了200人,

Jivejdon不同于Jive,是一个全新系统噢,感谢你建议。也更欢迎你下载一个jivejdon运行看看。


[该贴被banq于2007年04月13日 12:12修改过]

谢谢banq兄的认真回复,虽然我很大程度上不认同你的OO观点,但还是很喜欢这里认真、严谨的讨论气氛。

聊天室、论坛、内容管理程序我都实现过(见 xjawa网站),所以我知道在线人数统计是怎么回事。

实际上Servlet容器本身的HttpSession机制没有问题,问题是:应该在什么时候创建session?

一般的业务系统软件中,只有用户登录之后才创建session,而CMS/BBS/CHAT等面向公众的网站系统“来者都是客”,未登录者也需要考虑;但是,不能一有请求就创建session,因为有些浏览器不支持cookie,有些人有意地关闭了浏览器的cookie,网络爬虫一般也不支持cookie,要是这些客户端不断的访问你网站,而你每次request都创建session,这样一个客户端就会有N个伪session。如果有人打开浏览器不断刷新你的网站(更不用说写个简单的恶意程序),你的web容器中的session就会爆炸式的增长,只要他愿意,把你的服务器搞瘫痪是易如反掌,所以,即使只基于系统安全的考量,也要防止这种情况的发生。

你的除取100个基数的办法是一个掩耳盗铃的方法,根本上的处理办法是:不给这些无法实现session跟踪的的客户端创建session。

以上讨论仅限于基于cookie的session,基于URL重写方式的session在现实中代价太高,很少人使用,故不考虑。
[该贴被leebai于2007年04月13日 12:40修改过]

基本同意你的想法,对付爆炸Session,目前有一个不是办法的办法:将session time out缩短,5分钟或更短,然后配置同一个IP限制,以及防DDOS(后者基本没什么彻底办法)。


[该贴被banq于2007年04月13日 12:59修改过]

其实,还是有办法的:先检测client是否支持cookie,只有支持cookie的client才予与创建session。板兄如有兴趣,可以下载我的框架,src里面的org.xjawa.system.DeepServlet中就有这样的处理(因性能、效率、偷懒、能力等因素,代码不是很OO,板兄别见笑:))。
[该贴被leebai于2007年04月13日 13:39修改过]

果然是好东西,我瞧瞧,jivejdon已经弄了一个失效URL后加jsessionId的servletfilter,对于那些没有cookie的google等爬虫tomcat会自动在url后面加上jessionId,这样导致网址变异性,加了这个filter就好了。

不知这两个整在一起效果怎么样.....

今天已经加入了JiveJdon3的反爬虫的安全机制。对于一定时间内,同一个IP访问帖子次数超过一定频度,进行屏蔽,最明显是屏蔽了Baidu这样巨疯狂的spider,同时在线人数也将这些频繁访问的爬虫去除了。我是使用了filter + reference + throttle机制。

Lee的Servlet程序也做得不错,文档写得很流畅,不过具体没有看到如何控制Session的,有时间再行讨教。

从善如流呵,哈哈。

谢谢板兄夸奖,其实我的很多实现都比较老式。 因为01、02年的时候,我们主要做websphere的项目,ibm对j2ee 新API的支持都比主流晚一些,所有像filter,session listener之类新API都没法使用,所以用自己设计的机制代替这些功能,后来发现跑起来还算稳定,也就没再去动程序。


 
leebai@xjawa
 
 

不知道jdon的在线人数是如何通过HttpSession实现的,但是我想在线人数的统计是不可能很准确的,因为服务器端是很难知道一个客户端(浏览器窗口)是不是已经关闭了,session是有生命期的,所以用HttpSession统计出来的是目前还"活着的"session数量,而这个数字一定比实际在线人数多,把session的生命期设置得越短,在线人数的统计就越接近于实际在线人数.至于每刷新一次页面,在线人数就增加若干,在排除两次刷新之间确实有新登录的用户之外,应该就是程序的问题了,和是否采用Cookies应该没有关系。

>session的生命期设置得越短,在线人数的统计就越接近于实际在线人数
非常正确,以后会不断调准,现在session timeout是15分钟,只能说是15分钟内访问人次。

to:leebai
你的网址做的很不错,问题是访问的时候有些慢.
我这边是电信的网,不知道你那个是否是网通的网,所以比较慢阿

leebai同志
要了解这个在线人数的问题,要从tcp传输协议说起,因为tcp传输协议在数据传输两端是无状态的,数据传输两端互相交流在自己状态改变时并不通知另外一端,所以在用http浏览网站是不可能有准确的在线人数显示的。如果对这方面感兴趣或有什么疑惑可以去了解一下tcp/ip协议

我是新来的还请大家多多关照,看了这个论坛很佩服benq,希望向你学习!
此致
敬礼