全站GZIP压缩过滤器

来源:互联网 发布:winscp网络错误被拒绝 编辑:程序博客网 时间:2024/05/29 05:53

前几天想在项目中添加个gzip压缩的过滤器,然后压缩数据,提高访问效率,当时。。。好像压缩得不太好,之前在Servlet中压缩还是挺好的,在三大框架整合中就用的不太好,可能是因为我用框架不熟的原因,最后,还是设置了tomcat的压缩,以下是代码。

/* * 全站压缩过滤器 * GZip */public class GZipFilter implements Filter {@Overridepublic void doFilter(ServletRequest req, ServletResponse resp,FilterChain chain) throws IOException, ServletException {HttpServletRequest request= (HttpServletRequest) req;HttpServletResponse response = (HttpServletResponse) resp;MyResponseWrapper myresponse = new MyResponseWrapper(response);// 将自己包装过的Response传递下去,便于获取写入的数据来压缩chain.doFilter(request,myresponse );byte[] buff = myresponse.getBuffer();System.out.println("原始长度:"+buff.length);// 压缩后的数据暂存在bout中ByteArrayOutputStream bout = new ByteArrayOutputStream();// 使用GZIP压缩GZIPOutputStream gout = new GZIPOutputStream(bout);gout.write(buff);gout.close();byte[] gzipBuffer = bout.toByteArray();System.out.println("压缩后的长度:"+gzipBuffer.length);// gzip压缩方式response.setHeader("content-encoding", "gzip");// 数据大小response.setContentLength(gzipBuffer.length);response.getOutputStream().write(gzipBuffer);}@Overridepublic void destroy() {}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}}/** * 包装Response,使得后面使用的流的数据全部写入自己的缓存冲。 * 便于压缩 */class MyResponseWrapper extends HttpServletResponseWrapper{private PrintWriter pw = null;private ByteArrayOutputStream bout = new ByteArrayOutputStream();private HttpServletResponse response;public MyResponseWrapper(HttpServletResponse response) {super(response);this.response = response;}@Overridepublic ServletOutputStream getOutputStream() throws IOException {//压缩字节数据设置return new MyServletOutputStream(bout);}/** * 当调用getWriter方法时候实际上是写入到了自己指定的缓存中 * @return * @throws IOException */@Overridepublic PrintWriter getWriter() throws IOException {//设置字符数据压缩,如果不指定编码,默认以gb2312输出,会出现乱码问题pw = new PrintWriter(new OutputStreamWriter(bout,this.response.getCharacterEncoding()));return pw;}/** * 将缓存中的数据取出,返回 * @return */public byte[] getBuffer(){if(pw != null){pw.close();}if(bout != null){try {bout.close();return bout.toByteArray();} catch (IOException e) {e.printStackTrace();}}return null;}}/** * 包装,复写其中的方法,原理同上 */class MyServletOutputStream extends ServletOutputStream{private ByteArrayOutputStream bout ;public MyServletOutputStream(ByteArrayOutputStream bout){this.bout = bout;}@Overridepublic void write(int b) throws IOException {//其他两个write方法,底层都是调用了write(int b)输出this.bout.write(b);}}


0 0
原创粉丝点击