【问题标题】:Creating a JSP Filter to GZip Responses为 GZip 响应创建 JSP 过滤器
【发布时间】:2013-03-30 20:14:55
【问题描述】:

我刚刚完成了一个过滤器,以 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 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 重写。例如,我想要压缩的页面的 URL 如下所示。

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

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

  1. 我不包含我想要 gzip 压缩的文件类型,而是包含我想要跳过的文件类型,例如 jpeg 或 gif。
  2. 我指定仅基于 gzip 文件的内容类型,例如 text/html;charset=UTF-8

任何关于我如何做这些事情的指导,或者更好地解决我的问题的方法将不胜感激。感谢大家阅读本文。

【问题讨论】:

  • 文件 sie 增加并不是什么大问题(23 字节 + ~0.03%)。花费的 CPU 时间可能很明显。无缘无故在另一端解压是浪费时间。
  • 如何将过滤器映射到所有请求,但将其扩展为仅压缩某些内容类型?
  • 谢谢罗杰,我刚刚实现了一个解决方案,可以做这样的事情。

标签: java jsp optimization gzip web.xml


【解决方案1】:

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

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() 
    {

    }
}

【讨论】:

    猜你喜欢
    • 2014-12-14
    • 2012-07-03
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    • 2019-01-23
    • 1970-01-01
    相关资源
    最近更新 更多