动态代理练习2-全站压缩流输出[response动态代理]
2013-05-01 17:18
435 查看
全站压缩流输出[response动态代理]
1、普通类-代理类
2、Servlet
3、web.xml
1、普通类-代理类
import java.io.ByteArrayOutputStream; import java.io.IOException; 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; public class GzipFilter implements Filter { public void init(FilterConfig arg0) throws ServletException { } public void destroy() { } public void doFilter(ServletRequest req , ServletResponse res,FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; MyResponse myResponse = new MyResponse(response); chain.doFilter(request, myResponse.getProxy()); // 取得缓存中的数据 byte[] buf = myResponse.getBuffer(); System.out.println("压缩前:" + buf.length); //以下是压缩代码 ByteArrayOutputStream bout = new ByteArrayOutputStream(); GZIPOutputStream gout = new GZIPOutputStream(bout); gout.write(buf); gout.flush(); gout.close(); // 取得压缩后的数据 buf = bout.toByteArray(); System.out.println("压缩后:" + buf.length); // 向浏览器发送压缩后的数据 response.setHeader("content-encoding", "gzip"); response.setHeader("content-length", buf.length+""); response.getOutputStream().write(buf); } } // 1、一个普通类不实现任何接口-代理类 class MyResponse{ // 缓存 private ByteArrayOutputStream bout = new ByteArrayOutputStream(); //取得缓存中的数据 public byte[] getBuffer(){ return bout.toByteArray(); } // 2、代理对象的引用 private HttpServletResponse response; // 3、通过构造器初始化代理对象 public MyResponse(HttpServletResponse response){ this.response = response; } // 4、写一个普通方法,该方法的返回值是接口,该接口是目标对象的实现接口 public HttpServletResponse getProxy(){ return (HttpServletResponse) Proxy.newProxyInstance( MyResponse.class.getClassLoader(),//1、由哪个类加载器加载 response.getClass().getInterfaces(), //2、被代理类的方法 new InvocationHandler() { public Object invoke( Object proxy,//1、被代理的对象 Method method, //2、被代理的方法 Object[] args//3、被代理方法的参数 )throws Throwable { if("getOutputStream".equals(method.getName())){ return new MyServletOutputStream(bout); } return null; } }); } } // 带有缓存功能的ServletOutputStream class MyServletOutputStream extends ServletOutputStream{ private ByteArrayOutputStream bout; public MyServletOutputStream(ByteArrayOutputStream bout) { this.bout = bout; } @Override public void write(int b) throws IOException { } //将字节数据写入缓存 public void write(byte[] buf) throws IOException{ bout.write(buf); bout.flush(); } }
2、Servlet
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ShowServlet extends HttpServlet { public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { ServletOutputStream sout = response.getOutputStream(); sout.write("QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ".getBytes()); } }
3、web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <filter> <filter-name>MyGzipFilte</filter-name> <filter-class>cn.zengfanshegn.proxy.servlet.GzipFilter</filter-class> </filter> <filter-mapping> <filter-name>MyGzipFilte</filter-name> <servlet-name>ShowServlet</servlet-name> </filter-mapping> <servlet> <servlet-name>ShowServlet</servlet-name> <servlet-class>cn.zengfanshegn.proxy.servlet.ShowServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ShowServlet</servlet-name> <url-pattern>/ShowServlet</url-pattern> </servlet-mapping> </web-app>
相关文章推荐
- 动态代理练习2-全站压缩流输出[response动态代理]
- 动态代理练习1-全站字符编码过滤[request动态代理]
- 动态代理练习1-全站字符编码过滤[request动态代理]
- 全站压缩代---练习代码
- 过滤器-用动态代理解决全站乱码
- 动态代理练习3-自定义数据库连接池[connection动态代理]
- 利用filter和动态代理解决全站乱码问题
- 动态代理练习3-自定义数据库连接池[connection动态代理]
- 过滤器-用动态代理解决全站乱码
- 通过Response.Filter属性实现网站内容的动态GZIP压缩
- 使用动态代理实现对request和response的增强
- Java 的动态代理实例(JDBC的数据库的连接池(DataSource))
- java动态代理
- java动态代理--代理接口无实现类
- jdk动态代理和cglib动态代理的区别
- java动态代理原理及解析
- @DeclareParents为某个类及其所有子类动态代理新增实现接口
- 反射实现 AOP 动态代理模式(Spring AOP 的实现 原理)
- java动态代理和cglib
- Java动态代理深入解析