使用动态代理进行GZIP数据压缩过滤
来源:互联网 发布:果核源码 编辑:程序博客网 时间:2024/06/14 23:34
import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;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.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//采用动态代理进行Gzip过滤public class GzipFilterProxy implements Filter {public void destroy() {// TODO Auto-generated method stub}public void doFilter(ServletRequest req, ServletResponse res,FilterChain chain) throws IOException, ServletException {// TODO Auto-generated method stubHttpServletRequest request = (HttpServletRequest) req;final HttpServletResponse response = (HttpServletResponse) res;final ByteArrayOutputStream bout = new ByteArrayOutputStream();final PrintWriter pw = new PrintWriter(new OutputStreamWriter(bout,response.getCharacterEncoding()));chain.doFilter(request, (ServletResponse) Proxy.newProxyInstance(this.getClass().getClassLoader(), response.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {String methodname = method.getName();if (methodname.equals("getOutputStream")) {//如果调用getOutputStream()方法,则返回保存了数据的字节数据流return new MyServletOutputStream(bout);} else if (methodname.equals("getWriter")) {//如果调用getWriter()方法,则返回保存了数据的PrintWriter流return pw;} else {return method.invoke(response, args);}}}));//Pintwriter 存在缓冲,调用之前进行缓存清空,字节缓冲才能才能得到数据if (pw != null) {pw.close();}byte data[] = bout.toByteArray();System.out.println("原始大小:" + data.length);byte[] gzip = gzip(data);//告诉浏览器获得的数据是压缩后的数据response.setHeader("content-encoding", "gzip");response.setHeader("content-length", gzip.length + "");response.getOutputStream().write(gzip);}//进行数据压缩private byte[] gzip(byte[] data) throws IOException {ByteArrayOutputStream bout = new ByteArrayOutputStream();GZIPOutputStream gout = new GZIPOutputStream(bout);gout.write(data);gout.close();return bout.toByteArray();}//创建ServletOutputStream子类,覆盖write方法,从而使数据写到字节数组中class MyServletOutputStream extends ServletOutputStream {private ByteArrayOutputStream bout;public MyServletOutputStream(ByteArrayOutputStream bout) {this.bout = bout;}@Overridepublic void write(int b) throws IOException {// TODO Auto-generated method stubbout.write(b);}}public void init(FilterConfig filterConfig) throws ServletException {// TODO Auto-generated method stub}}
- 使用动态代理进行GZIP数据压缩过滤
- 使用包装模式进行GZIP数据压缩过滤
- gsoap:启用http compression(gzip)进行数据压缩传输
- 使用zlib库进行数据压缩
- GZIP数据压缩/解压工具
- 使用zlib库进行数据压缩、解压缩
- Symbian中的数据压缩(GZIP)
- Java使用GZIP进行压缩和解压
- 使用Windows 8新的压缩API进行数据压缩
- Java实践:用动态代理进行修饰 动态代理 动态代理 动态代理
- ASIHTTPRequest中数据压缩问题与gzip
- Java GZip数据压缩传输到前台
- 数据压缩(Gzip),重定向,转发,图片下载
- 网络爬虫--网页数据压缩(python deflate gzip)
- iOS中进行数据压缩
- 使用awk进行logcat过滤
- 使用EventFilter进行事件过滤
- 使用java 8 进行过滤
- 线程的交互
- POJ 2676 Sudoku dfs
- poj1503Integer Inquiry
- 《MacOSX及iOS应用程序开发工具集》(Apple Xcode)v4.0.2 and iOS SDK v4.3[光盘镜像]
- __declspec(dllimport) 对【函数调用】编译结果的影响
- 使用动态代理进行GZIP数据压缩过滤
- SQL中各种日期的算法
- 使用包装模式进行GZIP数据压缩过滤
- android 通话涉及的类分析
- poj3006Dirichlet's Theorem on Arithmetic Progressions
- cocos2d中启用多点触摸的方法
- Android权限大全
- S3C2440裸机实验
- VBScript纯数学星期算法。