创建JSP过滤器以GZip响应

时间:2013-03-30 20:14:56

标签: java jsp optimization gzip web.xml

我刚刚编写了一个过滤器来gzip我的回复,效果惊人。我最大的JSP页面从80K变为5.7K。但是,过滤器我写了gzip来自服务器的所有响应,包括图像。但是,Yahoo说这是一种非常糟糕的做法。

Image and PDF files should not be gzipped because they are already compressed. 
Trying to gzip them not only wastes CPU but can potentially increase file sizes. 

这是我编写的过滤器的web.xml足迹

<!-- THIS FILTER WILL TAKE MY OUTPUT AND GZIP IT TO LESSEN MY BANDWIDTH FOOTPRINT -->
<filter>
    <filter-name>GZip</filter-name>
    <filter-class>org.instride.gzip.GZIPFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>GZip</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

因此,您可以看到所有响应的内容都被gzip压缩。但是,我只想gzip css js和jsp页面。所以你认为我可以添加这些人

<url-pattern>*.jsp</url-pattern>
<url-pattern>*.css</url-pattern>
<url-pattern>*.js</url-pattern>

但这会给我一个问题b / c我所有的jsp页面隐藏扩展b / c它们都是servlet,我也使用tuckey's URL重写。例如,我想要gzip的页面的URL看起来像这样。

https://example.com/user/1/admin

因此servlet(user)在web.xml文件中没有精确定位的扩展名,而servlet后面跟着正斜杠参数。所以我想到了两种可能的解决方案。

  1. 我想要包含我希望跳过的文件类型,如jpeg或gif,而不是包含我喜欢的文件类型。
  2. 我仅根据其内容类型指定gzip文件,例如text/html;charset=UTF-8
  3. 我将非常感谢任何关于我如何做这些事情或更好地解决我的问题的指导。谢谢大家阅读本文。

1 个答案:

答案 0 :(得分:0)

我放弃了第二个想法并编写了这个解决方案。在我的解决方案中,我查看请求标头中的accept属性。从我收集到的firebug看到我网站上的所有图像,无论它们的格式具有接受属性

image/png,image/*;q=0.8,*/*;q=0.5

老实说,我不知道这究竟是什么意思,但所有jpg的png和gif都有它,没有其他文件类型这样做,这就是我所做的。

...

public class GZIPFilter implements Filter 
{
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException 
    {
        if (servletRequest instanceof HttpServletRequest) 
        {
            HttpServletRequest httpRequest;
            HttpServletResponse httpResponse;
            String acceptedEncoding, accept;
            GZIPResponseWrapper wrappedResponse;

            httpRequest = (HttpServletRequest) servletRequest;
            httpResponse = (HttpServletResponse) servletResponse;

            accept = httpRequest.getHeader("accept");
            acceptedEncoding = httpRequest.getHeader("accept-encoding");

            if (acceptedEncoding != null && acceptedEncoding.indexOf("gzip") != -1 && !accept.equals("image/png,image/*;q=0.8,*/*;q=0.5")) 
            {
                wrappedResponse = new GZIPResponseWrapper(httpResponse);
                filterChain.doFilter(servletRequest, wrappedResponse);
                wrappedResponse.finishResponse();
                return;
            }

            filterChain.doFilter(servletRequest, servletResponse);
        }
    }

    public void init(FilterConfig filterConfig) 
    {

    }

    public void destroy() 
    {

    }
}