GZIP Http Servlet Response
2010-12-16 22:12
393 查看
好久没贴过代码了,心血来潮。
本文是使用 B3log Solo 从 简约设计の艺术 进行同步发布的原文地址:http://88250.b3log.org/articles/2010/12/16/1292515963081.html
Liang Ding * @version 1.0.0.1, Dec 16, 2010 */ public abstract class AbstractGZIPFilter implements Filter { /** * Logger. */ private static final Logger LOGGER = Logger.getLogger(AbstractGZIPFilter.class.getName()); @Override public void init(final FilterConfig cfg) throws ServletException { } /** * Wraps the http servlet response with GZIP if could. * * @param request the specified request * @param response the specified response * @param chain filter chain * @throws IOException io exception * @throws ServletException servlet exception */ @Override public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException { final HttpServletRequest httpServletRequest = (HttpServletRequest) request; final String requestURI = httpServletRequest.getRequestURI(); if (shouldSkip(requestURI)) { LOGGER.log(Level.FINEST, "Skip GZIP filter request[URI={0}]", requestURI); chain.doFilter(request, response); return; } final String acceptEncoding = httpServletRequest.getHeader("Accept-Encoding"); boolean supportGZIP = false; if (null != acceptEncoding && 0 <= acceptEncoding.indexOf("gzip")) { supportGZIP = true; } if (!supportGZIP) { LOGGER.info("Gzip NOT be supported"); chain.doFilter(request, response); return; } final HttpServletResponse httpServletResponse = (HttpServletResponse) response; httpServletResponse.addHeader("Content-Encoding", "gzip"); httpServletResponse.addHeader("Vary", "Accept-Encoding"); chain.doFilter(request, new GZIPServletResponseWrapper(httpServletResponse)); } /** * Determines whether the specified request URI should be skipped filter. * * * Note: This method SHOULD be invoked for all filters with pattern * "/*". * * * @param requestURI the specified request URI * @return {@code true} if should be skipped, {@code false} otherwise */ public abstract boolean shouldSkip(final String requestURI); @Override public void destroy() { } /** * HTTP response wrapper for GZIP. * * @author Liang Ding * @version 1.0.0.0, Dec 16, 2010 */ private class GZIPServletResponseWrapper extends HttpServletResponseWrapper { /** * GZIP output stream. */ private GZIPOutputStream gzipStream; /** * Servlet output stream. */ private ServletOutputStream servletOutputStream; /** * Print writer. */ private PrintWriter printWriter; /** * Constructs an {@link GZIPServletResponseWrapper} object with the * specified http servlet response. * * @param httpServletResponse the specified http servlet response * @throws IOException io exception */ GZIPServletResponseWrapper(final HttpServletResponse httpServletResponse) throws IOException { super(httpServletResponse); } @Override public ServletOutputStream getOutputStream() throws IOException { if (null == servletOutputStream) { servletOutputStream = createOutputStream(); } return servletOutputStream; } @Override public PrintWriter getWriter() throws IOException { if (null == printWriter) { printWriter = new PrintWriter( new OutputStreamWriter(getOutputStream(), getCharacterEncoding())); } return printWriter; } /** * Creates output stream with GZIP delegation. * * @return servlet output stream * @throws IOException io exception */ private ServletOutputStream createOutputStream() throws IOException { final ServletResponse servletResponse = this.getResponse(); gzipStream = new GZIPOutputStream(servletResponse.getOutputStream()); return new ServletOutputStream() { @Override public void write(final int b) throws IOException { gzipStream.write(b); } @Override public void flush() throws IOException { gzipStream.flush(); } @Override public void close() throws IOException { gzipStream.close(); } /* * These two are not absolutely needed. They are here simply * because they were overriden by GZIPOutputStream. */ @Override public void write(final byte[] b) throws IOException { gzipStream.write(b); } @Override public void write(final byte[] b, final int off, final int len) throws IOException { gzipStream.write(b, off, len); } }; } } }
本文是使用 B3log Solo 从 简约设计の艺术 进行同步发布的原文地址:http://88250.b3log.org/articles/2010/12/16/1292515963081.html
相关文章推荐
- GZIP Http Servlet Response
- GZIP Http Servlet Response
- GZIP Http Servlet Response
- 通过Filter和HttpServletResponseWrapper,实现Gzip压缩
- Filter中使用 HttpServletResponseWrapper修改response内容
- HttpServletResponse得到的四种方法
- 通过HttpServletResponseWrapper获取到返回body
- HttpServletResponse
- 用HttpServletResponseWrapper获取jsp的输出内容
- HttpServletResponse接口
- Response对象、HttpServletResponse简介、处理字节编码问题、实现动态文件下载
- HttpServletRequest与HttpServletResponse
- 【Head First Servlets and JSP】笔记5:HttpServletResponse resp
- HttpServletRequest 和HttpServletResponse
- Servlet 3 HttpServletRequest HttpServletResponse 验证码图片 form表单
- 2011-10-20 HttpServletResponse的应用
- (9)http请求与响应(两部分:HttpServletRequest,HttpServletResponse,java文件读入写出需掌握)
- HttpServletResponse响应头与HttpServletRequest请求头及编码问题
- RequestDispatcher.forward() 方法和HttpServletResponse.sendRedirect()方法的区别
- HttpServletResponse与HttpServletRequest理解