標籤:java 過濾器 網站壓縮
1.網站壓縮的一個簡單樣本
public class ServletDemo extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";//找一個記憶體緩衝位元組流ByteArrayOutputStream baos = new ByteArrayOutputStream();//把資料壓縮到緩衝位元組流流中GZIPOutputStream gout = new GZIPOutputStream(baos);//取出資料:壓縮後的byte b[] = data.getBytes();//原始位元組System.out.println("原有資料大小:"+b.length);gout.write(b);gout.close();//保證所有的資料都進入記憶體緩衝流//取出壓縮後的資料b = baos.toByteArray();System.out.println("壓縮後的資料大小:"+b.length);//輸出前一定要告知用戶端壓縮方式response.setHeader("Content-Encoding", "gzip");response.setContentLength(b.length);//告知用戶端本文的大小//用伺服器的響應對象輸出ServletOutputStream out = response.getOutputStream();out.write(b);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}
2.全站壓縮過濾器的一個簡單樣本
//全站壓縮過濾器public class GzipFilter implements Filter {public void destroy() {}public void doFilter(ServletRequest req, ServletResponse resp,FilterChain chain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest)req;HttpServletResponse response = (HttpServletResponse)resp;GzipHttpServletResponse gresponse = new GzipHttpServletResponse(response);chain.doFilter(request, gresponse);//允許存取//壓縮代碼寫在此處//找一個記憶體緩衝位元組流ByteArrayOutputStream baos = new ByteArrayOutputStream();//把資料壓縮到緩衝位元組流流中GZIPOutputStream gout = new GZIPOutputStream(baos);//取出資料:壓縮後的byte b[] = gresponse.getOldBytes();//原始位元組System.out.println("原有資料大小:"+b.length);gout.write(b);gout.close();//保證所有的資料都進入記憶體緩衝流//取出壓縮後的資料b = baos.toByteArray();System.out.println("壓縮後的資料大小:"+b.length);//輸出前一定要告知用戶端壓縮方式response.setHeader("Content-Encoding", "gzip");response.setContentLength(b.length);//告知用戶端本文的大小//用伺服器的響應對象輸出ServletOutputStream out = response.getOutputStream();out.write(b);}public void init(FilterConfig filterConfig) throws ServletException {}}class GzipHttpServletResponse extends HttpServletResponseWrapper{private ByteArrayOutputStream baos = new ByteArrayOutputStream();private PrintWriter pw;public GzipHttpServletResponse(HttpServletResponse response){super(response);}//把未經處理資料封裝到一個緩衝流中@Overridepublic ServletOutputStream getOutputStream() throws IOException {return new MyServletOutputStream(baos);}//字元流:把未經處理資料封裝到一個緩衝流中@Overridepublic PrintWriter getWriter() throws IOException {pw = new PrintWriter(new OutputStreamWriter(baos, super.getCharacterEncoding()));//字元流轉成位元組流編碼會丟失return pw;}//返回baos中的快取資料:原始public byte[] getOldBytes(){try {if(pw!=null){pw.close();}baos.flush();} catch (IOException e) {e.printStackTrace();}return baos.toByteArray();}}class MyServletOutputStream extends ServletOutputStream{private ByteArrayOutputStream baos;public MyServletOutputStream(ByteArrayOutputStream baos){this.baos = baos;}@Overridepublic void write(int b) throws IOException {baos.write(b);}}