目前主流的浏览器和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)方法 以达到压缩数据的目的
- package filter;
- import java.io.IOException;
- import java.util.zip.GZIPOutputStream;
- import javax.servlet.ServletOutputStream;
- public class GZIPServletOutputStream extends ServletOutputStream
- {
- private GZIPOutputStream gzipos;
- public GZIPServletOutputStream(ServletOutputStream sos) throws IOException
- {
- //使用响应输出流对象构造GZIPOutputStream过滤流对象
- this.gzipos = new GZIPOutputStream(sos);
- }
- @Override
- public void write(int data) throws IOException
- {
- //将写入操作委托给GZIPOutputStream对象的write()方法,从而实现响应输出流的压缩
- gzipos.write(data);
- }
- /**
- * 返回GZIPOutputStream对象,过滤器需要访问这个对象,以便完成将压缩数据写入输出流的操作
- */
- public GZIPOutputStream getGZIPOutputStream()
- {
- return gzipos;
- }
- }
2 CompressionResponseWrapper.java
CompressionResponseWrapper类从HttpServletWrapper类继承 重写了getWriter()和getOutputStream()方法 用GZIPServletOutputStream替换了ServletOutputStream对象
- package filter;
- import java.io.IOException;
- import java.io.PrintWriter;
- import java.util.zip.GZIPOutputStream;
- import javax.servlet.ServletOutputStream;
- import javax.servlet.http.HttpServletResponse;
- import javax.servlet.http.HttpServletResponseWrapper;
- public class CompressionResponseWrapper extends HttpServletResponseWrapper
- {
- private GZIPServletOutputStream gzipsos;
- private PrintWriter pw;
- public CompressionResponseWrapper(HttpServletResponse response) throws IOException
- {
- super(response);
- //用响应输出流创建GZIPServletOutputStream对象
- gzipsos = new GZIPServletOutputStream(response.getOutputStream());
- ////用GZIPServletOutputStream对象作为参数,构造PrintWriter对象
- pw = new PrintWriter(gzipsos);
- }
- /**
- * 重写setContentLength()方法,以避免Content-Length实体报头所指出的长度
- * 和压缩后的实体正文长度不匹配
- */
- @Override
- public void setContentLength(int len){}
- @Override
- public ServletOutputStream getOutputStream() throws IOException
- {
- return gzipsos;
- }
- @Override
- public PrintWriter getWriter() throws IOException
- {
- return pw;
- }
- /**
- * 过滤器调用这个方法来得到GZIPOutputStream对象,以便完成将压缩数据写入输出流的操作
- */
- public GZIPOutputStream getGZIPOutputStream()
- {
- return gzipsos.getGZIPOutputStream();
- }
- }
3 CompressionFilter.java
是过滤器类 使用CompressionResponseWrapper对象来实现对响应内容的压缩
- package filter;
- import java.io.IOException;
- import java.util.zip.GZIPOutputStream;
- import javax.servlet.Filter;
- import javax.servlet.FilterChain;
- import javax.servlet.FilterConfig;
- import javax.servlet.ServletException;
- import javax.servlet.ServletRequest;
- import javax.servlet.ServletResponse;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- public class CompressionFilter implements Filter
- {
- public void init(FilterConfig filterConfig) throws ServletException{}
- public void destroy(){}
- @Override
- public void doFilter(ServletRequest request, ServletResponse response,
- FilterChain chain) throws IOException, ServletException
- {
- HttpServletRequest httpReq = (HttpServletRequest) request;
- HttpServletResponse httpResp = (HttpServletResponse) response;
- String acceptEncodings = httpReq.getHeader("Accept-Encoding");
- if (acceptEncodings != null && acceptEncodings.indexOf("gzip") > -1)
- {
- // 得到响应对象的封装类对象
- CompressionResponseWrapper respWrapper = new CompressionResponseWrapper(
- httpResp);
- // 设置Content-Encoding实体报头,告诉浏览器实体正文采用了gzip压缩编码
- respWrapper.setHeader("Content-Encoding", "gzip");
- chain.doFilter(httpReq, respWrapper);
- //得到GZIPOutputStream输出流对象
- GZIPOutputStream gzipos = respWrapper.getGZIPOutputStream();
- //调用GZIPOutputStream输出流对象的finish()方法完成将压缩数据写入
- //响应输出流的操作,无须关闭输出流
- gzipos.finish();
- }
- else
- {
- chain.doFilter(httpReq, httpResp);
- }
- }
- }
4 添加CompressionFilter的xml配置
注意 CompressionFilter过滤器的配置应该放在GuestbookFilter过滤器的前面
- <filter>
- <filter-name>CompressionFilter</filter-name>
- <filter-class>filter.CompressionFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>CompressionFilter</filter-name>
- <url-pattern>*.jsp</url-pattern>
- <url-pattern>*.html</url-pattern>
- </filter-mapping>
5 实验测试
看页面感觉不到CompressionFilter过滤器是否起作用了
在命令提示符窗口中输入:
telnet localhost 8080
然后再输入:
- GET /GZIPFilter/index.jsp HTTP/1.1
- Host:localhost
- Accept-Encoding:gzip
连续输入两次回车后 如果看到一堆乱码 就说明CompressionFilter过滤器已经起作用了
相关推荐
数据压缩过滤器用于减少数据传输量,从而加快网络通信速度和降低带宽成本。在客户端和服务器之间传输的数据被压缩,然后在接收端解压缩,这一过程对最终用户来说通常是透明的。GZIP是最常见的数据压缩算法之一,在...
例如,你可以使用结果过滤器来改变HTTP响应头,或者在响应发送到客户端之前对其进行压缩。 在提供的压缩包文件"WebMIS.GoldFilterOpenSource"中,很可能是包含了一个开源的Web过滤器实现。这样的库通常会提供自定义...
完成后,响应会通过过滤器链返回给客户端,过程中同样可以进行相应的后处理。 创建一个过滤器需要继承`javax.servlet.Filter`接口,并实现其核心方法`doFilter()`。以下是一个简单的过滤器示例: ```java public ...
过滤器是Servlet规范的一部分,它允许开发者在请求到达目标Servlet或JSP之前对其进行拦截和处理。通过实现javax.servlet.Filter接口并配置在web.xml文件中,我们可以定义一系列过滤规则,比如进行数据的校验、字符...
Real媒体过滤器的使用并不复杂,通常用户只需安装相应的驱动程序或播放器(如RealPlayer或VLC Media Player),就可以自动识别并利用这个过滤器来播放RealMedia文件。有时,如果遇到播放问题,更新或重新安装Real...
为了使过滤器生效,需在`web.xml`中进行相应的配置。具体步骤如下: 1. **定义过滤器**:在`<web-app>`标签下添加`<filter>`元素,指定过滤器的名称和类名。 2. **映射过滤器**:紧接着使用`<filter-mapping>`元素...
根据配置,过滤器可以对请求或响应进行修改、拦截、日志记录等操作。 - **工作原理**:过滤器遵循`Filter`接口,并实现`doFilter()`方法。当请求到达Web应用时,容器会调用这个方法,允许开发者对请求和响应流进行...
**压缩空气精密过滤器使用详解** 压缩空气精密过滤器是一种重要的工业设备,主要应用于清除压缩空气中的固体微粒、水滴以及油雾等杂质,确保空气的洁净度。本使用说明书详细介绍了过滤器的结构、功能、性能以及安装...
例如,如果需要压缩 30 个不同的 servlet 或 JSP 页面的内容以减少下载时间,可以构造一个压缩过滤器,然后将其应用到 30 个资源上。其次,过滤器可以将高级访问决策与表现代码相分离,这对于 JSP 特别有价值。最后...
项目中提到的“加上过滤器.do”,可能是指在Maven的pom.xml文件中添加了相应的依赖,以便引入Spring Boot对过滤器的支持。 **5. 示例项目结构与内容** 压缩包中的“demo”文件很可能是整个项目的根目录,包含了源...
3. **响应过滤器(Response Filters)**:响应过滤器允许在数据被发送到客户端之前或之后对HTTP响应进行拦截和修改。这可以用于压缩响应数据或添加自定义的响应头。 4. **结果过滤器(Result Filters)**:结果过滤...
例如,我们可以通过过滤器实现用户登录验证、数据编码解码、内容压缩等功能。在配置过滤器时,我们需要在web.xml文件中声明Filter,并通过元素指定需要拦截的URL模式。当请求匹配到这些模式时,过滤器将按照声明的...
4. **GzipFilter**:对响应内容进行压缩,提高传输效率。 过滤器的配置同样在web.xml中,通过`<filter>`和`<filter-mapping>`标签定义过滤器及其作用范围。 ### 使用场景 监听器和过滤器在实际应用中有着广泛的...
4. **全站GZIP压缩过滤器**:虽然实现起来较为复杂,但能显著减少传输的数据量,提高性能。 #### 巩固包装设计模式——装饰模式 1. **装饰模式的基本步骤**: - 定义一个接口,该接口定义了一组基本的操作。 - ...
根据Servlet 3.1规范,过滤器是一个实现了javax.servlet.Filter接口的类,它可以在请求到达目标资源(如Servlet或JSP页面)之前对其进行拦截,也可以在响应返回给客户端之前对响应进行处理。通过在web.xml配置文件中...
在实际应用中,权限过滤器可以与其他过滤器配合使用,例如CSRF防护过滤器、GZIP压缩过滤器等,共同构建一个强大的安全防线。同时,为了适应不同的需求,权限过滤器的实现可能会有所不同,比如使用Spring Security...
- **数据处理**:过滤器可以对请求和响应的数据进行预处理和后处理,如去除敏感词、压缩资源、HTML转义等。 3. **过滤器API** - `init()`:初始化过滤器,只在Web容器启动并加载过滤器时调用一次。 - `doFilter...
在Java Web开发中,过滤器(Filter)是一个关键组件,它允许开发者在请求到达目标Servlet或JSP之前对其进行处理,并在响应返回给客户端之后进行后处理。本章节"过滤器"的内容聚焦于如何利用过滤器增强应用的功能和...
这个过滤器会对所有以 .do 结尾的请求进行拦截和处理,并输出一些日志信息和请求执行时间。 监听器(Listener)代码演示: 下面是一个使用 ServletContextListener 和 ServletRequestListener 实现的简单 Web 应用...