最近参与的一个项目中附件获取速度缓慢,有时候还会卡死浏览器,百度后发现HTTP压缩技术可以部分解决这个问题
此处记录一下JavaWeb中怎么开启GZIP压缩
定义一个Filter,
检测浏览器是否支持GZIP压缩
boolean flag = false; String encoding = request.getHeader("Accept-Encoding"); if (encoding.indexOf("gzip")!=-1) { flag = true; } return flag;检测请求的资源类型(此处可以定义一个列表,存储需要进行GZIP压缩的类型。)
自定义一个类(A)继承HttpServletResponseWrapper,重写构造函数、getOutputStream()、getWriter()、flush()方法
自定义一个类(B)继承ServletOutputStream,重写构造函数、close()、flush()、write(此处需要注意方法重载)、reset()、finish()方法
在B中声明GZIPOutputStream类的变量gzipOutputStream,构造函数中实例化变量gzipOutputStream。
public void close() throws IOException { gzipOutputStream.close(); } public void flush() throws IOException { gzipOutputStream.flush(); }
public void write(byte[] b, int off, int len) throws IOException { gzipOutputStream.write(b, off, len); }
public void reset() throws IOException { gzipOutputStream = new GZIPOutputStream(out); }
public void finish() throws IOException { gzipOutputStream.finish(); }在A中声明B类的变量gzipStream,构造函数中实例化变量gzipStream
private B stream; private PrintWriter writer;@Override public ServletOutputStream getOutputStream() throws IOException { return stream; } @Override public PrintWriter getWriter() throws IOException { if (writer == null) { writer = new PrintWriter(new OutputStreamWriter(getOutputStream(), getCharacterEncoding())); } return writer; } public void flush() throws IOException { if (writer != null) { writer.flush(); } stream.finish(); }在Filter中两个检验都通过后
A a = new A(res); res.setHeader("Content-Encoding", "gzip"); chain.doFilter(request, a); a.flush();如果没有通过校验则
chain.doFilter(request, response);
最后将Filter配置到web.xml中过滤请求即可