angular js 在ie11 下的get请求缓存问题的解决办法
使用angularjs 1.x开发的应用在ie11 下回碰到各种怪异的情况:一般表现在:卡,慢,丑。
还有另外一种情况,就是:get请求被缓存,导致页面数据没有刷新。今天我们就来解决这个问题。
几行代码:
myModule.config(['$httpProvider', function($httpProvider) {
//initialize get if not there
if (!$httpProvider.defaults.headers.get) {
$httpProvider.defaults.headers.get = {};
}
// Answer edited to include suggestions from comments
// because previous version of code introduced browser-related errors
//disable IE ajax request caching
$httpProvider.defaults.headers.get['If-Modified-Since'] = 'Mon, 26 Jul 1997 05:00:00 GMT';
// extra
$httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache';
$httpProvider.defaults.headers.get['Pragma'] = 'no-cache';
}]);
相信您的问题已经解决了,下面我整理了一点关于rest 缓存方面的东西。 看完之后应该能加明白代码的含义。
创建可缓存的内容
- GET请求的响应默认是可以缓存的(响应应该包含一个到期时间, 或者有一个验证器)
- POST请求的响应默认是不可以缓存的, 但如果响应头中包含明确允许的Expires头或者Cache-Control头信息, 那么它还是可以缓存的.
- PUT和DELETE请求的响应总是不可缓存的
为缓存使用响应头信息有两种主要的HTTP响应头可以控制缓存的行为:
- Expires
为一个缓存的表述指定绝对时间. 过了这个时间, 就认为被缓存的表述是过期的, 必须经过来源服务器的重新验证.服务要声明某个表述已经过期, 可以将Expires值设置成和Date头信息的值相等(这个表述现在就回到期), 或者将Expires设置为0.
如果要使一个表述"永不到期", 服务可以设置Expires值为一年后.
- Cache-Control
可以用在请求和响应上, 以控制响应的缓存行为. 这个头信息的值由一个或者多个逗号分隔的指令组成. 这些指令决定了响应是否可以缓存, 如果可以, 那么由谁缓存, 缓存多长时间.
如何使用Expires和Cache-Control?
如果我们可以确定一个被缓存响应的绝对到期时间, 就可以使用Expires头.
如果指明响应离开来源服务器后还能保持多久有效更合适的话, 就应该使用Cache-Control, 它增加了一个max-age或者s-maxage指令以指定一个相对的生存时间(Time to Live, TTL)
可缓存的响应(无论来自GET还是POST)都应该包含一个验证器--ETag或者Last-Modified头信息:
- ETag
一个ETag值是一个不透明的字符串, 服务器将它与资源相关联, 以便在资源的生命周期中唯一标示其状态. 当资源发生变化时, 实体值也响应发生变化. ETag值不仅可以用来做并发控制, 而且在验证被缓存资源的新鲜度(freshness)方面也同样有用.
- Last-Modified
一个响应的Date信息表示响应是何时生成的, Last-Modified头信息表示相关联资源是在何时修改的. Last-Modified不能晚于Date.
究竟是选择ETag还是Last-Modified, 应该根据资源更新的频率决定. Last-Modified的准确度仅仅与时间戳(精确到秒)相同, 而ETag能以任意频率生成. 但是通常生成时间戳的开销较小.
在响应中使用缓存指令当被用在响应中时, Cache-Control指令有3个功能:
- 一些指令要求将通常不可缓存的响应缓存起来
- 另一些指令要求不将通常可以缓存的响应缓存起来
- 剩下的指令完全不影响一个响应是否缓存起来,它们只是用来确定已经缓存起来的响应的新鲜度.
一个单独的Cache-Control指令可以具有以下一个或者多个功能!
具体的Cache-Control指令列表:
- max-age=${delat-seconds}
该指令可以同时控制可缓存性和新鲜度. 它使用本地缓存和共享缓存(代理缓存和反向代理缓存)将一个响应缓存起来, 并且以秒为单位制定其保鲜寿命. 一个max-age值会覆盖响应中的任何Expires值.
- s-maxage={delta-seconds}
和max-age一样, 这条指令有2个功能: 它使响应缓存起来, 但只能由共享缓存来做这件事, 并且以秒为单位指定了其保鲜寿命
- public
这个指令使本地缓存或者共享缓存将一个响应缓存起来, 但它没有指定一个新鲜度值. 重要的是, public优先于Authorization头信息. 一般来说, 如果一个请求包含一个Authorization头信息, 那么响应不会被缓存, 但设置了public指令的响应例外. 但缓存需要身份认证的响应时, 你应该谨慎.
- private
这个指令使一个响应被缓存, 但只能在本地缓存(在浏览器或者其他客户端). 它可以防止共享缓存将通常可以缓存的响应缓存起来. private不指定新鲜度值.
- must-revalidate
这个指令使通常不可缓存的响应缓存起来,但需要缓存重新到来源服务器上验证一下过期的响应. 只有当过期的响应成功通过来源服务器的验证,缓存的内容才可以被用于满足需求.
must-revalidate指令在平衡一致性(consistency)方面非常有用,可以减少带宽和计算资源的消耗. 虽然它强制要求到来源服务器上重新验证请求,但一种服务器端有效的验证机制能阻止核心服务逻辑被请求重复调用,而开销仅仅是生成一些304 Not Modified响应.
- proxy-revalidate
除了只适用于共享缓存外, 这个指令和must-revalidate相同
- no-cache
这个指令要求缓存为每个请求都到来源服务器上重新验证已缓存的响应. 如果请求通过验证, 则缓存的内容可以使用.
这个指令仅适用于已经被其他头信息或者指令设置为可缓存的情况(即它不能使可以缓存的响应不被缓存)
不幸的是, 不同的缓存对于no-cache有不同的行为,一些缓存将no-cache作为一个不缓存响应的指令.
- no-store
这个指令使得所有缓存(包括本地缓存, 代理缓存, 反向代码缓存)不将可以被缓存的内容缓存起来.
HTTP Stale Controls Information RFC最近增加了2条新的指令:
- stale-while-revalidate={delta-seconds}
在缓存能够发布(release)一个过期的被缓存响应的情况下,这条指令允许缓存立刻发布响应,同时它也指示缓存在后台(即以非阻塞的方式)重新验证被缓存响应.
这条指令以牺牲一致性为代价,减少了延迟(缓存立即发布过期的响应,同时重新验证它).如果一个过期的表述没有在delta-seconds(指定的秒数)之前完成重新验证, 那么缓存会放弃使用它.
- stale-if-error={delta-seconds}
该指令允许一个缓存在联系来源服务器发生错误时发布一个过期的缓存响应. 如果一个被缓存响应比delta-seconds指定的时间范围更旧, 那么就不应该发布它. 这条指令以牺牲一致性为代价, 提供了可用性.
栗子
- 使缓存的内容仅存在于本地缓存, 时间为1个小时
- Cache-Control: private, max-age=3600
- 缓存身份认证后的响应
- Cache-Control: public, max-age=0
public使得响应能被本地缓存和共享缓存缓存住,但max-age=0需要在发布被缓存表述前去到源服务器上重新验证(使用一个条件GET). (理想情况下, 我们使用no-cache,但是由于一些缓存将no-cache当成了完全不缓存指令处理,所以选择max-age=0代替).
当我们想要为每个请求授权,同时又希望通过缓存基础设施提供响应以节省带宽时, 这个组合非常有用的.
当到服务器上重新验证每个请求时,缓存会将消费者提供的Authorization头信息内容传递到服务器,如果来源服务器返回了401,表示未通过认证,缓存将不会发布被缓存的表述. 这个public,max-age=0组合不同于must-revalidate的地方,就是它允许缓存那些包含Authorization头信息的请求对象的响应.
angular js 在ie11 下的get请求缓存问题的解决办法的更多相关文章
- HTML中的select下拉框内容显示不全的解决办法
HTML中的select下拉框内容显示不全的解决办法 今天,我遇到这样一个问题:查询栏中的下拉框中的内容过长,导致部分被覆盖了. 查询了一些资料,有的说用函数控制,有的说用事件控制,有的看不懂,有的实 ...
- 66.ajax--ajax请求多个url解决办法
ajax请求多个url解决办法 以下四种方法是我找的,我也进行实践过. 测试中有四个请求接口,原本需要13S,用了第三种方法缩减到7S,但是仍不能达到2S以内. 所以仅供参考,待我找到能缩减到2S以内 ...
- Advanced Installer 打包后,安装包在WIN10下重启后再次运行安装的解决办法
原文:Advanced Installer 打包后,安装包在WIN10下重启后再次运行安装的解决办法 前几个月使用Advanced Installer 打包了一堆安装包,其中有使用默认主题的,也有根据 ...
- Windows7 提示“无法访问 xxxx,您没有权限访问,请与网络管理员联系请求访问权限”的解决办法
Windows7 客户端访问提示"无法访问 xxxx,您没有权限访问,请与网络管理员联系请求访问权限"的解决办法
- ie浏览器下,get请求缓存问题
1 使用get请求数据 1)Java代码 $.getJSON("sortShow!sortShow?time="+new Date().getTime(),function(){} ...
- windows7系统下升级到IE11时无法使用F12开发人员工具的解决办法
windows7系统下升级到IE11时,发现F12开发人员工具无法使用,打开都是空白的 解决办法,就是下载IE11的补丁,下载地址为:https://www.microsoft.com/zh-CN/d ...
- ASP.NET MVC 使用jquery.form.js 异步上传 在IE下返回值被变为下载的解决办法
错误记录: <script type="text/javascript"> $(function () { $(document).off("ajaxSend ...
- IE浏览器因缓存问题未能成功向后端发送请求的几个解决办法
这段时间前后端联调,解决IE.谷歌等浏览器兼容问题,真是让人有点焦头烂额,各种奇葩问题层出不穷,旧问题刚去,新麻烦又来,其中尤其以IE浏览器缓存的问题最多.有若干次都是因为这个缓存,使得前端的请求没有 ...
- win7+IE11 中开发工具报错occurredJSLugin.3005解决办法
系统环境 win7+IE11 报错描述: Exception in window.onload: Error: An error has ocurredJSPlugin.3005 Stack Trac ...
随机推荐
- js验证输入的是否是数字,小数保留几位小数
1.验证方法 validationNumber(e, num) e代表标签对象,num代表保留小数位数 function validationNumber(e, num) { -]+\.?[-]*$ ...
- 来玩Play框架06 用户验证
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 用户验证(User Authentification)复合的使用Play框架的数个 ...
- intellij中不能导入jar包
①选中项目点击右键,选择open modual settings(或者直接按F4): ②在弹出的窗口左端选择Libraries: ③点击左边加号,选择From Maven Repository; ④将 ...
- js 压缩工具总结
随便百度一个 “js 压缩”,然后就会有各种代码压缩工具可供选择, 向来我就爱那种绚丽新颖的玩意,比如这家显示压缩比呀,或者那家可以查错呀什么的, 今天还为国民浏览器拥有鼠标手势(按住右键画个图形就有 ...
- Oracle Sales Cloud:管理沙盒(定制化)小细节1——利用公式创建字段并显示在前端页面
Oracle Sales Cloud(Oracle 销售云)是一套基于Oracle云端的CRM管理系统.由于 Oracle 销售云是基于 Oracle 云环境的,它与传统的管理系统相比,显著特点之一便 ...
- dagger2记录篇
作为一个码农,什么都不用多讲,贴代码 build project build module Application public class App extends Application { pri ...
- iOS比较常用的第三方及实例(不断更新中)
把平时看到或项目用到的一些插件进行整理,文章后面分享一些不错的实例,若你有其它的插件欢迎分享,不断的进行更新: 一:第三方插件 1:基于响应式编程思想的oc 地址:https://github.com ...
- LinuxMint装JDK和Eclipse
Linux Mint 装JDK和Eclipse 前言 在尝试了好几个发行版后终于锁定了Linux Mint Cinnamon .那么就得配置好环境了. 这里讲一下JAVA环境,配置JDK和Eclips ...
- 【代码笔记】iOS-正在加载
一,效果图. 二,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the ...
- 在 CentOS7 上部署 MySQL 主从
在 CentOS7 上部署 MySQL 主从 通过 SecureCRT 连接至 MySQL 主服务器: 找到 my.cnf 文件所在的目录: mysql --help | grep my.cnf 一般 ...