`
MauerSu
  • 浏览: 514471 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

浏览器缓存内幕与getLastModified方法

 
阅读更多

源:

评:

[问题描述:]

 

1) user logout之后,按回退按钮又可进行提交;

 

IE缓存的问题 。

 

登出系统之后,输入刚才的URL,依然能访问原来的页面(但是有任何操作就会返回到登陆的页面),这是IE缓存的问题,只要清除调IE的缓存就好。

 

 

 

清除IE缓存的方法有两种,一是在浏览器端控制,二是在服务器端返回Response的时候设置Response的Header信息(禁止Servlet的缓存)。

 

 

 

浏览器端:

 

在JSP页面中加入META标签 

 

Html代码

 

 

 

  1. <META HTTP-EQUIV="Pragma" CONTENT="no-cache">  
  2. <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">  
  3. <META HTTP-EQUIV="Expires" CONTENT="0">   

 

 

 

 

 

  • <META HTTP-EQUIV="Pragma" CONTENT="no-cache">, 是用于设定禁止浏览器从本地机器的缓存中调阅页面内容,设定后一旦离开网页就无法从Cache中再调出
  • <META HTTP-EQUIV="Expires" CONTENT="0">, 可以用于设定网页的到期时间(失效时间), 一旦网页过期,必须重新向服务端发出请求,而不会使用浏览缓存中的内容。

 

 

 

服务器端:

 

Java代码

 

  1. response.setHeader("Pragma","No-cache");   
  2. response.setHeader("Cache-Control","no-cache");   
  3. response.setDateHeader("Expires"0);  

 

2) 校验图片不能更新的问题;

 

  

 

function changerand(obj){   

 

 obj.src="image.jpg";   

 

}  

 

 

 

 

Html代码

 

<img src="image.jsp" id=randimg>  

 

<a href="#" onclick="changerand(document.getElementById('randimg'))">看不清,换一个</a>

 

图片不能刷新,改changerand(obj)

 

 

 

function changerand(obj){   

 

 obj.src="image.jpg?dt="+Math.random();
}  

 

 就好了。原因:欺骗IE是不同的URL,不用cache,强制刷新 。

 

 

 

 

 

[背景知识:]

在HttpServlet类中定义了一个getLastModified方法,其完整语法定义如下:
protected long getLastModified(HttpServletRequest req)
其 中的返回值表示自1970年1月1日的0点0分0秒开始计算的一个毫秒数,HttpServlet类中定义的getLastModified方法总是返回 一个负数,在HttpServlet子类中可以对这个方法进行覆盖,以便返回一个代表当前输出的响应内容的修改时间,HttpServlet类的 service方法可以根据这个返回值在响应消息中自动生成Last-Modified头字段。

一般情况下,浏览器都会缓存已经访问过的页面内容,getLastModified方法的返回值可以影响浏览器如何处理和利用缓存内容。在详细了解getLastModified方法的应用之前,应该先对浏览器的缓存机制有所了解。

单 击IE浏览器的“工具“Internet选项”菜单,打开“Internet选项”对话框,接着再单击“常规”选项卡中的“Internet临时文件”栏 中的“设置”按钮,打开“设置”对话框。“设置”对话框的“Internet临时文件夹”栏中,可以看到浏览器保存所有缓存页面内容的文件夹的完整目录名 称。

“每次访问此页时检查”选项表示浏览器每次访问一个页面时,不管浏览器是否缓存过此页面,都要向服务器发出访问请求。这种设置的优点是实时性很强,肯定能够访问到网页的最新内容,但是如果网页内容很少更新,这种设置的访问效率就比较低了。

“每 次启动Internet Explorer时检查”选项表示在浏览器的每次启动运行期间,在第一次访问一个页面时,不管浏览器是否缓存过此页面,都要向服务器发出访问请求,但是在 浏览器的本次启动运行期间对该页面的后续访问,浏览器将不再向服务器发出访问请求,而是直接使用缓存中的内容。这种设置具有较高的访问效率,同时也兼顾了 较好的实时性,它可以保证每次启动浏览器后看到的都是最新的网页内容。

“自动”选项与“每次启动Internet Explorer时检查”选项的功能相似,只是对图像的访问有所不同,如果随着时间的推移,浏览器发现网页上的图像更新并不频繁,这样,即使浏览器在对某 个已缓存的图像执行本次启动运行以来的第一次访问时,它也不一定会向服务器发出访问请求,而是干脆直接使用缓存中的内容。“自动”选项是浏览器的默认设 置,所以,几乎所有人的浏览器都是按照这种方式工作的,这个选项的作用和意义应该成为读者熟悉的重点。

“不检查”选项表示浏览器不管在什么情况下访问一个页面时,只要能够在本地找到此页面的缓存信息,浏览器就不会向服务器发出访问请求,而是直接使用缓存的内容。这种设置的优点是访问效率很高,但是如果服务器端的网页内容更新后,浏览器看到的内容很可能是过期的内容。

在 浏览器的“检查所存网页的较新版本”的功能项采用默认的“自动”设置项的情况下,如果浏览器刚刚访问过一个网页,服务器端就更新了这个网页的内容,当浏览 在关闭前又重新访问这个页面时,用户看到的将不是更新的网页内容,而是过期的网页内容。为了提高浏览效率,在访问静态的网页内容时,这么一点小概率的过期 信息还是应该允许的,并且这些过期信息也不会造成什么不好的后果,就像你偶尔有一次看到了前一天发生的新闻,而不是当天的新闻,这又有什么问题呢?可是, 如果浏览器访问的是一个动态网页,这本来就要求浏览器在其整个运行期间的每次访问都能看到最新的内容,例如,销售一件商品后再回到商品库存的显示页面时, 看到的就应该是更新的库存数据,而不应该是先前看到的内容。仅仅根据被访问页面的资源名称,浏览器是无法知道商品库存的显示页面是属于动态内容,还是属于 静态内容。对于这种情况,浏览器将根据响应消息中是否包含Last-Modified头字段来进行处理,如果响应消息中没有包含Last- Modified头字段,它将在每次访问此页面时都向服务器发出访问请求,否则,它仅在每次启动运行后的第一次访问此页面时才向服务器发出访问请求,而在 启动运行期间对此页面的后续访问都不再向服务器发出访问请求。

响应消息中的Last-Modified头字段可用于指定响应内容的最后 更新时间,当客户机缓存此文档内容后,它在以后的请求消息中将根据Last-Modified头字段指定的时间来生成If-Modified-Since 请求头字段,以指出缓存文档的最后更新时间。只有文档的修改时间比If-Modified-Since请求头指定的时间新时,服务器才会返回文档内容。如 果自从If-Modified-Since指定的时间以来,网页内容没有发生修改,服务器将返回一个304(Not Modified)状态码来表示浏览器缓存的版本是最新的,而不会向浏览器返回文档内容,浏览器则继续使用以前缓存的内容。通过这种方式,可以在一定程度 上减少浏览器与服务器之间的通信数据量,从而提高了通信效率。

HttpServlet类为If-Modified-Since请求头和 Last-Modified头字段的这种应用提供了处理机制,当继承了HttpServlet类的Servlet程序接收到一个GET方式的访问请求 时,HttpServlet中重载的service方法在调用doGet方法之前,它还将调用getLastModified方法,并根据 getLastModified方法的返回值来决定是否调用doGet方法和在响应消息中是否生成Last-Modified头字段,具体规则如下:

当getLastModified方法返回一个负数时,不管请求消息中的情况怎样,service方法都将直接调用doGet方法来生成响应内容,这正是HTTPServlet类中定义的getLastModified方法的行为;

当 getLastModified方法返回一个正数,且请求消息中没有包含If-Modified-Since请求头时(这往往出现在第对某个资源的第一次 访问时),或者请求消息中包含的If-Modified-Since请求头中的时间值比getLastModified方法返回的时间值旧 时,service方法将根据getLastModified方法的返回值生成一个Last-Modified头字段,然后调用doGet方法生成响应内 容;

当getLastModified方法返回一个正数时,且请求消息中包含的If-Modified-Since请求头中的时间值比 getLastModified方法返回的时间值新或者与之相同时,service方法将不调用doGet方法,而是向浏览器返回一个304(Not Modified)状态码表示浏览器可以使用其以前缓存的内容。

分享到:
评论

相关推荐

    方立勋JavaWeb ppt、代码

    ### 方立勋JavaWeb知识点详解 #### Eclipse 使用与程序调试 **1.1 Eclipse 的使用** ...**9.17 发送 http 头,控制浏览器缓存当前文档内容** - **Cache-Control**:控制缓存行为。 - **Expires**:设置过期时间。

    servlet2.3规范

    `HttpServlet` 接口中定义了 `getLastModified` 方法,用于返回资源最后修改的时间戳,这对于缓存控制非常有用。 ##### 2.2 实例数 在分布式环境中,Servlet 引擎为每个 Servlet 只能声明一个实例。但是,如果一个...

    传智播客 方立勋 javaweb 完全笔记

    - 缓存处理改进 **8.5 Tip4:HTTP 请求** - **组成**: - 请求行 - 请求头 - 请求体 **8.6 Tip5:HTTP 请求的细节——请求行** - **格式**: - 方法 - URI - HTTP 版本 **8.7 Tip9:HTTP 响应细节——常用...

    JAVAEE笔记

    - **getLastModified方法**:可以用来告诉浏览器资源是否已经过期,从而决定是否重新请求。 以上是关于JAVAEE笔记中涉及的主要知识点的详细解释。这些知识点不仅涵盖了Java语言的基础,还包括了JavaEE开发中常见的...

    java-servlet-api.doc

    Servlet与applets不同的地方是,它不运行在Web浏览器或其他图形化的用户界面上。Servlet通过servlet引擎运行在Web服务器中,以执行请求和响应,请求、响应的典型范例是HTTP协议。 一个客户端程序,可以是一个Web...

    Head_First_Servlet_and_JSP_筆記.pdf

    ##### Servlet接口与方法 - **service(ServletRequest,ServletResponse)**: 这是Servlet接口中的核心方法,负责处理客户端请求。根据请求的不同类型(如GET或POST),会调用相应的方法来处理请求并生成响应。 - **...

    java中URL以及URLConnection类的使用

    要与一个URL建立连接,首先需要创建一个URL对象,然后调用这个对象的`openConnection()`方法来获取URLConnection对象。之后,可以使用URLConnection对象的方法来打开连接、设置请求属性以及读取响应。 #### 常用...

    FileUtil类文件整理

    6. **文件属性获取**:类中可能包含获取文件大小、是否存在、最后修改时间等信息的方法,如`getFileSize(String filePath)`、`exists(String filePath)`和`getLastModified(String filePath)`。 7. **文件过滤与...

    Spring MVC学习教程之RequestMappingHandlerAdapter详解

    `getLastModified()`方法则返回请求资源的最后修改时间,用于缓存控制。 `RequestMappingHandlerAdapter`是`HandlerAdapter`的具体实现,主要处理标记了`@RequestMapping`注解的方法。`@RequestMapping`注解用于...

    javascript

    根据提供的文档信息,我们可以归纳总结出一系列关于JavaScript的关键知识点,主要围绕着具体的功能实现与应用场景。下面将逐一介绍这些知识点: ### 1. 自动播放声音 - **代码示例**: ```html ~kayvin/mihunji....

    Http-servlet请求源码

    long lastModified = getLastModified(request); if (lastModified == -1) { // If the resource was not modified, set the response // status and exit. response.setStatus(HttpServletResponse.SC_NOT_...

    获取RecordStore的属性信息

    例如,通过检查`getLastModified()`方法返回的时间戳,我们能够确定何时对记录库进行了最后一次修改;而`getSizeAvailable()`方法可以帮助我们监控记录库的空间使用情况,避免因空间不足而导致的问题。 总之,了解...

    js网页设计的一些东西控制横向和纵向滚动条的显隐记录并显示网页的最后修改时间

    - 为了保护网站内容不被轻易复制,可以禁用浏览器默认的右键菜单和文本选择功能。 - 代码示例: ```html ``` #### 调整字体大小 - 用户可能会希望根据自己的阅读偏好调整网页上的字体大小。 - 实现方式: `...

    j2me保存永久数据

    RecordStore对象提供了获取信息的方法,如`getLastModified()`返回最近的更新时间,`getName()`获取Record Store的名称,`getSize()`返回占用的空间大小,`getSizeAvailable()`提供剩余可用空间,`getVersion()`则...

    domino xpags开发 控件 获取賦域值

    `myDoc.getDocument()`用于获取与控件关联的文档对象,`myDoc.getLastModified().toString()`则获取该文档的最后修改时间。 3. **获取Item值**:`document1.getItemValueString("Subject")`用于获取名为"Subject"的...

    基于java URL和URLConnection(详解)

    * `getLastModified()`: 获取最后修改日期 * `getHeaderFields()`: 获取http响应报文头字段 URLConnection对象可以用来获取http响应报文的信息,如获取最后修改日期、http响应报文头字段等信息。同时,它也可以用来...

    c#读取exchange 2003邮件

    &lt;getlastmodified /&gt; &lt;eq&gt;&lt;value&gt;0&lt;/value&gt;&lt;/eq&gt; &lt;/propfind&gt;"; var response = client.UploadString(serverUrl + "/Exchange.asmx", "PROPFIND", xml); // 解析响应,获取邮件信息 var ...

    lotus domnio java代理时间域获取

    由于我们需要将此时间转换为Java的`Date`以便格式化,所以使用`toJavaDate()`方法将其转换,然后再次使用`time.format()`进行格式化并存储在`Created_time_`变量中。 在代码中,检查了文档是否有名为"F_SendDate"的...

    对数据库的查询

    System.out.println("Last-Modified: " + new Date(hpCon.getLastModified())); int len = hpCon.getContentLength(); System.out.println("Content-Length: " + len); if (len &gt; 0) { System.out.println("===...

Global site tag (gtag.js) - Google Analytics