最近,用到Debian虚拟机作为开发一个ExtJS+Perl+CGI架构内部web应用的私有开发环境。为了省去安装Debian的麻烦,我从网上下载一个现成的虚拟机(可从此处获取)。Debian的版本是Lenny,虚拟机只安装了net-install CD里基本的软件包。系统时间也不正确。没想到这一小小的错误竟然使得登陆失败。更为奇怪的是使用Firefox浏览器的话,却可以登陆。
该ExtJS Web应用用到了服务器管理的会话(CGI::Session),会话的超时时间为120分钟。当用户输入正确的用户和密码并提交登陆表单到服务器端,服务器通过LDAP验证用户密码后就创建会话并设置超时时间,然后发送重定向指令给浏览器,使它请求应用主界面。会话的标识和超时时间作为cookie以以下指令发给浏览器:
Set-Cookie:CGISESSID=f3ef2002de66e27ee2cfae13c0933012; path=/; expires=Fri, 01-Jan-2010 07:02:02 GMT
当浏览器收到重定向指令时,正常情况下会把收到的会话标识作为cookie同时传给服务器。由于,Debian虚拟机的时间比正常时间晚了近一个月,服务器端产生的会话有效时间是一个超时的时间。chrome浏览器(9.0.597.98)会忽略该cookie,导致服务器误认为该请求是新的一次会话而重定向到登陆页面。而Firefox则不管过期时间,照发cookie。所以使用firefox可以登陆。
因此,服务器的时间必须精确,否则引起想本例一样奇怪错误是不足为奇的。
最后,给一个如何保证服务器时间精准的小贴士。几乎所有的Unix/Linux操作系统里都有一个叫NTP的服务,开启该服务就能自动更新时间。Debian下用apt-get install ntp来安装并启动NTP服务。若该服务已安装,可以使用/etc/init.d/ntp start来启动。