IE下默认会开启缓存策略,不管是页面还是通过ajax请求的数据都会议一个url,url是uri(统一资源定位符)的实例,url就是资源的标识符。

写一个demo进行验证,测试环境:IE8,node.js 0.12.7,页面模板为jade。

页面代码:testCache.jade

页面上放一个按钮,点下后从后台获取一个自增的数值显示在按钮上。

doctype html
html
head
meta(charset='utf-8')
title= title
script(src='/js/jquery-1.10.2.min.js')
script(src="/js/bootstrap.min.js") body
button(id='btnTest', type='button', class='btn btn-default gap') 测试
script.
$(document).ready(function(){
$('#btnTest').click(doTest);
}); function doTest(){
$.ajax({
type: 'GET',
url: '/cache/data',
data: '',
dataType: 'html'})
.done(function(data){
$('#btnTest').html(data);
})
}

后台关键代码:

//获取测试页面
router.get('/cache/page', function(req, res){
res.render('testCache', { title: 'testCache' });
}); //获取自增数值
var index = 0;
router.get('/cache/data', function(req, res){
var data = index++;
res.write(data.toString());
res.end();
});

运行效果可以看出无数次疯狂的点击后,还是“0”,原因就是IE第一次拿到数据后,从相同路径获取数据时采用了默认的缓存策略,当然可以通过IE的设置来规避缓存。

缓存问题,根本上还是响应header的设置问题,只不过IE在发现响应头中没有缓存设置项时会采取缓存策略,和其他浏览器的处理方式不同而已。

缓存很多时候是必须的,比如:新闻页面,升级页面,静态页面,这些资源在被访问后都可以缓存在浏览器段,通过根据资源的更新策略来设置规定的过期时间,可降低同服务器的资源获取次数。

当然在不需要缓存的地方,也要坚决的避免被缓存。

在IE中避免被缓存,如果是一个页面,那么就要在meta中设置缓存。

    <meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="-1">
<meta http-equiv="progma" content="no-cache">

上面的三项设置其实只要cache-control就可以了,本质上来说,在meta中的http-equiv的设置都会有服务器填入页面的响应header中。

如果是在页面上通过ajax来获取数据的,就要在后台数据的响应处,加上缓存的设置,明明白白地告诉浏览器,请你不要缓存。如下。

//获取自增数值
var index = 0;
router.get('/cache/data', function(req, res){
var data = index++;
res.setHeader('cache-control', 'no-cache');
res.write(data.toString());
res.end();
});

通过设置了no-cache后,本文的demo中的字增值就可以随着点击而增加并显示在按钮上。

在http的header中,缓存的配置项主要是5种,这里就列一下,网上的说明太多了。

1.cache-control

有4个值,private、no-cache、max-age、must-revalidate。

private:缓存到私有缓存。

max-age:相对过期时间,秒为单位,从浏览器获取资源的相应秒数后过期。

must-revalidate:每次访问都需要重新验证。

no-cache:不缓存。

2.expires

过期时间,这是一个绝对时间,时间格式是格林威治时间,如“Sun, 08 Nov2009 03:37:26 GMT”,过了这个时间,就过期

3.progma

对http1.0服务器的兼容。

4.Last-Modified/If-Modified-Since

在你的请求中发送一个 If-Modified-Since 头信息,它包含了上一次从服务器连同数据所获得的日期。如果数据从那时起没有改变,服务器将返回一个特殊的 HTTP 状态代码 304。

5.ETag/If-None-Match

服务器发送你所请求的数据的同时,发送某种数据的 hash (在 ETag 头信息中给出)。hash 的确定完全取决于服务器。当第二次请求相同的数据时,你需要在 If-None-Match: 头信息中包含 ETag hash,如果数据没有改变,服务器将返回 304 状态代码。

