一.全站压缩式通过包装response来实现的。
二.
应用HttpServletResponseWrapper对象,压缩响应正文内容。思路:
1 通过filter向目标页面传递一个自定义的response对象;
(1)在自定义的response对象中,重写getOutputStream方法和getWriter方法,使目标资源调用此方法输出页面内容时,获得的是我们自定义的ServletOutputStream对象。
1 通过filter向目标页面传递一个自定义的response对象;
(1)在自定义的response对象中,重写getOutputStream方法和getWriter方法,使目标资源调用此方法输出页面内容时,获得的是我们自定义的ServletOutputStream对象。
(2)在我们自定义的ServletOuputStream对象中,重写write方法,使写出的数据写出到一个buffer中。
2.当页面完成输出后,在filter中就可得到页面写出的数据,从而我们可以调用GzipOuputStream对数据进行压缩后再写出给浏览器,以此完成响应正文件压缩功能。
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>