使用Filter过滤器禁止浏览器缓存页面

1.概述

     IE缓存虽然能提高已储存网站的访问速度,但是过度的IE缓存会影响浏览器的响应速度。同时还可能为网站的运行带来一些不必要的麻烦。例如:可能会因为浏览器缓存的应用,而导致Web服务器不能准确的计算一个页面或广告已被阅览的次数;在论坛或者网上商城系统中由于浏览器缓存的使用,导致更新的图片信息不能得到及时的显示;还有由于浏览器缓存的使用,而使网页设计者不能立即查看到网页更新后的效果。

    所以在开发网站的过程中,最好是在程序中禁止浏览器缓存页面,从而避免上述问题的出现,也省去了手动清空浏览器缓存的麻烦。

    本实例中应用过滤器在网站的运行过程中禁止浏览器缓存页面。当运行本实例时,注册明日购物网的用户,注册成功后。选择IE浏览器,单击鼠标右键选择“属性”命令,弹出Internet属性对话框,选择常规选项卡,在Internet临时文件中单击“设置”按钮,在弹出的设置对话框中单击“查看文件”按钮,将看到浏览器缓存中存储的文件,而此时该文件夹下没有任何文件。

2.技术要点

     浏览器缓存(Browser Caching)是为了加速浏览,浏览器在用户磁盘上对最近请求过的文档进行存储,当访问者再次请求这个页面时,浏览器就可以从本地磁盘显示文档,这样就可以加速页面的阅览。

     本实例主要应用过滤器可以重新设置请求报头信息的特点,在过滤器中设置HTML中meta标签的http-equiv属性,实现禁止浏览器缓存的功能。

     meta是HTML语言head区的一个辅助性标签。meta标签有两个属性:http-equiv属性和name属性。

     (1)name属性

         用于描述网页,与之对应的属性值为content。content中的内容主要是用于搜索引擎机器人查找信息和分类信息。语法如下:

<meta name="参数" content="具体的参数值"> 

        name属性的参数如表1所示。

表1 name属性的参数说明

参数

说明

举例

keywords

描述网页的关键字

<meta name ="keywords" content="明日科技,明日软件,明日图书">

description

描述网站的主要内容

<meta name="description" content="软件开发,图书编著">

robots

告诉搜索机器人哪些页面需要索引,哪些页面不需要索引。content的参数有all,none,index,noindex,follow,nofollow。默认是all

<meta name="robots" content="none">

author

标注网页的作者

<meta name="author" content="吉林省明日软件公司科技有限公司">

(2)http-equiv属性

http-equiv相当于http的文件头作用,可以向浏览器传回一些有用信息,以帮助正确和精确地显示网页内容,与之对应的属性值为content。content中的内容是各个参数的变量值。语法如下:

<meta http-equiv="参数" content="参数变量值">

<meta http-equiv="参数" content="参数变量值">

表2 http-equiv属性的参数说明

参数

说明

举例

expires

设定网页的到期时间,一旦网页过期,必须到服务器上重新传输

<meta http-equiv="expires" content="Fri, 10 Jan 2009 09:09:09 GMT">

注意:必须使用GMT的时间格式

Pragma

禁止浏览器从本地计算机的缓存中访问页面内容

<meta http-equiv="Pragma" content="no-cache">

Refresh

自动刷新并指向新页面

<meta http-equiv="Refresh" content="5;URL=http://www.mingribook.com">

Set-Cookie

如果网页过期,那么存储的cookie将被删除

<meta http-equiv="Set-Cookie" content="cookievalue=xxx;expires= Fri, 10 Jan 2009 09:09:09 GMT;path=/">

Window-target

强制页面在当前窗口以独立页面显示

<meta http-equiv="Window-target" content="_top">

用来防止在框架里调用自己的页面。

content-Type

设定页面使用的字符集。

<meta http-equiv="content-Type" content="text/html; charset=UTF-8">

     上述是对meta标签的详细讲解,在本实例中主要应用的是http-equiv属性中的expires和Pragma参数,控制网页的过期时间和禁止浏览器从本地计算机的缓存中访问页面内容。

     而真正控制网页缓存的是HTTP消息头中的Cache-control。其常见值有private、no-cache、max-age和must-revalidate等,默认值为private。

Cache-control的作用根据浏览方法的不同可以分为以下几种情况。

(1)以打开新窗口的方式进行浏览

     如果指定cache-control的值为private、no-cache或者must-revalidate,那么打开新窗口访问时都会重新访问服务器;如果指定的值为max-age,那么在此值规定的时间里就不会重新访问服务器,例如:Cache-control: max-age=10。表示当访问此网页后的10秒内再次访问不会去服务器。

