Servlet过滤器——使用过滤器禁止浏览器缓存页面
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)" |
邮政编码 |
|||
|
|
type="text" size="20" class="inputcss" onBlur="chkreginfo(form_reg,3)" |
QQ号码 |
|||
|
|
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="data: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>
Servlet过滤器——使用过滤器禁止浏览器缓存页面的更多相关文章
- 禁止浏览器缓存- make sure web page is not cached
如何禁止浏览器缓存,网上搜到的解决方法都测试无效. 基本上全都是 Cache-Control: no-cache Pragma: no-cache Expires: 0 Google了一下,找到了解决 ...
- 使用Filter防止浏览器缓存页面或请求结果
仅仅须要两步: 1.定义一个Filter: /** * 防止浏览器缓存页面或请求结果 * @author XuJijun * */ public class NoCacheFilter impleme ...
- filter 过滤器 禁止浏览器缓存
public class BrowserNoCacheFilter implements Filter { public void init(FilterConfig filterconfig) th ...
- 禁止浏览器缓存input值
如果不想让浏览器缓存input的值,有2种方法: 方法一: 在不想使用缓存的input中添加 autocomplete="off"; <input type="te ...
- nginx 禁止浏览器缓存
如果我们使用Nginx作为静态资源服务器,那么可以使用expires进行缓存控制. location /{ expires 1s; } 如果Get页面未做任何修改,服务器就是对客户端返回304 Not ...
- 谷歌浏览器(Chrome)禁止浏览器缓存 设置
在开发项目期间用谷歌浏览器调试,他总是缓存我的css样式这个很气人啊,后经过摸索找到了方法,如下 先F12或者shift+ctrl+j 打开调试者工具,在找Network这个tab按钮,点击进入,勾选 ...
- 禁止浏览器缓存js
方法:在js文件后加上数学随机数; Math.random() 比如:源代码为 <script src="./js/lib/require/require.js" data- ...
- ajax禁止浏览器缓存
把cache 设置为false ,把 ifModified 设置为true //工作计划function workprogram(date_time){ $.ajax({ asyn ...
- 禁止火狐浏览器缓存input标签方法
禁止火狐浏览器缓存input标签方法 问题1:在火狐浏览器里,云平台的输入框.选项框.勾选框…填写之后按F5刷新页面,之前填的东西会保留着,其它浏览器不会火狐强制刷新用Ctrl + F5 浏览器自动保 ...
随机推荐
- smarty 截取字符串,调用php中的方法,foreach循环
1.smarty截取字符串 html中的代码 <{$content|truncate:30:"..."}> ...
- Hibernate JPA 中配置Ehcache二级缓存
在Hibernate3 JPA里配置了一下非分布式环境的二级缓存,效果不错.具体过程如下: 1, 需要引入的jar包 http://ehcache.org/downloads/catalog 下载的包 ...
- ThinkPHP 3.1.2 URL<1>
# # ThinkPHP 3.1.2 URL 本节课大纲: 一.URL规则 1.默认是区分大小写的 2.如果我们不想区分大小写可以改配置文件 'URL_CASE_INSENSITIVE'=>tr ...
- 11g的alert日志路径
一个测试库,11g,没有sys账户,无法用show parameter dump查看alert日志的路径,以前也碰到过,但后来就不了了之了.这次深挖下,也参考了下一些网上的帖子,于是找到了: $ORA ...
- MongoDB 操作手冊CRUD查询指针
枚举遍历指针 概述 前面已经讲过,db.collection.find()假设没有指定给一个var声明的变量.将自己主动枚举前20条记录. 手动枚举指针 在mongo控制台中.将查询赋给一个var声明 ...
- Unity3d 网络编程(二)(Unity3d内建网络各项參数介绍)
这里是全部Unity3d在网络中能用到相关的类及方法.纵观參数功能, Unity3d来写一个手游是不二的选择: RPC 能够传递的參数 int float string NetworkPlayer N ...
- BZOJ 1014: [JSOI2008]火星人prefix( splay + hash )
用splay维护序列, 二分+hash来判断LCQ.. #include<bits/stdc++.h> using namespace std; typedef unsigned long ...
- shell字符串替换
- RTSP调试代码
#ifdef _WIN32_WCE #include "stdafx.h" #endif #ifndef _WIN32_WCE #define WIN32_LEAN_AND_MEA ...
- JavaScript提高:005:ASP.NET使用easyUI TABS标签显示问题
前面使用easy ui来实现了一个tabs标签(http://blog.csdn.net/yysyangyangyangshan/article/details/38307477),只是在ASP.NE ...