浅谈Ajax请求与浏览器缓存


在现代Web应用程序中,前端代码充斥着大量的Ajax请求,如果对于Ajax请求可以使用浏览器缓存,那么可以显著地减少网络请求,提高程序响应速度。

1. Ajax Request

使用jQuery框架可以很方便的进行Ajax请求,示例代码如下:

$.ajax({
  url : 'url',
  dataType : "xml",
  cache: true,
  success : function(xml, status){  
      }
});

非常简单,注意其中的第4行代码:cache:true,显式的要求如果当前请求有缓存的话,直接使用缓存。如果该属性设置为 false,则每次都会向服务器请求,Jquery的Comments如下:

If set to false, it will force requested pages not to be cached by the browser. Setting cache to false also appends a query string parameter, "_=[TIMESTAMP]", to the URL.

前端的工作也就这么多了,这样的话Ajax请求就可以利用浏览器缓存了吗?

继续看。

2. Http 协议

Http协议的header部分定义了关于客户端是否应该做Cache,以及如何做Cache。具体参见Http Header Field Definitions 的 14.9 Cache-Control 和 14.21 Expires。这里简单说一下:

Cache-Control

Cache-control用于控制HTTP缓存(在HTTP/1.0中可能部分没实现,仅仅实现了Pragma: no-cache)

数据包中的格式:

Cache-Control: cache-directive

cache-directive可以为以下:

request时用到:

| "no-cache"
| "no-store"
| "max-age" "=" delta-seconds
| "max-stale" [ "=" delta-seconds ]
| "min-fresh" "=" delta-seconds
| "no-transform"
| "only-if-cached"
| "cache-extension"

response时用到:

| "public"
| "private" [ "=" <"> field-name <"> ]
| "no-cache" [ "=" <"> field-name <"> ]
| "no-store"
| "no-transform"
| "must-revalidate"
| "proxy-revalidate"
| "max-age" "=" delta-seconds
| "s-maxage" "=" delta-seconds
| "cache-extension"

说明:

-Public  指示响应可被任何缓存区缓存。

-Private  指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。

-no-cache  指示请求或响应消息不能缓存(HTTP/1.0用Pragma的no-cache替换)

-no-store  用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。

-max-age  指示客户端可以接收生存期不大于指定时间(以秒为单位)的响应。

-min-fresh  指示客户端可以接收响应时间小于当前时间加上指定时间的响应。

-max-stale  指示客户端可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户端可以

接收超出超时期指定值之内的响应消息。

Expires

Expires 表示Cache的有效时间,允许客户端在这个时间之前不去发请求,等同max-age的效果。但是如果同时存在,则被Cache-Control的max-age覆盖。
格式:Expires = "Expires" ":" HTTP-date
示例:Expires: Thu, 01 Dec 1994 16:00:00 GMT

Last-Modified

Last-Modified用GMT格式表明了文档的最后修改时间,客户端第二次请求此URL时,会在头部加入一个属性,询问该时间之后文件是否有被修改过。如果服务器端的文件没有被修改过,则返回状态是304,内容为空,这样就节省了传输数据量。

 

3. 我的问题

这几天在做Web前端的时候,发现客户端的每次Ajax都会从服务器端请求数据,而这些数据的即时性没有那么高,没必要每次都请求。

在显式的给Ajax加上cache为true后,发现问题依旧。于是怀疑是服务端的问题,服务端使用 jersey 搭建了基于Restful的服务,代码片段如下:

@GET
@Produces("application/xml")
public Response getProducts() {
     Response.ResponseBuilder response = Response.ok(data);
     return response.build();
}

添加Cache控制后,进行测试,一切OK。

最后的代码如下:

@GET
@Produces("application/xml")
public Response getProducts() {
     Response.ResponseBuilder response = Response.ok(data);
     // Expires 3 seconds from now..this would be ideally based
     // of some pre-determined non-functional requirement.
     Date expirationDate = new Date(System.currentTimeMillis() + 3000);
     response.expires(expirationDate);
     return response.build();
}

以上只是示例代码,还可以进行更精细的控制,例如使用CacheControl、Last-Modified等等。

以上这篇浅谈Ajax请求与浏览器缓存就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持phpstudy。



