1 缓存 GET 请求,导致数据不是最新的
问题描述
登录和首页是两个页面。在登录页面登录成功之后,会自动跳转到首页。在未登录状态强行访问首页的话,会被踢回登录页面。
在其他浏览器中都没有问题,只有在 IE 浏览器中出现了 bug :登录成功之后自动跳转到首页,但是立刻又被踢回登录页面了。
原因
在默认情况下,IE会针对请求地址缓存 ajax 请求的结果。换句话说,在缓存过期之前,针对相同地址发起的多个 ajax
请求,只有第一次会真正发送到服务端。
在首页中,页面初始化的时候会发送一个请求 A,获取一些初始化参数的信息。
因为之前在未登录的状态下访问过首页,触发过请求A,返回值是 “未登录,不允许访问,踢回登录页面”。
现在,我们在登录页面成功登录,自动跳转到首页,又一次触发了请求A。这一次请求 A 与之前不同,请求头中携带了我们的登录信息 token 。但是 IE 只根据请求地址判断是否用缓存,不会管你的请求头变不变,所以 IE 没有访问服务器,直接把缓存的内容返回了。页面收到了 “未登录,不允许访问,踢回登录页面”,所以又跳回到登录页。
解决
- 给所有请求添加时间戳,保证每次请求的地址都不同
- 给所有请求设置 cache:false
2 设置 X-UA-Compatible(已过时)
<meta http-equiv="X-UA-Compatible" content="IE=edge">
已过时:
If you need to support IE9 or IE8, then I would recommend using the tag. If you only support the latest browsers (IE11 and/or Edge) then I would consider dropping this tag altogether.
具体看这里:What does <meta http-equiv=“X-UA-Compatible” content=“IE=edge”> do?
3 让双核浏览器默认用 webkit 内核
目前仅360浏览器支持
<meta name="renderer" content="webkit">