AJAX中消除Tomcat会cache action返回值的问题

我们在写AJAX的时候,会用定时器定时调用一个action,来检测一些东西。比如EC 2.0中,我们用AJAX技术定时检查用户的消息收件箱,看有没有新的消息,有多少条。但是在实际应用中,我们发现Tomcat会cache我们这个检查 消息类的返回值,也就是说,如果现在检测到有3条新的消息,那么,之后的AJAX调用,无论数据库中的新消息数量是否发生变化了,Tomcat都返回一样 的数据给JSP,也就是3条消息。

这是非常讨厌的一个现象,因为Tomcat认为我们每次请求的都是同一个URL,自然它就cache这个action的返回值了。唯一的办法就是让我们每次AJAX请求的URL都不一样,这样才能消除Tomcat的这种cache行为。

那么,最容易想到的就是在URL后面加上当前时间,因为时间是一直在流逝的,所以,加上时间后,每次的URL就不一样了,就能消除Tomcat的cache行为了。在javascript中,我们是这样做的:

        function getMsgNotify() {
         
var dateInstance = new Date();
         
var url = "<%=webContextRoot%>" + "/toModule.ec?prefix=/portal&page=/GetMsgNotify.ec&counter=" + dateInstance.getTime();
         request.open(
"GET", url, true);
         request.onreadystatechange 
= updatePage;
         request.send(
null);
       }

这个getMsgNotify这个函数就会被定时调用,这里要注意,var dataInstance = new Date(); 这句代码一定要写在这个被定时调用的方法里面,这样才能保证每次调用这个function的时候,得到的都是当前时间,如果将这句代码放在外面,那么这句 代码就只会被执行一次,自然得到的时间就是最早的那个时间了。注:javascript中,new Date对象的时候不加参数表示返回当前时间。

然后我们就用了getTime这个函数,这个函数返回我们取到的date时间和197x年的那个时间的差值(秒数),这样就保证了每次的URL不一样了。

在此之前,我没用这个方法,我是申明了一个全局变量counter,初始值为0,然后每次getMsgNotify之后,都把这个counter 加1,来达到生成不同URL的目的,但是这样是不行的,因为如果用户不关闭浏览器,那么每一次加载这个页面,counter都从0开始计数,这样就又会发 生当前的URL和上次一样的情况(都是从0开始计数的嘛)!所以,科学的做法还是上面的那种,用时间来生成永不相同的URL。

原文地址:https://www.cnblogs.com/super119/p/1989370.html