您的位置:首页 > 其它

动态代理练习2-全站压缩流输出[response动态代理]

2013-05-01 17:18 435 查看
全站压缩流输出[response动态代理]



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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: