设置JSP页面不缓存,也就是页面立刻失效

转载自扑热息痛的博客

jsp设置页面过期
服务端方法:
<%
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", -10);
%>
在登陆页面和登陆后页面均加入这段代码即可
注意,一定要在登陆页面(或类似功能的页面使session无效)

客户端方法:

meta是用来在HTML文档中模拟HTTP协议的响应头报文。meta 标签用于网页的<head>与</head>中,meta 标签的用处很多。meta 的属性有两种:name和http-equiv。name属性主要用于描述网页,对应于content(网页内容),以便于搜索引擎机器人查找、分类(目前几乎所有的搜索引擎都使用网上机器人自动查找meta值来给网页分类)。这其中最重要的是description(站点在搜索引擎上的描述)和keywords(分类关键词),所以应该给每页加一个meta值。比较常用的有以下几个:
name 属性

1、<meta name="Generator" contect="">用以说明生成工具(如Microsoft FrontPage 4.0)等;

2、<meta name="KEYWords" contect="">向搜索引擎说明你的网页的关键词;

3、<meta name="DEscription" contect="">告诉搜索引擎你的站点的主要内容;

4、<meta name="Author" contect="你的姓名">告诉搜索引擎你的站点的制作的作者;

5、<meta name="Robots" contect=

"all|none|index|noindex|follow|nofollow">

其中的属性说明如下:

设定为all:文件将被检索,且页面上的链接可以被查询;

设定为none:文件将不被检索,且页面上的链接不可以被查询;

设定为index:文件将被检索;

设定为follow:页面上的链接可以被查询;

设定为noindex:文件将不被检索,但页面上的链接可以被查询;

设定为nofollow:文件将不被检索,页面上的链接可以被查询。

http-equiv属性

1、<meta http-equiv="Content-Type" contect="text/html";charset=gb_2312-80">

和 <meta http-equiv="Content-Language" contect="zh-CN">用以说明主页制作所使用的文字以及语言;

又如英文是ISO-8859-1字符集,还有BIG5、utf-8、shift-Jis、Euc、Koi8-2等字符集;

2、<meta http-equiv="Refresh" contect="n;url=http://yourlink">定时让网页在指定的时间n内,跳转到页面http;//yourlink;

3、<meta http-equiv="Expires" contect="Mon,12 May 2001 00:20:00 GMT">可以用于设定网页的到期时间,一旦过期则必须到服务器上重新调用。需要注意的是必须使用GMT时间格式;

4、<meta http-equiv="Pragma" contect="no-cache">是用于设定禁止浏览器从本地机的缓存中调阅页面内容,设定后一旦离开网页就无法从Cache中再调出;

5、<meta http-equiv="set-cookie" contect="Mon,12 May 2001 00:20:00 GMT">cookie设定,如果网页过期,存盘的cookie将被删除。需要注意的也是必须使用GMT时间格式;

6、<meta http-equiv="Pics-label" contect="">网页等级评定,在IE的internet选项中有一项内容设置,可以防止浏览一些受限制的网站,而网站的限制级别就是通过meta属性来设置的;

7、<meta http-equiv="windows-Target" contect="_top">强制页面在当前窗口中以独立页面显示,可以防止自己的网页被别人当作一个frame页调用;

8、<meta http-equiv="Page-Enter" contect="revealTrans(duration=10,transtion=

50)">和<meta http-equiv="Page-Exit"

contect="revealTrans(duration=20,transtion

=6)">设定进入和离开页面时的特殊效果,这个功能即FrontPage中的“格式/网页过渡”,不过所加的页面不能够是一个frame页面。

上面是从网上弄到的信息。

我使用的开发工具是MyEclipse,当我创建一个Jsp页面时,MyEclipse就会为我自动创建一个模版,如:
1.MyJsp.jsp:
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">   
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<body>
   <html:form action="userAction">
    Username:<html:text property="username"></html:text>
    <html:submit value="提交"/>
   </html:form>
</body>

2.MyJsp1.jsp:
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">   
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
 <body>
    username:${requestScope.userForm.username}
 </body>

3.struts-config.xml:
<form-beans>
   <form-bean name="userForm" type="com.andy.struts.form.UserForm"></form-bean>
</form-beans>
<forward name="toMyJsp1" path="/MyJsp1.jsp"></forward>
<action-mappings>
   <action path="/userAction" type="com.andy.struts.action.UserAction" name="userForm" scope="request" validate="true">
   </action>
