12cd使用了很多的二级域名,类似javaeye的频道栏目。在tomcat6.0下跨域会造成session丢失。当时也没找到tomcat哪里可以设置session cookies地方。
所以就自己设计了一套解决方案。
12cd目前前端使用的是Apache2,应用服务器是tomcat6.0. Apache2 主要提供虚拟主机以及负载均衡的作用,通讯使用的是AJP.
下面介绍一下实现步骤:
CREATE TABLE `onlineusers` (
`id` bigint(20) NOT NULL, `operations` varchar(600) DEFAULT NULL, `last_active_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `login_time` timestamp NULL DEFAULT NULL, `s_sessionId` varchar(80) DEFAULT NULL, `s_ramdon` varchar(80) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MEMORY DEFAULT CHARSET=gbk CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC
id 存的使用户表id
last_active_time 记录用户最后一次操作时间
s_ramdon 这个存储是随机产生的32位字符串。后面会有用途。
验证完成后写入一个cookie,内容包括用户ID,用户名,用户密码,以及一个随机产生的32位字符串A,用一定的形式组织后加密。
接着往onlineusers表插入相应的记录。其中s_ramdon 保存的刚才那个字符串A。
当用户在做操作的时候,比如访问用户中心的时候,filter会做一下工作:
我们后台有个定时器,定期清除onlineusers表中超过半小时内没有任何更新的记录,并且删除用户相应的cookie,清空session.
这就相当与用户session失效登出
Ok 工作就这么多。看看这种方案给我们带来了那些好处
另外javaeye提供了用户正在做什么的功能。12cd 也有类似的功能。曾经咨询过robbin javaeye是如何实现,robbin 说是通过内存表记录用户的url来进行判断的。12cd则主要是通过Hibenrate的interceptor回调来实现。比如对日记有 保存操作,那就说明用户正在写日记。这个是题外话了