Filter(过滤器)常见应用(一)
2016-08-29 20:17
441 查看
统一全站字符编码
通过配置参数charset指明使用何种字符编码,以处理Html Form请求参数的中文问题。// 解决全站中文乱码 public class CharacterEncodingFilter implements Filter { private FilterConfig config; private String defaultCharset = "UTF-8"; @Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { // 获取要设置的字符集 String charset = this.config.getInitParameter("charset"); if (charset == null) { charset = defaultCharset; } HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp; request.setCharacterEncoding(charset); response.setCharacterEncoding(charset); response.setContentType("text/html;charset=" + charset); chain.doFilter(request, response); } @Override public void init(FilterConfig filterConfig) throws ServletException { this.config = filterConfig; } @Override public void destroy() { } }
在web.xml文件中配置以上过滤器:
<filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class> cn.itcast.web.filter.example.CharacterEncodingFilter</filter-class> <init-param> <param-name>charset</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
禁止浏览器缓存所有动态页面
有3个HTTP响应头字段都可以禁止浏览器缓存当前页面,它们在Servlet中的示例代码如下:response.setDateHeader(“Expires”,-1);
response.setHeader(“Cache-Control”,”no-cache”);
response.setHeader(“Pragma”,”no-cache”);
并不是所有的浏览器都能完全支持上面的三个响应头,因此最好是同时使用上面的三个响应头。
Expires数据头:值为GMT时间值,为-1指浏览器不要缓存页面。
Cache-Control响应头有两个常用值:
no-cache:指浏览器不要缓存当前页面。
max-age:xxx:指浏览器缓存页面xxx秒。
在Eclipse中新建一个day19_test的web项目,在该项目下创建网站首页index.jsp,代码为:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% System.out.println("index!!!"); %> </body> </html>
我们以IE 9浏览器作为测试工具,先清空IE浏览器的缓存,关于怎么清空IE浏览器的缓存可以参考我的笔记查看与清空有关浏览器的缓存——清空IE浏览器的缓存。
然后打开IE浏览器,输入访问服务器的地址
http://localhost:8080/day19_test/index.jsp,这时查看IE浏览器的缓存目录,发现index.jsp这个web动态资源缓存在里面。
这时我们要禁止IE浏览器缓存所有动态页面,所以要编写一个禁止浏览器缓存所有动态页面的过滤器。
public class NoCacheFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp; response.setDateHeader("Expires",-1); response.setHeader("Cache-Control","no-cache"); response.setHeader("Pragma","no-cache"); chain.doFilter(request, response); } @Override public void destroy() { // TODO Auto-generated method stub } }
web.xml文件中的配置如下:
<filter> <filter-name>NoCacheFilter</filter-name> <filter-class>cn.itcast.web.filter.example.NoCacheFilter</filter-class> </filter> <filter-mapping> <filter-name>NoCacheFilter</filter-name> <!-- 拦截所有jsp的访问 --> <url-pattern>*.jsp</url-pattern> </filter-mapping>
这时再次清空IE浏览器的缓存,然后打开IE浏览器,输入访问服务器的地址
http://localhost:8080/day19_test/index.jsp,会发现IE浏览器的默认缓存目录下没有缓存index.jsp页面。
控制浏览器缓存页面中的静态资源
有些动态页面中引用了一些图片或css文件以修饰页面效果,这些图片和css文件经常是不变化的,所以为减轻服务器的压力,可以使用filter控制浏览器缓存这些文件,以提升服务器的性能。现在将day19_test该Web应用下的网站首页index.jsp修改为:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> Hello World!!!<br/> <img src="${pageContext.request.contextPath }/images/Krystal.jpg"> </body> </html>
这时我们就要创建一个控制浏览器缓存页面中的静态资源的过滤器。
// 控制浏览器缓存的过滤器 public class CacheFilter implements Filter { private FilterConfig config; @Override public void init(FilterConfig filterConfig) throws ServletException { this.config = filterConfig; } @Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp; // 1. 获取到用户想访问的资源 String uri = request.getRequestURI(); // 2. 获取该资源的缓存时间 int expires = 0; if (uri.endsWith(".jpg")) { expires = Integer.parseInt(this.config.getInitParameter("jpg")); } else if (uri.endsWith(".css")) { expires = Integer.parseInt(this.config.getInitParameter("css")); } else { expires = Integer.parseInt(this.config.getInitParameter("js")); } // response.setDateHeader("expires", expires*60*1000); // 这个缓存时间值是1970-01-01 08:00:00到现在时刻的毫秒值,应该在当前时间值上加上一分钟,这是才缓存一分钟 response.setDateHeader("expires", System.currentTimeMillis() + expires*60*1000); chain.doFilter(request, response); } @Override public void destroy() { // TODO Auto-generated method stub } }
在编写上述过滤器时一定要注意一个细节:Expires相应头的值为GMT时间值,即从1970-01-01 08:00:00到现在时刻的毫秒值。应该在当前时间值上加上一分钟,这是才缓存一分钟。
web.xml文件中的配置如下:
<filter> <filter-name>CacheFilter</filter-name> <filter-class>cn.itcast.web.filter.example.CacheFilter</filter-class> <!-- 配置要缓存的web资源以及缓存时间,以分钟为单位 --> <init-param> <param-name>css</param-name> <param-value>10</param-value> </init-param> <init-param> <param-name>jpg</param-name> <param-value>1</param-value> </init-param> <init-param> <param-name>js</param-name> <param-value>20</param-value> </init-param> </filter> <!-- 配置要缓存的web资源的后缀--> <filter-mapping> <filter-name>CacheFilter</filter-name> <url-pattern>*.jpg</url-pattern> </filter-mapping> <filter-mapping> <filter-name>CacheFilter</filter-name> <url-pattern>*.css</url-pattern> </filter-mapping> <filter-mapping> <filter-name>CacheFilter</filter-name> <url-pattern>*.js</url-pattern> </filter-mapping>
注意:一个
<filter>可以对应多个
<filter-mapping>。
现在加上前面还有一个禁止浏览器缓存所有动态页面的过滤器,那么就有2个过滤器了,形成了一个过滤器链。打开IE浏览器,输入访问服务器的地址
http://localhost:8080/day19_test/index.jsp,那么在IE浏览器默认的缓存目录里面将不会缓存index.jsp这个页面,但会缓存Krystal.jpg这个静态图片,而且缓存一分钟。如果在这一分钟之内,通过在IE浏览器的地址栏上敲回车键的行为去访问服务器,那么只会向服务器发送一次请求,即请求index.jsp这个动态Web资源,至于index.jsp页面中的Krystal.jpg静态图片,会从IE浏览器默认的缓存目录里面获取;如果通过点击刷新按钮的行为去访问服务器,那么将会向服务器发送二次请求,第一次请求index.jsp这个动态Web资源,第二次请求index.jsp页面中的Krystal.jpg静态图片。因为刷新有两个作用:
不管你有没有缓存,都要向服务器发请求。
刷新就是把上次的事情再干一次。
但我们平时访问网站,不是通过刷新去访问的,都是点击超链接。
相关文章推荐
- Filter(过滤器)常见应用
- javaweb学习总结(四十六)——Filter(过滤器)常见应用
- Filter(过滤器)常见应用(三)——权限管理系统(一)
- javaweb学习总结(四十六)——Filter(过滤器)常见应用
- Filter(过滤器)常见应用
- Filter(过滤器)常见应用
- javaweb学习总结Filter(过滤器)常见应用
- Filter(过滤器)常见应用(三)——权限管理系统(二)
- Filter(过滤器)常见应用
- javaweb学习总结(四十六)——Filter(过滤器)常见应用
- javaweb中Filter(过滤器)的常见应用
- 过滤器----张国亮总结第三季之Filter常见应用
- javaweb学习总结(四十六)——Filter(过滤器)常见应用
- Filter(过滤器)常见应用(三)——权限管理系统(三)
- javaweb学习总结(四十六)——Filter(过滤器)常见应用
- javaweb学习总结(四十六)——Filter(过滤器)常见应用
- javaweb学习总结(四十六)——Filter(过滤器)常见应用
- 过滤器----张国亮总结第三季之Filter常见应用
- Filter(过滤器)常见应用
- javaWeb学习总结(10)- Filter(过滤器)常见应用(3)