有关jquery中ajax的缓存问题
我要做的是一个级联的省市区的联动下拉框,就是选择了省,然后异步读取该省的市的列表,如此类推。
=====================先粘贴我的代码============================
1.js中我是这样写的:
jQuery.ajax({
url:'ajaxGetList.do',
data:{parentId: parentId==''?'':parentId, level: level!=-1?'':'0'},
ifModified:true,
cache:true,
success:function(data){
alert('success:'+data);//to set list..........
},
contentType: 'application/json',
dataType:'json'
});
2.服务器端的响应代码:
public List<Map<String, Object>> getConcatenationList(HttpServletResponse response,@RequestHeader(required=false,value="IF-None-Match") String ifNoneMatch) {
if(ConcatenationHelper.checkEtag(RegionInfo.class, ifNoneMatch)) {
response.setStatus(304);
return null;
} else {
response.addHeader("Etag", etag);
//这里的ETAG是该请求内容的最新更新的时间戳
//TODO:(取得要显示的列表)
}
}
按上面的代码就可以使用缓存来异步获取数据了,测试时,首次点选某个省A(即第一个下拉框)时,是读取数据库的数据,取出来后能正常显示该省的市列表,点选其他省B后,再点选最初选择的省A,这个时候由于服务端返回了304状态码,这样服务端就不用再发送资源到客户端了,而直接使用cache,但这第二次选择省A的success函数中,alert显示的data却是undefined,为什么呢?是我遗漏了什么地方吗?应该怎么解决这个问题?
(P.S. 我用FireFox浏览器的,在首次点选省A时,用这个浏览器查过,确实有生成对应的缓存的,但第二次选省A时,缓存就不见了..)
可参考下面的网址:
http://www.cnblogs.com/heyuquan/archive/2013/05/13/js-jquery-ajax.html
然后搜索关键字[cache和ifModified参数]
只不过那里举的例子是使用Last-Modified,而我使用ETag而已。
补充:(不知道怎么回复回答者,所以通过修改问题来通知回答者了)
ifModified:true
这个参数是必须要有的,因为我要的效果是地区信息一般变化很少,所以就尽量使用客户端缓存,但也不排除某个地区信息有变化啊,这个参数代表着如果etag有变化时,就重新读取数据,若没变化时就读取cache。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
应该把
ifModified: true
去掉。仔细看一下你参考的文章:
他针对的是资源变动比较频繁的情况,希望时刻获取最新的文件,而你应该是想要尽量使用缓存吧。
正常情况下如果接收到 304,浏览器会主动把缓存内容和状态 200 返回给 xhr 对象,一旦设置了
ifModified: true
,从第二次请求开始,就没有了浏览器的处理过程,jQuery 直接接收到一个 304 和空内容。另外
contentType: 'application/json'
也用得不正确,一般情况下不用设置这个值。