您的位置:首页 > Web前端

9Filter高级开发2--实现全站压缩

2012-10-18 17:59 225 查看
一.全站压缩式通过包装response来实现的。

 

二.

应用HttpServletResponseWrapper对象,压缩响应正文内容。思路:

1 通过filter向目标页面传递一个自定义的response对象;

     (1)在自定义的response对象中,重写getOutputStream方法和getWriter方法,使目标资源调用此方法输出页面内容时,获得的是我们自定义的ServletOutputStream对象。
     (2)在我们自定义的ServletOuputStream对象中,重写write方法,使写出的数据写出到一个buffer中。

2.当页面完成输出后,在filter中就可得到页面写出的数据,从而我们可以调用GzipOuputStream对数据进行压缩后再写出给浏览器,以此完成响应正文件压缩功能。

 
三、
//实现全站压缩  /*
public class GzipFilter implements Filter {

public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {

HttpServletResponse response = (HttpServletResponse) resp;
HttpServletRequest request = (HttpServletRequest) req;

//用自己写的response捕获目标资源的输出
MyResponse myresponse = new MyResponse(response);
chain.doFilter(request, myresponse);

byte data[] = myresponse.getBufferData();  //得到目标资源输出的数据
System.out.println("原始数据的大小:" + data.length);

gout(data,response);

//byteOutputStream out;
//servlet --->    myresponse.getOutputStream()--->MyServletOutputStream.write("hahha")
//chain.doFilter(request, myresponse);
}

public void gout(byte data[],HttpServletResponse response) throws IOException{

ByteArrayOutputStream bout = new ByteArrayOutputStream();
GZIPOutputStream gout = new GZIPOutputStream(bout);  //buffer
gout.write(data);
gout.close();  //一定要有

byte gzipdata[] = bout.toByteArray();

response.setHeader("content-encoding", "gzip");
response.setContentLength(gzipdata.length);
response.getOutputStream().write(gzipdata);

}

class MyResponse extends HttpServletResponseWrapper{
private HttpServletResponse response;
private ByteArrayOutputStream bout = new ByteArrayOutputStream();
private PrintWriter pw = null;

public MyResponse(HttpServletResponse response) {
super(response);
this.response = response;
}
@Override
public ServletOutputStream getOutputStream() throws IOException {
return new MyServletOutputStream(bout);
}

@Override
public PrintWriter getWriter() throws IOException {
// TODO Auto-generated method stub
pw = new PrintWriter(new OutputStreamWriter(bout,response.getCharacterEncoding()));  //write("中国")
return pw;
}
public byte[] getBufferData(){
if(pw!=null){
pw.close();
}
if(bout!=null){
return bout.toByteArray();
}
return null;
}

}

class MyServletOutputStream extends ServletOutputStream{

private ByteArrayOutputStream bout;
public MyServletOutputStream(ByteArrayOutputStream bout){
this.bout = bout;
}

@Override
public void write(int b) throws IOException {  //hahah
bout.write(b);
}

}

public void destroy() {
// TODO Auto-generated method stub

}

public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub

}

}

<filter>
<filter-name>GzipFilter</filter-name>
<filter-class>cn.itcast.web.filter.example.GzipFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>GzipFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<filter-mapping>
<filter-name>GzipFilter</filter-name>
<url-pattern>*.css</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>GzipFilter</filter-name>
<url-pattern>*.js</url-pattern>
</filter-mapping>



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息