有关采用Filter实现禁用缓存和使用缓存操作实现与分析

来源:互联网 发布:怎么开家淘宝店 编辑:程序博客网 时间:2024/05/21 08:52

1.缓存:

  为了提高访问网页的速率,InternetExplorer浏览器会采用累积式加速的方法,将曾经访问的网页内容(包括图片以及cookie文件等)存放在电脑里。这个存放空间,就称它为IE缓存。以后每次访问网站时,IE会首先搜索这个目录,其中已经有访问过的内容,那IE就不必从网上下载,而直接从缓存中调出来,从而提高了访问网站的速率。

2.jsp采用模板元素设置禁用缓存的代码

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <meta http-equiv="pragma" content="no-cache">  
  2.   
  3. <meta http-equiv="cache-control" content="no-cache">  
  4.   
  5. <meta http-equiv="expires" content="0">   

说明:
<meta http-equiv="pragma" content="no-cache">
禁止浏览器从本地缓存中调阅页面,网页不保存在缓存中,每次访问都刷新页面
<meta http-equiv="cache-control" content="no-cache">
同上说明
<meta http-equiv="expires" content="0">
网页在缓存中的过期时间为0,一旦网页过期,必须从服务器上重新订阅


一::::根据以上的了解,我们进行采用Filter过滤器 进行完成动态web资源访问的时候,禁用缓存的操作效果的实现
1.创建Filter过滤器的实现类

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package www.csdn.net.day55.filter;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.Filter;  
  6. import javax.servlet.FilterChain;  
  7. import javax.servlet.FilterConfig;  
  8. import javax.servlet.ServletException;  
  9. import javax.servlet.ServletRequest;  
  10. import javax.servlet.ServletResponse;  
  11. import javax.servlet.http.HttpServletRequest;  
  12. import javax.servlet.http.HttpServletResponse;  
  13.   
  14. public class NoCacheFilter implements Filter {  
  15.   
  16.     @Override  
  17.     public void destroy() {  
  18.         // TODO Auto-generated method stub  
  19.   
  20.     }  
  21.   
  22.     @Override  
  23.     public void doFilter(ServletRequest req, ServletResponse res,  
  24.             FilterChain chain) throws IOException, ServletException {  
  25.   
  26.         HttpServletResponse response = (HttpServletResponse) res;  
  27.         HttpServletRequest request = (HttpServletRequest) req;  
  28.   
  29.         response.setDateHeader("Expires", -1);  
  30.         response.setHeader("Cache-Control""no-cache");  
  31.         response.setHeader("Pragma""no-cache");  
  32.         // 修改  
  33.         chain.doFilter(request, response);// 执行目标方法  
  34.     }  
  35.   
  36.     @Override  
  37.     public void init(FilterConfig filterConfig) throws ServletException {  
  38.         // TODO Auto-generated method stub  
  39.   
  40.     }  
  41.   
  42. }  

