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 浏览器自动保 ...
随机推荐
- poemel 端口作用
clientPort 用于connetor组件启动时候,监听的调用,用于客户端连接 port用于服务器间通信,即rpc调用时候使用,在remote组件启动时候,生成remote,即gateway实例, ...
- 网络编程(UDP协议-聊天程序)
网络编程中的UDP协议中聊天程序,发送端口,和接受端口. 发送端口(Send): <span style="font-size:18px;">package cn.it ...
- [转]Windows7 64bit下配置Apache+PHP+MySQL
原文链接:http://blog.csdn.net/sbz0409/article/details/12946375 1.准备资料: 首先下载文件:Apache2.4.16 64bit,http:// ...
- javascript复制
1.实现点击按钮,复制文本框中的的内容 1 <scrip type="text/javascript"> 2 function copyUrl2() 3 { 4 var ...
- (未解决)在JSTL中,session 和 sessionScope 有什么区别 ??
在JSP页面中,使用JSTL标签获取Session中的值并显示 为何当使用 ${session.user} 时,页面跳转后,第一次能够成功显示, 但是单击按钮重定向的时候,就获取不到了? 而使用 ${ ...
- 一步一步重写 CodeIgniter 框架 (6) —— 实现在控制器Controller中加载View
1. 控制器将模型类获得的数据,传递给视图进行显示,所以视图必须负责接收数据,另外重要的一点是当模型和视图分开后,多个模型的数据可以传递给一个视图进行展示,也可以说一个模型的数据在多个不同的视图中进行 ...
- URAL 1820. Ural Steaks(数学啊 )
题目链接:space=1&num=1820" target="_blank">http://acm.timus.ru/problem.aspx? space ...
- Search a 2D Matrix【python】
class Solution: # @param matrix, a list of lists of integers # @param target, an integer # @return a ...
- iOS 7 - Auto Layout on iOS Versions prior to 6.0
链接地址:http://stackoverflow.com/questions/18735847/ios-7-auto-layout-on-ios-versions-prior-to-6-0 Stac ...
- File 操纵目录
mkdir() 创建目录 不可及联创建 即父路径中一旦有不存在文件夹 即创建失败 mkdirs() 创建目录,及联创建 list() 列出目录内所包含的文件名(string) listFi ...