Java 您建议使用哪种压缩(GZIP是最流行的)servlet过滤器?

Java 您建议使用哪种压缩(GZIP是最流行的)servlet过滤器?,java,servlets,jakarta-ee,servlet-filters,Java,Servlets,Jakarta Ee,Servlet Filters,我正在寻找一个GZIP servlet过滤器,用于高容量的web应用程序。我不想使用特定于容器的选项 要求 压缩响应负载(XML)的能力 更快 经生产验证,适用于大容量应用 应正确设置适当的内容编码 跨集装箱移动 可以选择解压缩请求 谢谢。查看pjl comp filter Compressing filter: 我建议您在tomcat前面使用一些东西来卸载Gzip。带有mod_deflate的Apache将表现良好。您可以选择将apache放在同一个框中,或者将其移到另一个框中,这样压缩就不会

我正在寻找一个GZIP servlet过滤器,用于高容量的web应用程序。我不想使用特定于容器的选项

要求

  • 压缩响应负载(XML)的能力
  • 更快
  • 经生产验证,适用于大容量应用
  • 应正确设置适当的内容编码
  • 跨集装箱移动
  • 可以选择解压缩请求

  • 谢谢。

    查看pjl comp filter Compressing filter:


    我建议您在tomcat前面使用一些东西来卸载Gzip。带有mod_deflate的Apache将表现良好。您可以选择将apache放在同一个框中,或者将其移到另一个框中,这样压缩就不会影响您的应用程序。mod_jk或mod_proxy在这个设置中都可以正常工作


    据我所见,大多数人通常使用gzip压缩过滤器。通常来自

    GZIP筛选器实现是:

    将其包含在项目中的Maven坐标为:

    <dependency>
        <groupId>net.sf.ehcache</groupId>
        <artifactId>ehcache-web</artifactId>
        <version>2.0.4</version>
    </dependency>
    
    
    net.sf.ehcache
    ehcache网络
    2.0.4
    
    您还需要指定SLF4J日志记录目标。如果您不知道这是什么或不关心slf4j-jdk14或slf4j simple的工作原理:

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-jdk14</artifactId>
        <version>1.6.4</version>
    </dependency>
    
    
    org.slf4j
    slf4j-jdk14
    1.6.4
    
    用于压缩Web应用程序中资源的GZIP筛选器:

    public类CompressionFilter实现过滤器{
    公共空间销毁(){
    }
    public void doFilter(ServletRequest请求、ServletResponse响应、FilterChain链)抛出IOException、ServletException{
    HttpServletRequest httpRequest=(HttpServletRequest)请求;
    HttpServletResponse=(HttpServletResponse)响应;
    字符串acceptEncoding=httpRequest.getHeader(HttpHeaders.acceptEncoding);
    if(acceptEncoding!=null){
    if(acceptEncoding.indexOf(“gzip”)>=0){
    GZIPHttpServletResponseWrapper gzipResponse=新的GZIPHttpServletResponseWrapper(httpResponse);
    doFilter(请求、gzip响应);
    gzipResponse.finish();
    返回;
    }
    }
    链式过滤器(请求、响应);
    }
    public void init(FilterConfig FilterConfig)抛出ServletException{
    }
    }
    公共类GZIPHttpServletResponseWrapper扩展了HttpServletResponseWrapper{
    私有ServletResponseGzipOutStream GzipsStream;
    私有ServletOutputStream输出流;
    私人印刷作家;
    公共GZIPHttpServletResponseWrapper(HttpServletResponse)引发IOException{
    超级(响应);
    addHeader(HttpHeaders.CONTENT_编码,“gzip”);
    }
    public void finish()引发IOException{
    如果(printWriter!=null){
    printWriter.close();
    }
    if(outputStream!=null){
    outputStream.close();
    }
    如果(gzipStream!=null){
    gzipStream.close();
    }
    }
    @凌驾
    public void flushBuffer()引发IOException{
    如果(printWriter!=null){
    printWriter.flush();
    }
    if(outputStream!=null){
    outputStream.flush();
    }
    super.flushBuffer();
    }
    @凌驾
    公共ServletOutputStream getOutputStream()引发IOException{
    如果(printWriter!=null){
    抛出新的IllegalStateException(“printWriter已定义”);
    }
    if(outputStream==null){
    initGzip();
    outputStream=gzip流;
    }
    返回输出流;
    }
    @凌驾
    公共PrintWriter getWriter()引发IOException{
    if(outputStream!=null){
    抛出新的IllegalStateException(“printWriter已定义”);
    }
    if(printWriter==null){
    initGzip();
    printWriter=新的printWriter(新的OutputStreamWriter(gzip流,getResponse().getCharacterEncoding());
    }
    返回打印机;
    }
    @凌驾
    公共void setContentLength(int len){
    }
    私有void initGzip()引发IOException{
    gzipStream=newservletresponsegzipoutpstream(getResponse().getOutputStream());
    }
    }
    公共类ServletResponseGZIPOutputStream扩展了ServletOutputStream{
    gzip输出流gzip流;
    最终原子布尔开放=新原子布尔(真);
    输出流输出;
    公共ServletResponseGzipoutpOutstream(OutputStream输出)引发IOException{
    这个。输出=输出;
    gzipStream=新的GZIPOutputStream(输出);
    }
    @凌驾
    public void close()引发IOException{
    if(打开.比较数据集(真,假)){
    gzipStream.close();
    }
    }
    @凌驾
    public void flush()引发IOException{
    gzipStream.flush();
    }
    @凌驾
    公共无效写入(字节[]b)引发IOException{
    写入(b,0,b.长度);
    }
    @凌驾
    公共无效写入(字节[]b,int off,int len)引发IOException{
    如果(!open.get()){
    抛出新IOException(“流关闭!”);
    }
    gzipStream.write(b,off,len);
    }
    @凌驾
    公共无效写入(int b)引发IOException{
    如果(!open.get()){
    抛出新IOException(“流关闭!”);
    }
    gzipStream.write(b);
    }
    }
    
    您还需要在web.xml中定义映射:

    
    压缩滤波器
    com.my.company.CompressionFilter
    压缩滤波器
    *.js
    压缩滤波器
    *.css
    压缩滤波器
    *.html
    压缩滤波器
    *.jsp
    
    或者如果您在前面使用Nginx,请参见此处:。但是,正如Zeki所说,最好将其转移到专用的web服务器上。

    我希望此解决方案是可移植的,因此这不是我正在寻找的解决方案。你怎么知道他在使用Tomcat?我使用Jetty,这是一个