servlet--全局のデータを統一的に圧縮
4329 ワード
Filter実装、ここでは親を書くHttpServeretResponseのresponseから
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
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.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
public class GzipFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
// 0
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
// , response, , , , tomcat ,
//1 --
final ByteArrayOutputStream customBuffer = new ByteArrayOutputStream();
//2 response
HttpServletResponse myResponse = new HttpServletResponseWrapper(response){
//
// getOutputStream
@Override
public ServletOutputStream getOutputStream() throws IOException {
return new ServletOutputStream(){
@Override
public void write(int b) throws IOException {
//
customBuffer.write(b);
}
};
}
private PrintWriter pw;
@Override
public PrintWriter getWriter() throws IOException {
pw = new PrintWriter(new OutputStreamWriter(getOutputStream(),getCharacterEncoding()));
return pw;
}
@Override
public void flushBuffer() throws IOException {
if(pw != null){
pw.flush();
}
}
};
//3.
chain.doFilter(request, myResponse); //
//4
byte[] servletData = customBuffer.toByteArray();
//5
// *
ByteArrayOutputStream gzipBAOS = new ByteArrayOutputStream();
GZIPOutputStream gzipOut = new GZIPOutputStream(gzipBAOS);
// *
gzipOut.write(servletData);
gzipOut.close();
// *
byte[] gzipData = gzipBAOS.toByteArray();
//6
// * ,Accept-Encoding: gzip,
// *
response.setHeader("content-encoding", "gzip");
response.getOutputStream().write(gzipData);
}
@Override
public void destroy() {
}
}
servletテストコード:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class GzipGetDataServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
// 90w
StringBuilder builder = new StringBuilder();
for(int i =0 ; i < 1000 ; i ++){
builder.append(" <br/>");
}
//response.getOutputStream().print(builder.toString());
response.getWriter().print(builder.toString());
}
}