- 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>