全站压缩
现在的网络,流量就是钱。所以,如果能在很少的流量的情况下,查看相同的数据内容,那何乐而不为呢?
•实现方案:•用户在调用 response.getOutputStream()或 response.getWriter()时让获取自己的 输出流对像,我们将信息写到事先准备好的 缓存当中。•当用户书写完毕,我们再调用自己提供的方法, 获取缓存中的数据流。• 然后接着对数据进行压缩,在过虑器中,将信息返回给用户,从而实现数据的压缩。细节:•配置只对部分和.jsp压缩,其他的不压缩,还应配置对.js,.css压缩 但决不能配置对所有请求都压缩,因为如果用户请求的是下载,那不但不能压缩,反而会让 服务器因内存益处而崩溃。(下载,数据量通常很大,不能一次性把这些数据都输到内存流baout中,这样服务器的内存会不够的。而我们的压缩,就是一次性在后台把数据都写到baout中,然后在过滤器中再取出来压缩输出)
过滤器中的代码块(兼容字节压缩和字符压缩):
import java.io.ByteArrayOutputStream; import java.io.IOException; 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 { public GzipFilter() { } public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
<span style="white-space:pre"> </span>//利用多态原理,用自己的类替换response MyRsponse resp = new MyRsponse((HttpServletResponse)response); chain.doFilter(request, resp); //从内存流中取出原字节 ByteArrayOutputStream baos = resp.getBaos(); byte src[] = baos.toByteArray(); System.out.println("压缩前:"+src.length); //压缩 baos = new ByteArrayOutputStream(); GZIPOutputStream out = new GZIPOutputStream(baos); out.write(src); out.close(); //写出去 HttpServletResponse response2 = (HttpServletResponse)response; byte[] dest = baos.toByteArray(); System.out.println("压缩后:"+dest.length); response2.setHeader("Content-Encoding","gzip"); response2.setContentType("text/html;charset=utf-8"); response2.setContentLength(dest.length); response2.getOutputStream().write(dest); } public void init(FilterConfig fConfig) throws ServletException { } } class MyRsponse extends HttpServletResponseWrapper{ private ByteArrayOutputStream baos; private PrintWriter pw; public MyRsponse(HttpServletResponse response) { super(response); baos = new ByteArrayOutputStream(); } public ByteArrayOutputStream getBaos() {
<span style="white-space:pre"> </span>//这一步很有必要,因为是引用传值 if(pw!=null){ pw.close(); } return baos; } @Override public ServletOutputStream getOutputStream() throws IOException { return new MyOutputStream(baos); } @Override public PrintWriter getWriter() throws IOException { pw = new PrintWriter(new OutputStreamWriter(baos,"utf-8"),true); return pw; } } class MyOutputStream extends ServletOutputStream{ private ByteArrayOutputStream baos; public MyOutputStream(ByteArrayOutputStream baos) { super(); this.baos = baos; } @Override public void write(int b) throws IOException { baos.write(b); } }
字节方式写出的Servlet:
字符方式写出的Servlet:import java.io.IOException; import java.io.OutputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ByteGZIPServlet extends HttpServlet { private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String str = "网页压缩数据hncuhdncu网页压缩数据hncuh数据hncuhdncu网页" + "压缩数据hncuh数据hncuhdncu网页压缩数据hncuhdncu网页压缩数据hncu" + "hdncu"; OutputStream out = response.getOutputStream(); out.write(str.getBytes("utf-8")); out.close(); } }
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class CharGZIPServlet extends HttpServlet { private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String str ="网页压缩数据hncuhdncu网页压缩数据hncuh数据hncuhdncu网页" + "压缩数据hncuh数据hncuhdncu网页压缩数据hncuhdncu网页压缩数据hncu" + "hdncu"; PrintWriter out = response.getWriter(); out.write(str); out.close(); } }