</action-mappings>

4.UserForm:
package com.andy.struts.form;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;

public class UserForm extends ActionForm {
    private String username=null;
  
    public String getUsername() {
  return username;
 }
 public void setUsername(String username) {
  this.username = username;
 }
}

5.UserAction:
return arg0.findForward("toMyJsp1");

当我在浏览器窗口上输入http://localhost:8086/WebRoot/MyJsp.jsp后,并在文本框中输入andy,单击[提交]按钮,结果正确显示username:andy,但我单击浏览器窗口上的[后退]按钮时,可以回到MyJsp.jsp页面,并且在文本框中显示andy.这是为什么呢?在MyJsp.jsp和MyJsp1.jsp页面中不是在<meta/>中设置了expires、pragma和cache-control吗?就算把expires设置为-1,也是一样的.至于为什么出现疑问,是因为我的个人理解是此时这样的设置不是代表着页面失效吗,既然这样,当我单击[后退]按钮时,应该有所提示的才对.而且我还发现如果在提交到MyJsp1.jsp页面后,在单击[后退]按钮之前,我改变了MyJsp.jsp的内容并保存,之后,我再在浏览器上单击[后退]按钮,结果发现此时的MyJsp.jsp页面并不自动更新,而是显示提交那时刻的内容.只有在我按下浏览器窗口上的[刷新]按钮后才显示更新的内容.这个也说明了,当我单击[后退]按钮时,浏览器有可能是从缓冲中提取数据的,而不是到服务器提取数据.那么先前设置expires、pragma和cache-control不是没有任何作用?(个人感觉).

此后,我通过网上搜索到一些关于如何使[后退]按钮时效的方法,其中有:
一、
<script language='javascript'>
history.go(1);
</script>

我理解上面代码的意思,但使用起来会怎么样呢?让我们试一下,首先我在MyJsp.jsp文件中添加了上面的这段代码,然后打开浏览器输入地址,并显示MyJsp.jsp页面的内容.接着我在文本框中输入andy,并提交,显示username:andy,然后我按下浏览器上的[后退]按钮,发现不能回到之前的MyJsp.jsp页面.看来这个方法不错.(但如果是使用location.replace(sURL),我想[后退]按钮应该是灰色的,即不可用).

二、
第二中方法使用的就是上面说的服务端方法和客户端方法,但上面已经说了客户端已经不可用,那么服务器端会怎么样呢?首先我把先前的更改还原到初始状态,即去掉先前的script脚本代码,然后添加如下代码:
<%
response.setHeader("Pragma","no-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", -10);
%>
重新打开浏览器,在窗口中输入地址,在显示的文本框中输入andy并提交,显示username:andy,此时按下浏览器窗口上的[后退]按钮,发现可以回到原来的MyJsp.jsp页面,而上面所说的登录页面和登录后页面都需加,其实我在MyJsp.jsp和MyJsp1.jsp两个都加了,结果还是一样,一样都可以后退到原来的MyJsp.jsp页面.两者还是有点区别的:

即当我只在MyJsp.jsp页面添加代码时,不但可以按下[后退]按钮回到MyJsp.jsp页面,并且此时文本框竟不显示任何内容(惊奇!注意咯),而且回到MyJsp.jsp页面后也可以按下[前进]按钮,回到MyJsp1.jsp页面,并且此时的MyJsp1.jsp页面的内容跟上次[提交]后显示的一样(就算是按下[前进]前修改了MyJsp1.jsp或是在MyJsp.jsp页面的文本框中输入内容,按下[前进]后也不会显示更新的内容).

但如果MyJsp.jsp和MyJsp1.jsp页面都添加的话,有一步是不一样的,即我[后退]到原来的MyJsp.jsp页面后,按下[前进]时,竟显示如下内容:

警告: 网页已经过期您申请的网页是用表单中提交的信息创建的。该网页已失效。由于有安全预警功能,Internet Explorer 不会自动再次提交您的信息。

要重新提交信息并查看该网页,请单击刷新按钮。

单击一下[刷新]按钮后,发现弹出一个对话框,显示警告信息,如下:
!不重新发送信息,则无法刷新页面,请单击"重试"再次发送信息,或单击"取消"返回正查看的页.

单击[重试],结果为:username:andy