解决在IE中获取数据的缓存问题,运行环境为node.js的更多相关文章

  1. hive从查询中获取数据插入到表或动态分区

    Hive的insert语句能够从查询语句中获取数据,并同时将数据Load到目标表中.现在假定有一个已有数据的表staged_employees(雇员信息全量表),所属国家cnty和所属州st是该表的两 ...

  2. Thymeleaf+SpringMVC,如何从模板中获取数据

    Thymeleaf+SpringMVC,如何从模板中获取数据 在一个典型的SpringMVC应用中,带@Controller注解的类负责准备数据模型Map的数据和选择一个视图进行渲染.这个模型Map对 ...

  3. 哪种方式更适合在React中获取数据?

    作者:Dmitri Pavlutin 译者:小维FE 原文:dmitripavlutin.com 国外文章,笔者采用意译的方式,以保证文章的可读性. 当执行像数据获取这样的I/O操作时,你必须发起获取 ...

  4. Django Form 实时从数据库中获取数据

    修改 models.py 添加 class UserType(models.Model): caption = models.CharField(max_length=32) 执行命令,生成数据库 p ...

  5. SpringMVC从Request域中获取数据

    SpringMVC从Request域中获取数据的三种方式 SpringMVC环境自行搭建, 约定存在如下目录和文件:/WEB-INF/pages/success.jsp 方式一:传入Model对象 前 ...

  6. SQL语句的使用,SELECT - 从数据库表中获取数据 UPDATE - 更新数据库表中的数据 DELETE - 从数据库表中删除数据 INSERT INTO - 向数据库表中插入数据

    SQL DML 和 DDL 可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL). SQL (结构化查询语言)是用于执行查询的语法. 但是 SQL 语言也包含用于更新. ...

  7. Atitit. 获取cpu占有率的 java c# .net php node.js的实现

    Atitit. 获取cpu占有率的 java c# .net php node.js的实现 通过wmic接口获取cpu占有率 C:\Users\Administrator.ATTILAXPC188&g ...

  8. 无限遍历,Python实现在多维嵌套字典、列表、元组的JSON中获取数据

    背景 在做接口自动化的过程中,接口返回的数据是  列表字典循环嵌套  格式的,所以怎样通过一个key值,获取到被包裹了多层的目标数据成为了摆在我面前的一个问题. 一开始没想自己写,但是搜索后发现虽然很 ...

  9. 使用Xpath从网页中获取数据

    /// <summary> /// 从官方网站中抓取产品信息存放在本地数据库中 /// </summary> /// <returns></returns&g ...

随机推荐

  1. 淘宝UWP桌面版公测-谁需要邀请码?

    今天taobaoUWP桌面版上线beta测试了.哪位朋友需要邀请码的,请与我联系. 前提是,您的PC已经升级到Windows 10 10586版本了,否则无法使用. 邀请码数量有限,一人一枚,共20枚 ...

  2. JavaScript函数编程-Ramdajs

    在JavaScript语言世界,函数是第一等公民.JavaScript函数是继承自Function的对象,函数能作另一个函数的参数或者返回值使用,这便形成了我们常说的高阶函数(或称函数对象).这就构成 ...

  3. 细说angular Form addControl方法

    在本篇博文中,我们将接触angular的验证.angular的验证是由form 指令和ngModel协调完成的.今天博主在这里想要说的是在验证在的一种特殊情况,当验证控件没有没有name属性这是不会被 ...

  4. 使用抓包工具SpyNet对你的网络进行监控

    步骤1:下载并安装SpyNet Sniffer嗅探器之后,第一次运行SpyNet Sniffer后,将会弹出[Settings(设置)]对话框,在其中选择需要监听对象,如图所示. 步骤2:单击[Act ...

  5. 在同一台服务器上配置多个Tomcat

    如果要在一台服务器上配置多个Tomcat,主要就是要避免Tomcat服务器的端口冲突的问题.只需要修改CATALINA_HOME\conf\server.xml中的启动端口和连接端口就OK了! 下面我 ...

  6. WebKit技术内幕

    WebKit技术内幕(浏览器内核|渲染引擎| HTML5| Chromium项目Committer重磅作品) 朱永盛 著   ISBN 978-7-121-22964-0 2014年6月出版 定价:7 ...

  7. 大型网站系统与Java中间件实践

    大型网站系统与Java中间件实践(贯通分布式高并发高数据高访问量网站架构与实现之权威著作,九大一线互联网公司CTO联合推荐) 曾宪杰 著   ISBN 978-7-121-22761-5 2014年4 ...

  8. iOS----单例模式(Singleton)

    单例的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 1.单例模式的要点: 显然单例模式的要点有三个:一是某个类只能有一个实例:二是 ...

  9. win2003 64位系统IIS6.0 32位与64位间切换

    ASP.NET 1.1,32 位版本 要运行 32 位版本的 ASP.NET 1.1,按照以下步骤操作: 1.单击“开始”,单击“运行”,键入 cmd,然后单击“确定”. 2.键入以下命令启用 32 ...

  10. Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE

    1. 前言 Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Serve ...