星期三, 十一月 30, 2005

小心你的头!哦不,是HTTP头…

抽空帮一个同事 解决了一个问题,感觉有必要记一下,这属于很让人分特的问题,如果没有反应过来可能按着一条错误的路跑到明年自己还都不知道。
事情是这样的……
公司的OA应用在tomcat上表现一切正常,但客户需要移植到他们用Resin搭建的应用服务器上,所以我的同事想先测试一下(对Java的WORA还是有些怀疑,是吧?:P),果不其然(果然还是怀疑的…)应用出错了,但不是程序的问题,只是一个日历和时间的控件怎么也没办法显示,公司里可没JS牛人,我就勉强被叫过去看看。
由于以前没有接触过这个产品,就让他演示给我看。其实显示日历和时间都是靠showModalDialog()这个破方法显示的,里面的内容是靠一个jsp显示,于是继续看那个负责显示内容的jsp。打开这个jsp,很奇怪,IE提示有错误,而同样的部署在tomcat上的应用的同一个jsp打开后则不会出现这个错误。继续看代码…
代码里有一段通过Style声明导入一个.htc的控件(Style来导入控件,分特,挂什么卖什么…),打开这个.htc的代码,恩,比较正常的一大篇javascript,接下来在浏览器里直接打开…
恩?奇怪,访问Resin服务器时那段js是显示出来的,而访问Tomcat服务器时则提示下载,哦…
一切都明了了,用ieHttpHeaders一看,Tomcat对.htc类型的文件会返回Content-Type: text/x-component的头部,而Resin则像哑了一样,啥也没返回,而我记得IE对没有Content-Type的文件的处理是按照text/html来处理的,所以就…
解决方法:给Resin的什么什么.xml文件里加上这个MIME类型的声明就一切OK了。根本和程序不搭靠。
IE的这种行为我记得几年前被一个ID为crazybird的同学找到过,报告为bug,但微软的人根本没鸟这种报告,说是正常行为,其实我也觉得从一个开发人员的角度来看IE的这个行为不是太过分,但从搞安全的人看来则完全是不负责任的,具体原因略过不提,有丁点想像力的人就能想像到。不过IE,为什么就不能处理为text/plain呢?

没有评论: