尽管jQuery在浏览器ajax调用的时候对缓存提供了很好的支持还是有必要了解一下如何高效地使用http协议
首先要做的事情是在服务器端支持HTTP GET定义不同的URL输出不同的数据(MVC里对应的就是action)如果要使用同一个地址获取不同的数据那就不对了一个HTTP POST也不行因为POST不能被缓存许多开发人员使用POST主要有个原因明确了数据不能被缓存或者是避免JSON攻击(JSON返回数组的时候可以被入侵)
缓存解释
jQuery全局对象里的ajax方法提供了一些options来支持缓存和Conditional GETs功能
$ajax({
ifModified: [true|false]
cache: [true|false]
})
ifModified选项定义的是在ajax调用的时候是否支持Conditional GETs功能jQuery会自动帮我们处理服务器端返回的名为LastModified的header值然后在随后的请求里的header里发送IfModifiedSince这需要我们的MVC Controller要实现Conditional GETs功能才能用Conditional GETs功能在http缓存上下文中用于重新验证缓存中过期的条目如果jQuery认为一个条目已经过期了它首先会请求服务器使用Conditional GETs功能重新验证该条目如果服务器返回状态码(Not modified)jQuery会重新使用缓存里的该项目这样的话我们可以节约很多流量去下载页面内容
cache选项基本上是覆盖服务器端返回的http header里的所有关于缓存的设置如果设置cache选项为false的话jQuery会在请求的URL后面附件一个时间戳以便区分之前的URL地址这样没错请求的内容都是最新的也就是说浏览器每次接收的都是新地址自然返回的都是最新数据
让我们来看几个场景
服务器端响应里设置NoCache
服务器端为王如果服务器端明确定义了response响应不能被缓存的话jQuery也无能为力ajax里的cache选项将被忽略
JS代码
$(#nocache)click(function () {
$ajax({
url: /Home/NoCache
ifModified: false
cache: true
success: function (data status xhr) {
$(#content)html(unt)
}
})
})
C#代码
public ActionResult NoCache()
{
// 禁用缓存
ResponseCacheSetCacheability(HttpCacheabilityNoCache)
return Json(new { count = Count++ } JsonRequestBehaviorAllowGet)
}
服务器端响应里设置过期时间
服务器端设置过期时间用于缓存数据该条目在客户端将依据过期时间被缓存
JS代码
$(#expires)click(function () {
$ajax({
url: /Home/Expires
ifModified: false
cache: true
success: function (data status xhr) {
$(#content)html(unt)
}
})
})
C#代码
public ActionResult Expires()
{
ResponseCacheSetExpires(DateTimeNowAddSeconds())
return Json(new { count = Count++ } JsonRequestBehaviorAllowGet)
}
客户端从来不缓存数据
客户端决定每次都要最新的数据(不能使用缓存)也就是说ajax里的cache选项设置为false不管服务器端如何定义jQuery每次请求的URL地址都是唯一不同的目的是每次都获取最新的内容
JS代码
$(#expires_nocache)click(function () {
$ajax({
url: /Home/Expires
ifModified: false
cache: false // 这里是关键
success: function (data status xhr) {
$(#content)html(unt)
}
})
})
C#代码
public ActionResult Expires()
{
// 不管服务器端怎么设置都没用
ResponseCacheSetExpires(DateTimeNowAddSeconds())
return Json(new { count = Count++ } JsonRequestBehaviorAllowGet)
}
服务器端和客户端使用Conditional Gets功能验证缓存数据
客户端将条目放在缓存里在过期之后重新验证服务器端必须实现Conditional GET功能(使用ETags或者last modified的header)
JS代码
$(#expires_conditional)click(function () {
$ajax({
url: /Home/ExpiresWithConditional
ifModified: true // 这里是关键
cache: true
success: function (data status xhr) {
$(#content)html(unt)
}
})
})
C#代码
public ActionResult ExpiresWithConditional()
{
if (RequestHeaders[IfModifiedSince] != null && Count % == )
{
return new HttpStatusCodeResult((int)HttpStatusCodeNotModified)
}
ResponseCacheSetExpires(DateTimeNowAddSeconds())
ResponseCacheSetLastModified(DateTimeNow)
return Json(new { count = Count++ } JsonRequestBehaviorAllowGet)
}
上述MVC action中的代码只是一个例子(非真实代码)在真实的实现中服务器端应该能否知道数据自从上次响应以后是否被修改过
总结
详细通过这个场景大家应该了解了ajax请求的缓存技术了吧我就不做总结了