(2)在地址栏中单击回车进行浏览

     如果值为private或must-revalidate,则只有第一次访问时会访问服务器,以后就不再访问;如果值为no-cache,那么每次都会访问;如果值为max-age,则在过期之前不会重复访问。

(3)按后退按扭进行浏览

    如果值为private、must-revalidate、max-age,则不会重复访问;如果值为no-cache,则每次都重复访问。

(4)按刷新按扭

    无论为何值,都会重复访问。如果指定Cache-control值为“no-cache”时,访问此页面不会在Internet临时文件夹中留下页面备份。

3.具体实现

(1)首先创建index.jsp文件,生成明日购物网的用户注册页面。Form表单中的元素如表3所示。

表3 form表单中使用的元素

类型

名称

属性设置

说明

 

form_reg

method="post" action="index_ok.jsp" onSubmit="return chkreginfo(form_reg,'all')

表单名称

 
 

recuser

type="text" size="20" class="inputcss" onBlur="chkreginfo(form_reg,0)"

用户名

 

address

type="text" size="60" class="inputcss" onBlur="chkreginfo(form_reg,1)"

联系地址

 

postalcode

type="text" size="20" class="inputcss" onBlur="chkreginfo(form_reg,2)"

邮政编码

 

qq

type="text" size="20" class="inputcss" onBlur="chkreginfo(form_reg,3)"

QQ号码

 

email

type="text" size="20" class="inputcss" onBlur="chkreginfo(form_reg,4)"

邮箱地址

 

mtel

type="text" size="20" class="inputcss" onBlur="chkreginfo(form_reg,5)"

手机号码

 

gtel

type="text" size="20" class="inputcss" onBlur="chkreginfo(form_reg,6)"

座机号码

 
 

imageField

type="image" src="images/sy_15.jpg"

提交按钮

 

ImageField2

onClick="form_reg.reset()"style="cursor:hand"

取消按钮

 
           

(2)创建index_ok.jsp文件,输出从Request对象中获取的提交数据。

(3)创建BrowserNoCacheFilter类,通过过滤器禁止浏览器缓存页面。在doFilter()方法中为meta标签的http-equiv属性设置三个参数:Cache-Control、Pragma和Expires,禁止浏览器缓存页面。其关键代码如下:

public class BrowserNoCacheFilter implements Filter {
    public void init(FilterConfig filterconfig) throws ServletException {
    }
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterchain) throws IOException, ServletException {
        ((HttpServletResponse) response).setHeader("Cache-Control", "no-cache");      //HTTP消息头,控制网页的缓存
        ((HttpServletResponse) response).setHeader("Pragma", "no-cache");        //禁止浏览器从缓存中调阅页面内容
        ((HttpServletResponse) response).setHeader("Expires", "-1");                   //指定网页在缓存中的过期时间
        filterchain.doFilter(request, response);
    }
    public void destroy() {
    }
}

(4)最后在web.xml文件中配置BrowserNoCacheFilter类,为过滤器创建初始值。首先通过<filter></filter>标签配置Servlet过滤器的名称和所在包的类名,然后通过<init-param></ init-param>标签设置过滤器的初始值,最后通过<filter-mapping></filter-mapping>标签配置Servlet过滤器的映射路径。其关键代码如下:

<filter>
      <!—servlet过滤器的名称 -->
         <filter-name>BrowserNoCacheFilter</filter-name>
   <!—servlet过滤器的包所在类名称-->
      <filter-class>com.pkh.BrowserNoCacheFilter</filter-class>
       <init-param>
            <param-name>Cache-control</param-name>
            <param-value>no-cache</param-value>
        </init-param>
        <init-param>
            <param-name>Pragma</param-name>
            <param-value>no-cache</param-value>
        </init-param>
        <init-param>
            <param-name>Expires</param-name>
            <param-value>-1</param-value>
        </init-param>
</filter>
     <filter-mapping>
            <!--要映射的servlet过滤器名称-->
           <filter-name>BrowserNoCacheFilter </filter-name>
            <!--要映射的servlet过滤器映射的范围--> 
            <url-pattern>/ *</url-pattern>
           <dispatcher>REQUEST</dispatcher>
           <dispatcher>FORWARD</dispatcher>
    </filter-mapping>

猜你喜欢

转载自blog.csdn.net/qq_37211608/article/details/81362417
今日推荐