相关阅读:
开启PHP的伪静态模式
jQuery 中ajax异步调用的四种方式
Win10到底啥什么时候正式发布?微软Build 2015未公布确切上市时间
基于html5和nodejs相结合实现websocket即使通讯
win10安装密钥更新变化有哪些? win10安装密钥新变化的内容
html禁止清除input文本输入缓存的两种方法
JavaScript实现梯形乘法表的方法
jquery学习总结(超级详细)
jQuery.Highcharts.js绘制柱状图饼状图曲线图
php通过array_merge()函数合并两个数组的方法
后端接收不到AngularJs中$http.post发送的数据原因分析及解决办法
jQuery插件pagination实现无刷新分页
java利用Ant脚本生成war包全过程
Win10 Mobile 10586.107怎么更新?Lumia950/XL/550可升级
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 CMS SQL jQuery C# C++ java Android IOS oracle MongoDB PostgreSQL SQLite 交通频道 连云港-衢州 杭州-佳木斯 福清-宜兴 启东-遂宁 荣成-汕尾 龙海-南宁 绵阳-泰州 济源-吴忠 石狮-西宁 廊坊-楚雄 德州-巴中 大石桥-中卫 丽江-上虞 深圳-鄂尔多斯 庆阳-中卫 江门-德州 荥阳-克拉玛依 大石桥-库尔勒 阿勒泰-石河子 朝阳-安庆 铁岭-嵊州 安顺-龙口 海安-海南 长治-三门峡 库尔勒-宜春 葫芦岛-中卫 镇江-赣州 那曲-潍坊 太仓-唐山 宁德-定西 攀枝花-龙口 玉溪-金昌 中卫-锡林浩特 丹东-宁波 武安-阜新 镇江-眉山 甘孜-郑州 包头-遂宁 安康-通辽 佛山-滨州 长春-滁州 荣成-新密 丽水-瓦房店 黄冈-南平 荆州-广元 邢台-锦州 商丘-丽水 宁波-平度 南昌-潮州 常州-四平 遵化-淮南 楚雄-石家庄 天津-江门 池州-长春 邯郸-贵港 黄南-东莞 安康-内江 南阳-开封 宁乡-芜湖 海城-十堰 鄂尔多斯-巩义 沈阳-遂宁 泉州-凉山 固原-三门峡 克拉玛依-广元 昭通-广元 新泰-乌海 南充-焦作 张家界-天水 六盘水-神木 宜兴-嘉峪关 衡阳-昌吉 庆阳-镇江 长乐-怒江 临沧-咸阳 哈尔滨-桓台 义马-即墨 湖州-漳州 朔州-库尔勒 文登-运城 上海-伊宁 太原-磁窑 信阳-秦皇岛 紫阳-海宁 蔡家坡-塘沽 应县-太原 王岗-山海关 绍兴东-庄桥 三源浦-双辽 杭州东-上虞 海林-李家 衡阳东-深圳北 海阳北-潍坊 滦县-烟筒山 闹海营-二道沟门 虢镇-任丘 大陆号-巴彦郭勒 共青城-麻城 邹城-上海南 九江-霸州 紫阳-十堰 江山-邵阳北 葫芦岛-当阳 前窑-营城 秦家-绥化 公主岭-经棚 信阳东-安顺西 二道湾-嫩江 襄汾西-石家庄 涡阳-宜春 深圳-苏州 重庆北-昆山南 藤县-郁南 武义北-合肥南 灵宝西-郑州东 南丰-洛阳 湘潭-于都 四家子-大徐屯 武穴-铁岭 重庆-廉江 南京-韶关东 合肥-淮北 德清西-泰山 绥中-丹阳 威箐-松河 大安北-泰山 樟树东-汕头 杨陵-潼关 六枝-四平 白涛-彭水 长沙南-济南西 辰溪-安化 邵阳北-曲靖北 衢州-贵阳北 邢台-临澧 南岔-石家庄北 长沙南-衡阳东 大庆东-苔青 古鲁满汗-大板 朗乡-芦台 衡山西-长寿北 新化-沈阳北 格尔木-南充北 延安-达州 北京南-本溪 厦门-湘潭 台安-滨海 青田-北京南 姚千户屯-歪头山 兖州-上海南 赣州-信阳 呼兰-绥中 阳春-威舍 临汾-阳泉北 桦南-八虎力 白马井-福山镇 武义北-天津西 六枝-宣城 益阳-株洲 正镶白旗-乌兰浩特

Copyright © 2016 phpStudy |