2.在web.xml文件进行配置操作
[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <filter>  
  2.       <filter-name>NoCacheFilter</filter-name>  
  3.       <filter-class>www.csdn.net.day55.filter.NoCacheFilter</filter-class>  
  4.   </filter>  
  5.     
  6.     
  7.   <filter-mapping>  
  8.       <filter-name>NoCacheFilter</filter-name>  
  9.       <url-pattern>*.do</url-pattern>  
  10.   </filter-mapping>  

根据以上配置 就可以实现,当以.do结尾,访问web资源的时候,即可达到实现禁用缓存的效果.
怎么演示尼,下面我创建一个演示的servlet
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package www.csdn.net.day55.servlet;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.ServletException;  
  6. import javax.servlet.http.HttpServlet;  
  7. import javax.servlet.http.HttpServletRequest;  
  8. import javax.servlet.http.HttpServletResponse;  
  9.   
  10. public class UserServlet extends HttpServlet {  
  11.   
  12.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  13.             throws ServletException, IOException {  
  14.         System.out.println("--------------------doGet------------------");  
  15.     }  
  16.   
  17.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  18.             throws ServletException, IOException {  
  19.         this.doGet(request, response);  
  20.     }  
  21.   
  22. }  

serlvet的映射为文件web.xml中的陪配置
[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <servlet>  
  2.     <description>This is the description of my J2EE component</description>  
  3.     <display-name>This is the display name of my J2EE component</display-name>  
  4.     <servlet-name>UserServlet</servlet-name>  
  5.     <servlet-class>www.csdn.net.day55.servlet.UserServlet</servlet-class>  
  6.   </servlet>  
  7.   
  8.   <servlet-mapping>  
  9.     <servlet-name>UserServlet</servlet-name>  
  10.     <url-pattern>/userOper.do</url-pattern>  
  11.   </servlet-mapping>  

3.演示采用最新IE版本中自带的开发人员工具 (通过一下设置打开)

1.找到锯齿工具条



2.选择F12开发人员工具,弹出一下效果


3.在地址栏中输入访问的地址,例如:http://localhost:8080/day55/userOper.do,点击上图中的绿色三角形.变成如下效果


4.然后可以在地址栏中回车,观察效果,可以看到每次返回的结果都是200,这也说明了每次都是从服务器获取页面,并刷新的操作.




备注: 在每次请求后 servlet 都会在后台打印输出一次




二::::根据以上的了解,我们进行采用Filter过滤器 进行完成动态web资源访问的时候,采用缓存的操作的效果实现

1.创建Filter过滤器的实现类

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package www.csdn.net.day55.filter;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.Filter;  
  6. import javax.servlet.FilterChain;  
  7. import javax.servlet.FilterConfig;  
  8. import javax.servlet.ServletException;  
  9. import javax.servlet.ServletRequest;  
  10. import javax.servlet.ServletResponse;  
  11. import javax.servlet.http.HttpServletRequest;  
  12. import javax.servlet.http.HttpServletResponse;  
  13.   
  14. public class CacheFilter  implements Filter{  
  15.   
  16.     private FilterConfig filterConfig;  
  17.     @Override  
  18.     public void destroy() {  
  19.         // TODO Auto-generated method stub  
  20.           
  21.     }  
  22.   
  23.     @Override  
  24.     public void doFilter(ServletRequest req, ServletResponse res,  
  25.             FilterChain chain) throws IOException, ServletException {  
  26.         //设置缓存  
  27.         //把请求的 req,res 造型为HttpServletResponse,HttpServletRequest  
  28.         HttpServletResponse response = (HttpServletResponse) res;  
  29.         HttpServletRequest request = (HttpServletRequest) req;  
  30.         String date = filterConfig.getInitParameter("date");  
  31.         response.setDateHeader("Expires", System.currentTimeMillis()+Integer.valueOf(date)*1000);     
  32.         chain.doFilter(request, response);  
  33.           
  34.     }  
  35.   
  36.     @Override  
  37.     public void init(FilterConfig filterConfig) throws ServletException {  
  38.         this.filterConfig=filterConfig;  
  39.           
  40.     }  
  41.   
  42. }  
2.在web.xml文件进行配置操作

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1.  <filter>  
  2.     <filter-name>CacheFilter</filter-name>  
  3.     <filter-class>www.csdn.net.day55.filter.CacheFilter</filter-class>  
  4.     <init-param>  
  5.       <param-name>date</param-name>  
  6.       <!-- 10毫秒 -->  
  7.       <param-value>10</param-value>  
  8.       </init-param>  
  9. </filter>  
  10.   
  11.   
  12.   
  13.  <filter-mapping>  
  14.     <filter-name>CacheFilter</filter-name>  
  15.     <url-pattern>*.do</url-pattern>  
  16. </filter-mapping>  

根据以上配置 就可以实现,当以.do结尾,访问web资源的时候,即可达到实现缓存的效果.

怎么演示尼(采用上面的那个写好的Servlet即可测试)

3.演示采用最新IE版本中自带的开发人员工具 (通过一下设置打开)

1.找到锯齿工具条



2.选择F12开发人员工具,弹出一下效果


3.在地址栏中输入访问的地址,例如:http://localhost:8080/day55/userOper.do,点击上图中的绿色三角形.变成如下效果



4.然后可以在地址栏中回车,观察效果



效果说明:

     当第一次访问的时候,返回结果是200,代表从服务获取,并刷新。
     当第二次访问的时候如果在缓存的有效时间内 ,就直接使用,返回的结果可以看到是304

     上图可以说明:第三次,第四次访问 ,都在缓存的有效时间内。

    当第五次访问的时候,由于不在缓存的有效时间内,又重新从服务获取,并刷新

    第六次,第七次访问 ,都在缓存的有效时间内,直接使用.

通过以上分析 ,希望你对缓存的使用有更深入的了解.


备注: 在每次请求后 ,会根据返回的结果是否是200,如果是200 servlet 都会在后台打印输出一次,否则就不打印



译音+本切
0 0
原创粉丝点击