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 浏览器自动保 ...
随机推荐
- Windows Phone 8初学者开发—第18部分:在页面间导航
原文 Windows Phone 8初学者开发—第18部分:在页面间导航 原文地址: http://channel9.msdn.com/Series/Windows-Phone-8-Developm ...
- jquery 单击li防止重复加载的实现代码
因为加载内容比较慢,所以用户可能在li上不经意点击了两次,那么就会请求两次,这是我们不想看到的. 今天在javascript-jquery群上一筒子发了两个demo给我,他的方法是先将单击的li节点拷 ...
- HDU 4738 双连通模版题
九野的博客,转载请注明出处:http://blog.csdn.net/acmmmm/article/details/11711577 题意:给定n个点,m条无向边 下面m行表示u , v ,边权值 求 ...
- grep命令參数及使用方法
功能说明:查找文件中符合条件的字符串. 语 法:grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>] ...
- Permutations【python】
class Solution: # @param num, a list of integer # @return a list of lists of integers def permute(se ...
- Python 第六篇(中):面向对象编程中级篇
面向对象编程中级篇: 编程思想概述: 面向过程:根据业务逻辑从上到下写垒代码 #最low,淘汰 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 #混口饭吃 def add(ho ...
- Android Studio创建库项目及引用
Android Studio创建库项目其实创建的是在主项目下创建Module模块,这个Module模块创建的时候选择库项目模式. 为什么要这样处理呢?因为在Android Studio中一个WorkS ...
- 使用Spring标签库
A.Spring标签库 Web项目若使用Spring Web MVC并使用JSP作为表现的话.从Spring2.0版本开始提供一套标签库可供使用. 使用标签库无非是易于开发,维护之类云云.这里就不阐述 ...
- 清华集训2014 day2 task3 矩阵变换
题目 算法 稳定婚姻系统(其实就是贪心) 一个方案不合法,当且仅当下面这种情况: 设第\(i\)行选了数字\(x\),如果第\(j\)行有一个\(x\)在第\(i\)行的\(x\)后面,并且第\(j\ ...
- 业余写的一个播放器SDK,求点意见
好久没写博客了 现大致花了半年时间私下写一个音频SDK,想请csdn的达人提点意见,看看还需要增加哪些功能 我对这个的定位如下: 可以在游戏开发中播放音乐,作为一般的音频播放器后端,作为音频编辑器后端 ...