控制 Web 缓存

控制 Web 缓存


假设两个并发用户(用户 A 和用户 B)正试图使用基于 Web 的界面更新同一段数据。 假定用户 A 首先提交了更改的信息,随后应用程序将此信息存储到数据库中。 此时,用户 B 很有可能在他的 Web 浏览器中看到的是陈旧数据,且对此数据的更改可能覆盖用户 A 所做的修改。即使应用程序禁止并发用户访问同一数据,但如果用户单击浏览器的“后退”按钮,某个用户仍然可以看到陈旧内容。 如果应用程序开发人员忽略这些问题,它们可能导致信息不一致或数据丢失。

在以下各部分中,我概述了几个确保所提供内容的新鲜性的策略,从而避免出现陈旧数据问题。

使用 No-Cache 头部 为了尽量减少网络通信量,Web 浏览器和代理必须缓存静态页面、JavaScript、CSS 文件和像。 而缓存动态内容可能产生不良的负面影响,尤其是当 Web 窗体包含从数据库中提取的数据时。

幸运的是,使用分别由 HTTP/1.0 和 HTTP/1.1 标准定义的“Pragma:no-cache”和“Cache-Control:no-cache”头部可以很方便地禁用 HTTP 缓存。 例如,可以使用一个简单的过滤器设置这两个头部:


package caches;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class NoCacheFilter implements Filter {
private FilterConfig config;

public void init(FilterConfig config)
throws ServletException {
this.config = config;
}

public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
HttpServletResponse httpResponse
= (HttpServletResponse) response;
httpResponse.addHeader("Pragma", "no-cache");
httpResponse.addHeader("Cache-Control", "no-cache");
chain.doFilter(request, response);
}

public void destroy() {
}

}


可以在应用程序的 web.xml 文件中为所有 JSP 页面、JSP 页面的子集或只为使用 JSF 和 ADF Faces 的网页配置此过滤器,如以下示例演示:


<filter>
<filter-name>NoCacheFilter</filter-name>
<filter-class>caches.NoCacheFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>NoCacheFilter</filter-name>
<servlet-name>FacesServlet</servlet-name>
</filter-mapping>


可以根据在应用程序中更新数据的方式修改此过滤器以设置其他 Cache-Control 头部以及 Age、Date、Expires 和 Last-Modified。 有关这些头部的更多详细信息,请参阅 HTTP 规范。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值