[Extjs]页面超时后重新登录访问该页面依然超时
[该日志写于2011/6/3 17:31]
?
?
?????? 到了这一步,我将filter中做了url的“/static/”过滤,不打印访问的静态url。同时也验证了静态url不走SpringMVC。日志界面变得清爽很多。于是通过ie和火狐的对比,发现火狐不会出现重新登录后超时的问题,超时后重新登录点击菜单,还是会在日志发现发出了url请求,而真正令人兴奋的是,在ie的测试中发现,超时后重新登录后点击菜单,在日志中没有发现左边菜单的url请求,而且有菜单url对应的js代码加载后的按钮初始化调用的Ext.Ajax。至此,可以定位为是浏览器缓存的问题。原来只知道点击左边菜单右边加一个panel的实际上是viewport中的autoLoad起作用的,但现在明确了这个autoLoad实际上是一个Ext.Ajax!!!只可能是这样,才能被filter截获并给response的header赋值一个sessiontimeout的属性。
?????? 我马上想到之前我在iteye上看到偶然看到的一篇介绍浏览器缓存的文章,可惜没有收藏,于是在网上搜刮了一番,终于找到了《HTTP协议缓存策略深入详解之etag妙用》,在此不解释怎么又找到了,总之花了一番精力,而且我现在也想不起来了。当然,遗憾的是,这篇文章并没有直接告诉我解决方案,于是google之,换了几次关键字,最终“javaurl 不缓存”成功了。第一条结果就是标准答案。最终我在Filter中加了三句话,黄金的三句话啊。问题得到完满解决。
?????? 我们的超时机制是这样的:拦截所有的url,在进入action之前先做一个判断,如果session为空或者session的user不为空,在判断是不是Ajax请求,只有是Ajax请求,js端的超时监听器才会起作用。如果是,在response的header里设置一个sessiontimeout属性。结束后,注意,这里说的结束,其实对于点击左边菜单情形来说,右边的js代码已经加载了!只有这样我之前说的弹出两个超时窗口才有可能。Viewport.js中的超时监听器捕捉到后弹出超时窗口。
?????? 对于ie来说,第一次超时返回到登录界面时已经将访问左边菜单的url信息缓存了,返回的结果的response中就带有sessiontimeout的属性!,所有再次点击的时候浏览器不想server端发出请求,直接从缓存中得到了返回结果。成功的使超时监听器触发了。Filter强制设置了no-cache后,缓存里面没有此url的信息,自然再次点击后,重新想server端发送的url请求,而这次session中有user信息。不会给response带上sessiontimeout属性,于是,自然不会又弹出超时窗口。
?????? 成功解决此困扰多时的问题。很开心。