`
zzc1684
  • 浏览: 1223182 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

对相应内容进行压缩的过滤器

阅读更多
目前主流的浏览器和Web服务器都支持网页的压缩  浏览器和Web服务器对于压缩网页通信过程如下
 
#  如果浏览器能够接受压缩后的网页内容 那么他会在请求中发送Accept-Encoding请求报头 值为"gzip.deflate"  表明浏览器支持gzip和deflate这两种压缩方式
 
#  Web服务器读取Accept-Encoding请求报头的值来判断浏览器是否接受压缩的内容 如果接受 Web服务器就讲目标页面的响应内容采用gzip压缩方式压缩后再发送到客户端 同时设置Content-Encoding实体报头 值为gzip 以告知浏览器实体正文采用了gzip的压缩编码
 
#  浏览器接收到响应内容后 根据Content-Encoding实体报头的值对响应内容解压缩 然后显示相应页面的内容
 
 
我们可以通过过滤器对目标内容进行压缩 是吸纳原理就是实用包装类对象替换原始响应对象  并使用java.util.zip.GZIPOutputStream作为响应内容的输出流对象  GZIPOutputStream是是过滤流类 他使用GZIP压缩格式写入压缩对象
 
步骤
 
1  GZIPServletOutputStream.java
GZIPStreamOutputStream继承自ServletOutputStream  该类的对象用于替换HttpServletResponse.getOutputStream()方法返回的ServletOutputStream对 象  其内部使用GZIPOutputStream的write(int b)方法实现ServletOutputStream类的write(int b)方法 以达到压缩数据的目的
  1. package filter;
  2. import java.io.IOException;
  3. import java.util.zip.GZIPOutputStream;
  4. import javax.servlet.ServletOutputStream;
  5. public class GZIPServletOutputStream extends ServletOutputStream
  6. {
  7.     private GZIPOutputStream gzipos;
  8.     public GZIPServletOutputStream(ServletOutputStream sos) throws IOException
  9.     {
  10.         //使用响应输出流对象构造GZIPOutputStream过滤流对象
  11.         this.gzipos = new GZIPOutputStream(sos);        
  12.     }
  13.     @Override
  14.     public void write(int data) throws IOException
  15.     {
  16.         //将写入操作委托给GZIPOutputStream对象的write()方法,从而实现响应输出流的压缩
  17.         gzipos.write(data);
  18.     }
  19.     
  20.     /**
  21.      * 返回GZIPOutputStream对象,过滤器需要访问这个对象,以便完成将压缩数据写入输出流的操作
  22.      */
  23.     public GZIPOutputStream getGZIPOutputStream()
  24.     {
  25.         return gzipos;
  26.     }
  27. }

 

2  CompressionResponseWrapper.java

CompressionResponseWrapper类从HttpServletWrapper类继承  重写了getWriter()和getOutputStream()方法  用GZIPServletOutputStream替换了ServletOutputStream对象

 

  1. package filter;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import java.util.zip.GZIPOutputStream;
  5. import javax.servlet.ServletOutputStream;
  6. import javax.servlet.http.HttpServletResponse;
  7. import javax.servlet.http.HttpServletResponseWrapper;
  8. public class CompressionResponseWrapper extends HttpServletResponseWrapper
  9. {
  10.     private GZIPServletOutputStream gzipsos;
  11.     private PrintWriter pw;
  12.     
  13.     public CompressionResponseWrapper(HttpServletResponse response) throws IOException
  14.     {
  15.         super(response);
  16.         
  17.         //用响应输出流创建GZIPServletOutputStream对象
  18.         gzipsos = new GZIPServletOutputStream(response.getOutputStream());
  19.         ////用GZIPServletOutputStream对象作为参数,构造PrintWriter对象
  20.         pw = new PrintWriter(gzipsos);
  21.     }
  22.     
  23.     /**
  24.      * 重写setContentLength()方法,以避免Content-Length实体报头所指出的长度
  25.      * 和压缩后的实体正文长度不匹配
  26.      */
  27.     @Override
  28.     public void setContentLength(int len){}
  29.     @Override
  30.     public ServletOutputStream getOutputStream() throws IOException
  31.     {
  32.         return gzipsos;
  33.     }
  34.     @Override
  35.     public PrintWriter getWriter() throws IOException
  36.     {
  37.         return pw;
  38.     }
  39.     
  40.     /**
  41.      * 过滤器调用这个方法来得到GZIPOutputStream对象,以便完成将压缩数据写入输出流的操作
  42.      */
  43.     public GZIPOutputStream getGZIPOutputStream()
  44.     {
  45.         return gzipsos.getGZIPOutputStream();
  46.     }
  47. }

 

3  CompressionFilter.java

是过滤器类  使用CompressionResponseWrapper对象来实现对响应内容的压缩

 

  1. package filter;
  2. import java.io.IOException;
  3. import java.util.zip.GZIPOutputStream;
  4. import javax.servlet.Filter;
  5. import javax.servlet.FilterChain;
  6. import javax.servlet.FilterConfig;
  7. import javax.servlet.ServletException;
  8. import javax.servlet.ServletRequest;
  9. import javax.servlet.ServletResponse;
  10. import javax.servlet.http.HttpServletRequest;
  11. import javax.servlet.http.HttpServletResponse;
  12. public class CompressionFilter implements Filter
  13. {
  14.     public void init(FilterConfig filterConfig) throws ServletException{}
  15.     public void destroy(){}
  16.     @Override
  17.     public void doFilter(ServletRequest request, ServletResponse response,
  18.             FilterChain chain) throws IOException, ServletException
  19.     {
  20.         HttpServletRequest httpReq = (HttpServletRequest) request;
  21.         HttpServletResponse httpResp = (HttpServletResponse) response;
  22.         String acceptEncodings = httpReq.getHeader("Accept-Encoding");
  23.         if (acceptEncodings != null && acceptEncodings.indexOf("gzip") > -1)
  24.         {
  25.             // 得到响应对象的封装类对象
  26.             CompressionResponseWrapper respWrapper = new CompressionResponseWrapper(
  27.                     httpResp);
  28.             
  29.             // 设置Content-Encoding实体报头,告诉浏览器实体正文采用了gzip压缩编码
  30.             respWrapper.setHeader("Content-Encoding", "gzip");
  31.             chain.doFilter(httpReq, respWrapper);
  32.             
  33.             //得到GZIPOutputStream输出流对象
  34.             GZIPOutputStream gzipos = respWrapper.getGZIPOutputStream();
  35.             //调用GZIPOutputStream输出流对象的finish()方法完成将压缩数据写入
  36.             //响应输出流的操作,无须关闭输出流
  37.             gzipos.finish();
  38.         }
  39.         else
  40.         {
  41.             chain.doFilter(httpReq, httpResp);
  42.         }
  43.     }
  44. }

4   添加CompressionFilter的xml配置

注意 CompressionFilter过滤器的配置应该放在GuestbookFilter过滤器的前面

 

  1. <filter>
  2.         <filter-name>CompressionFilter</filter-name>
  3.         <filter-class>filter.CompressionFilter</filter-class>
  4.     </filter>
  5.     
  6.     
  7.     <filter-mapping>
  8.         <filter-name>CompressionFilter</filter-name>
  9.         <url-pattern>*.jsp</url-pattern>
  10.         <url-pattern>*.html</url-pattern>
  11.     </filter-mapping>

 

5  实验测试

看页面感觉不到CompressionFilter过滤器是否起作用了

在命令提示符窗口中输入:

telnet localhost 8080

然后再输入:

 

  1. GET /GZIPFilter/index.jsp HTTP/1.1
  2. Host:localhost
  3. Accept-Encoding:gzip

连续输入两次回车后 如果看到一堆乱码 就说明CompressionFilter过滤器已经起作用了

分享到:
评论

相关推荐

    java一些 常用 的过滤 器

    数据压缩过滤器用于减少数据传输量,从而加快网络通信速度和降低带宽成本。在客户端和服务器之间传输的数据被压缩,然后在接收端解压缩,这一过程对最终用户来说通常是透明的。GZIP是最常见的数据压缩算法之一,在...

    web过滤器 c#

    例如,你可以使用结果过滤器来改变HTTP响应头,或者在响应发送到客户端之前对其进行压缩。 在提供的压缩包文件"WebMIS.GoldFilterOpenSource"中,很可能是包含了一个开源的Web过滤器实现。这样的库通常会提供自定义...

    过滤器(Filter)

    完成后,响应会通过过滤器链返回给客户端,过程中同样可以进行相应的后处理。 创建一个过滤器需要继承`javax.servlet.Filter`接口,并实现其核心方法`doFilter()`。以下是一个简单的过滤器示例: ```java public ...

    过滤器和监听器的使用与区别

    过滤器是Servlet规范的一部分,它允许开发者在请求到达目标Servlet或JSP之前对其进行拦截和处理。通过实现javax.servlet.Filter接口并配置在web.xml文件中,我们可以定义一系列过滤规则,比如进行数据的校验、字符...

    Real媒体过滤器,非常好用

    Real媒体过滤器的使用并不复杂,通常用户只需安装相应的驱动程序或播放器(如RealPlayer或VLC Media Player),就可以自动识别并利用这个过滤器来播放RealMedia文件。有时,如果遇到播放问题,更新或重新安装Real...

    servlet过滤器验证用户登录

    为了使过滤器生效,需在`web.xml`中进行相应的配置。具体步骤如下: 1. **定义过滤器**:在`&lt;web-app&gt;`标签下添加`&lt;filter&gt;`元素,指定过滤器的名称和类名。 2. **映射过滤器**:紧接着使用`&lt;filter-mapping&gt;`元素...

    jsp/servlet中过滤器和监听器的区别

    根据配置,过滤器可以对请求或响应进行修改、拦截、日志记录等操作。 - **工作原理**:过滤器遵循`Filter`接口,并实现`doFilter()`方法。当请求到达Web应用时,容器会调用这个方法,允许开发者对请求和响应流进行...

    压缩空气精密过滤器使用说明书.doc

    **压缩空气精密过滤器使用详解** 压缩空气精密过滤器是一种重要的工业设备,主要应用于清除压缩空气中的固体微粒、水滴以及油雾等杂质,确保空气的洁净度。本使用说明书详细介绍了过滤器的结构、功能、性能以及安装...

    JAVA web过滤器Filter学习资料

    例如,如果需要压缩 30 个不同的 servlet 或 JSP 页面的内容以减少下载时间,可以构造一个压缩过滤器,然后将其应用到 30 个资源上。其次,过滤器可以将高级访问决策与表现代码相分离,这对于 JSP 特别有价值。最后...

    springboot+jsp 使用过滤器.do

    项目中提到的“加上过滤器.do”,可能是指在Maven的pom.xml文件中添加了相应的依赖,以便引入Spring Boot对过滤器的支持。 **5. 示例项目结构与内容** 压缩包中的“demo”文件很可能是整个项目的根目录,包含了源...

    MVCFilter过滤器.rar

    3. **响应过滤器(Response Filters)**:响应过滤器允许在数据被发送到客户端之前或之后对HTTP响应进行拦截和修改。这可以用于压缩响应数据或添加自定义的响应头。 4. **结果过滤器(Result Filters)**:结果过滤...

    过滤器和监听器的使用

    例如,我们可以通过过滤器实现用户登录验证、数据编码解码、内容压缩等功能。在配置过滤器时,我们需要在web.xml文件中声明Filter,并通过元素指定需要拦截的URL模式。当请求匹配到这些模式时,过滤器将按照声明的...

    监听器 过滤器 详解

    4. **GzipFilter**:对响应内容进行压缩,提高传输效率。 过滤器的配置同样在web.xml中,通过`&lt;filter&gt;`和`&lt;filter-mapping&gt;`标签定义过滤器及其作用范围。 ### 使用场景 监听器和过滤器在实际应用中有着广泛的...

    javaweb过滤器

    4. **全站GZIP压缩过滤器**:虽然实现起来较为复杂,但能显著减少传输的数据量,提高性能。 #### 巩固包装设计模式——装饰模式 1. **装饰模式的基本步骤**: - 定义一个接口,该接口定义了一组基本的操作。 - ...

    用过滤器进行权限控制实例 附

    根据Servlet 3.1规范,过滤器是一个实现了javax.servlet.Filter接口的类,它可以在请求到达目标资源(如Servlet或JSP页面)之前对其进行拦截,也可以在响应返回给客户端之前对响应进行处理。通过在web.xml配置文件中...

    filter_权限过滤器

    在实际应用中,权限过滤器可以与其他过滤器配合使用,例如CSRF防护过滤器、GZIP压缩过滤器等,共同构建一个强大的安全防线。同时,为了适应不同的需求,权限过滤器的实现可能会有所不同,比如使用Spring Security...

    三歪教你学习过滤器和监听器1

    - **数据处理**:过滤器可以对请求和响应的数据进行预处理和后处理,如去除敏感词、压缩资源、HTML转义等。 3. **过滤器API** - `init()`:初始化过滤器,只在Web容器启动并加载过滤器时调用一次。 - `doFilter...

    java web整合开发王者归来光盘代码-第六章 过滤器

    在Java Web开发中,过滤器(Filter)是一个关键组件,它允许开发者在请求到达目标Servlet或JSP之前对其进行处理,并在响应返回给客户端之后进行后处理。本章节"过滤器"的内容聚焦于如何利用过滤器增强应用的功能和...

    servlet过滤器与监听器.pdf

    这个过滤器会对所有以 .do 结尾的请求进行拦截和处理,并输出一些日志信息和请求执行时间。 监听器(Listener)代码演示: 下面是一个使用 ServletContextListener 和 ServletRequestListener 实现的简单 Web 应用...

Global site tag (gtag.js) - Google Analytics