首页 > 技术文章 > websphere启用高速缓存导致问题

tapt 2018-08-17 10:06 原文

环境:websphere 7

 

一个流程主页,里面include了上面这个页面,内部有一个iframe;

现象:项目发布在测试环境中,打开流程主页时,里面iframe内页显示不出来;

                  同样的jsp页面,在生产环境时,页面显示正常;

                  同样的jsp页面,在本地环境websphere7时,页面显示正常

测试环境中调试记录:

         上图js方法是设置iframe高度的,在var subweb下方紧接着通过alert取subweb.body.scrollheight或者

Subweb.documentElement.scrollHeight都为0,所以设置iframe高度为0导致显示不出来;

调试1

  删除ie页面缓存,再次请求,发现可以显示iframe,但是再次请求,iframe还是显示不出来高度为0;判断是缓存问题导致。

调试2

         在线修改项目中iframe里面的jsp,保存;第一次请求页面,可以正常显示,后面再次请求,iframe又不能显示了。

调试3

         查资料改websphere里面的相关xml,删除temp,修改测试环境pc的时间,无效。

调试4

         Iframe内页jsp添加dtd申明,外框页对body.scrollheight先alert,再对documentElement.scrollHeight alert,发现,body为0,documentElement有值;

Ps:正常情况下,iframe内页不加dtd申明时,body高度有值,documentElement高度为0;Iframe内页添加dtd申明时,documentElemnt高度有值;

调试4的后期总结是,对body的高度alert的 时候,阻塞页面,页面有足够的时间加载异步加载的iframe内页,所以body的alert人工点击确定后,此时可以取到已加载完成的iframe内页高度;

但把2个alert都去掉的时候,iframe不显示,此时没有取到内页iframe的加载后实际高度,取的是没加载完成的高度0;(要么是0,要么是实际高度,不会是中间的只加载一部分的高度)

调试5

         根据调试4,判断是外页onload执行设置iframe高度的时候,内页没有加载完成,所以此时没有取到内页的实际高度,取的是0;

解决方法是给这个js方法设置一个延迟,setTimeout,问题解决,页面可以正常显示,但是这种方法并不完美,如果内页数据量很大或者因为某种原因导致内页加载很慢的时候,比如说内页要加载5s,而你外页这个js设置的延迟是3s,那么3s到的时候执行设置iframe高度,此时取的高度不是内页实际高度;

调试6

         准备在iframe内页的body的window.onload事件上,再写一个js方法,当内页onload完成时,从内页设置外页iframe的高度,这样可以保存设置iframe时取的是内页实际高度,此方法准备做未做,但是还是想从根本上解决,一样的代码,为什么所有环境都行,就测试环境这个不行?

调试7:

 

发现测试环境打开了启用servlet高速缓存,而生产环境和本地发布的环境都没有启用这一项,与一开始判断的缓存问题一致,然后在测试机上不要启用高速缓存,重启项目,不修改代码,问题解决。

 

推荐阅读