package com.acme.filter; import javax.servlet.FilterChain; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.ServletException; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletRequest; import java.io.ByteArrayOutputStream; import java.io.OutputStream; import java.io.IOException; import java.util.zip.GZIPOutputStream; import java.util.Enumeration; public class GZIPFilter extends GenericFilter { public GZIPFilter() {} public void doFilter(final ServletRequest request, final ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletResponse httpResponse = (HttpServletResponse) response; HttpServletRequest httpRequest=(HttpServletRequest) request; GenericResponseWrapper wrapper = new GenericResponseWrapper(httpResponse); chain.doFilter(request, wrapper); OutputStream out = response.getOutputStream(); if (!isCached(wrapper) && !isIncluded(request) && accepts(httpRequest,"gzip")) { ByteArrayOutputStream compressed = new ByteArrayOutputStream(); GZIPOutputStream gzout = new GZIPOutputStream(compressed); gzout.write(wrapper.getData()); gzout.flush(); gzout.close(); httpResponse.setHeader("Content-Encoding", "gzip"); out.write(compressed.toByteArray()); response.setContentLength(compressed.size()); } else { out.write(wrapper.getData()); } out.flush(); out.close(); } protected boolean isIncluded(ServletRequest request) { String uri = (String) request.getAttribute("javax.servlet.include.request_uri"); if (uri == null) { return false; } else { return true; } } protected boolean isCached(GenericResponseWrapper wrapper) { if (wrapper.getData().length > 0) { return false; } else { return true; } } protected boolean accepts(HttpServletRequest request, String name) { return headerContains(request,"Accept-Encoding",name); } protected boolean headerContains(HttpServletRequest request, String header, String value) { Enumeration accepted=request.getHeaders(header); while(accepted.hasMoreElements()) { String headerValue=(String)accepted.nextElement(); if(headerValue.indexOf(value)!=-1) { return true; } } return false; } }