JavaEE框架类——全站压缩——对网站内容进行数据压缩(Filter和GzipOutputStream二合一)

  • GZIP压缩:将压缩后的文本文件,发送给浏览器,减少流量。
  • 全站压缩:将一个项目(网站内)的所有响应(数据)进行gzip压缩,减少流量。
  • 压缩目的:减少流量,提高运行速度,贴吧是在手机客户端是,减少流量会获得用户的青睐。
  • 压缩技术:通过GzipOutputStream和ByteArrayOutputStream对所有要精过滤器的数据进行压缩。
  • 核心代码:
response.setContentType("text/html;charset=utf-8");
        String str="我不知道是什么原因sdasdasdas实打实大师/" +
                "把字节数组str中的数据 压缩到  bos内存流当中/" +
                "把字节数组str中的数据 压缩到  bos内存流当中/" +
                "把字节数组str中的数据 压缩到  bos内存流当中" +
                "";
        System.out.println("原大小:"+ str.getBytes("utf-8").length);
        ByteArrayOutputStream baout=new ByteArrayOutputStream();
        GZIPOutputStream gout=new GZIPOutputStream(baout);
        gout.write(str.getBytes("utf-8"));
        gout.close();
        byte[] buf=baout.toByteArray();
        response.setHeader("Content-Encoding", "gzip");
        response.setContentLength(buf.length);
        OutputStream out=response.getOutputStream();
        System.out.println("压缩大小:"+ buf.length);
        out.write(buf);
        out.close();

下面是全站压缩的GzipFilter.java过滤器

package cn.hncu.filter;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.zip.GZIPOutputStream;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

public class GzipFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        MyResponse resp=new MyResponse((HttpServletResponse) response);
        //用增强版的resp放行到servlet中去用(让后台把数据 写到  bout中 )
        chain.doFilter(request, resp);//放行
        //从增强版的resp的baout中(存放的是源字节数据),把数据取出来进行压缩,
        //然后再压缩后的数据用原生的response输出到客户端
        ByteArrayOutputStream bout=resp.getBout();
        byte[] srcBytes=bout.toByteArray();//这是源数据
        //下面进行压缩:
        ByteArrayOutputStream bout2=new ByteArrayOutputStream();
        GZIPOutputStream gout=new GZIPOutputStream(bout2);
        gout.write(srcBytes);//把原数据写入gout---bout2
        gout.close();
        byte[] descBytes=bout2.toByteArray();
        //输出之前告诉客户端:我们的数据是gzip格式,然后输出
        HttpServletResponse httpResp=(HttpServletResponse) response;
        httpResp.setHeader("Content-Encoding", "gzip");
        httpResp.setContentLength(descBytes.length);
        httpResp.setContentType("text/html;charset=utf-8");
        OutputStream out=httpResp.getOutputStream();//拿到字节流,必须是字节流
        out.write(descBytes);
    }

    @Override
    public void destroy() {
    }
}
class MyResponse extends HttpServletResponseWrapper{
    private ByteArrayOutputStream bout;
    PrintWriter pw = null;
    public MyResponse(HttpServletResponse response) {
        super(response);
        bout=new ByteArrayOutputStream();
    }
    public ByteArrayOutputStream getBout() {
        if(pw!=null){
            pw.close();//要关流刷新
        }
        return bout;
    }
    @Override//在这里重写getOutputStream和getWriter方法
    public ServletOutputStream getOutputStream() throws IOException {
        return new MyOutputStream(bout);
    }
    @Override
    public PrintWriter getWriter() throws IOException {
        pw=new PrintWriter(new OutputStreamWriter(bout,"utf-8"));//用套接流来进行套接
        return pw;
    }

}
class MyOutputStream extends ServletOutputStream{
    private ByteArrayOutputStream bout;

    public MyOutputStream(ByteArrayOutputStream bout) {
        this.bout = bout;
    }

    @Override
    public void write(int b) throws IOException {
        bout.write(b);//把数据写入bou字节流里面
    }

}

在web.xml进行filter设置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
  <display-name></display-name>
  <filter>
    <filter-name>gzip</filter-name>
    <filter-class>cn.hncu.filter.GzipFilter</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>gzip</filter-name>
    <url-pattern>/*</url-pattern>
     <dispatcher>REQUEST</dispatcher>//如果不学,默认是request压缩,但是写了了dispatcher就必须加上
    <dispatcher>FORWARD</dispatcher>//对forward页面进行压缩
    <dispatcher>INCLUDE</dispatcher>//对include页面进行压缩
  </filter-mapping>
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>FirstServlet</servlet-name>
    <servlet-class>cn.hncu.servlet.FirstServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>SecondServlet</servlet-name>
    <servlet-class>cn.hncu.servlet.SecondServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>ThridServlet</servlet-name>
    <servlet-class>cn.hncu.servlet.ThridServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>FirstServlet</servlet-name>
    <url-pattern>/FirstServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>SecondServlet</servlet-name>
    <url-pattern>/servlet/SecondServlet</url-pattern>
  </servlet-mapping>
   <servlet-mapping>
    <servlet-name>ThridServlet</servlet-name>
    <url-pattern>/servlet/ThridServlet</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值