后来,我在网上发现有人也有跟我一样的困惑,如:
aspire-tech [普通用户]
请教一下,jsp里面当按IE返回时设置页面过期的问题。
我在jsp文件前面加上了下面的:
<%
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
%>
另外在<head>头里面加上了:
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<meta http-equiv="Expires" CONTENT="0">
<meta http-equiv="Cache-Control" CONTENT="no-cache">
<meta http-equiv="Pragma" CONTENT="no-cache">

但是按IE返回的时候页面没有提示过期,奇怪的是再按IE前进提示过期。
请大虾指教!

maxtiger [普通用户]
<meta http-equiv="expires" content="wed, 26 Feb 1997 08:21:57 GMT">

kidman [普通用户]
如果你前进的那页有提交动作的话,应该是会提示过期的~~~

funove007 [普通用户]
问:我有一个关于 HTML 页截止日期的问题(Windows? XP 和 Microsoft Internet Explorer 6.x)。在 Expire1.htm 中,我指定了页立即过期:

<html>
<head>
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="expires" CONTENT="-1">
</head><body>
<a href="HtmlPage1.htm">HtmlPage1.htm</a>
</body>
</html>

使用 Internet Explorer 时,如果我浏览到 Expire1.htm(使用 HTTP,不是 HTTPS),则当我单击链接之后,会被带入 HtmlPage1.htm。如果我更改 Expire1.htm 的内容,然后单击“Back”按钮,得到的是 Expire1.htm 的旧内容,而不是新内容。在 Internet Explorer 中,我选择了在每次访问该页时都“检查”存储页的更新版本的选项。

答:此行为是设计使然。通过使用 META 标头,您可以依赖于 MSHTML 来判断是否删除缓存中的内容,缓存中内容的删除只由 MSHTML 在这些内容通过安全套接字层 (SSL) 下载时执行。因为您使用“Forward”和“Back”按钮,所以不是真正的导航;您只是在显示前面下载的内容。如果连接不是一个 SSL 连接,MSHTML 则只是为存储在缓存中的内容设置 Expiration 标头。

这些操作取决于 WININET 在下载时是否缓存了文件,您通过在整个网站上设置标头已经发现了这个情况。如果您控制 IIS 服务器或宿主这些 HTML 文件的 Web 服务器,则可以基于站点、目录或文件设置 Expires 标头,因此可以一直向下到文件级别,获得合适的缓存行为。

从 Expire1.htm 导航到 HtmlPage1.htm 之后,但在单击“Forward”和“Back”按钮之前,您需要查看“Tools | Internet options | Settings button | View Files”按钮。在此显示中,找到 Expires1.htm,然后查看“截止期”列。是否存在一个日期/时间反映您何时访问了该文件?如果是,图 2 中显示的规则会在使用“Forward”和“Back”按钮时应用到这些经过缓存的内容。您可能会看到,使用“Forward”和“Back”按钮时,只有当前 Internet Explorer 会话期间尚未下载内容的情况下才会发生同步。

现在为了获得您希望的行为,在加载了 HtmlPage1.htm 之后,请不要使用“Forward”和“Back”按钮来访问 Expire1.htm,而是单击地址栏,然后手动输入 Expire1.htm 的完整路径。这样应该会导致显示新内容,因为现在缓存规则是基于超链接单击或地址栏导航的。这种情况下,内容的“截止期”将决定是否应该再次下载该内容。

我看了上面funove007用户的内容后,按照[Tools | Internet options | Settings button | View Files]步骤看到此时临时文件里面只有一个后缀为.jsp的文件,即MyJsp.jsp,而MyJsp1.jsp没有看到,而且[截止期]为[无].(不管是只有MyJsp.jsp添加了还是两个文件都添加,其情况是一样的).

后来两个文件都不添加了,可在临时文件下看到的情况还是一样的,即[截止期]为[无].

上面有个maxtiger用户提到的方法是使用<meta http-equiv="expires" content="wed, 26 Feb 1997 08:21:57 GMT">,我也不知道行不行,决定试一下,现把之前在两个文件中添加的代码去掉,然后把<meta http-equiv="expires" content="0">改为<meta http-equiv="expires" content="wed, 26 Feb 1997 08:21:57 GMT">,打开浏览器,在窗口中输入地址,并在文本框中输入andy,提交,正确显示后,发现按下[后退]和[前进]都可行.难道需要添加
<%
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
%>

试一下,接着我在MyJsp.jsp页面中添加这段代码,发现还是可以[后退]和[前进]..

看来,到目前为止,只有第一种方法可行,而第二种方法不可行的真正原因在哪,我也不清楚,希望以后可以得到解决.

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页