【问题标题】:Control gzip encoding filter in Java在 Java 中控制 gzip 编码过滤器
【发布时间】:2014-09-15 20:32:04
【问题描述】:

在 Play 2.3 中,您可以通过使用 Global 对象设置 gzip 过滤器来为响应配置 gzip 编码。 请查看here 在使用 Scala 或使用 Java 时如何设置此过滤器。

在使用 Play with Scala 时,您还可以通过 shouldGzip 参数控制哪些响应包含在过滤器中,哪些响应不包含在过滤器中,该参数接受请求标头和响应标头的功能。例如。这里只会压缩编码为text/html 的文档:

new GzipFilter(shouldGzip = (request, response) =>
    response.headers.get("Content-Type").exists(_.startsWith("text/html")))

我怎样才能在 Java 版本中达到同样的效果?

【问题讨论】:

    标签: java scala playframework playframework-2.3


    【解决方案1】:

    我找到了解决方案。您必须实现自己的过滤器并将所有请求委托给 GzipFilter。值 102400 在 GzipFilter 中是私有的 - 所以我必须在这里对其进行硬编码。

        import play.api.mvc.EssentialAction;
        import play.api.mvc.EssentialFilter;
        import play.api.mvc.RequestHeader;
        import play.api.mvc.ResponseHeader;
        import play.filters.gzip.Gzip;
        import play.filters.gzip.GzipFilter;
        import scala.Function2;
        import scala.runtime.AbstractFunction2;
    
        public class MyGzipFilter implements EssentialFilter {
    
            private Function2<RequestHeader,ResponseHeader,Object> shouldGzip = new AbstractFunction2<RequestHeader,ResponseHeader,Object>(){
    
                @Override
                public Boolean apply(RequestHeader v1, ResponseHeader v2) {
                    return shouldGzipFunction(v1,v2);
                }
    
            };
            private GzipFilter filter = new GzipFilter(Gzip.gzip(8192),102400,shouldGzip);
    
            @Override
            public EssentialAction apply(EssentialAction next) {
                return filter.apply(next);
            }
    
            private boolean shouldGzipFunction(RequestHeader v1, ResponseHeader v2) {
    //your logic here
    
           }
        }
    
    import play.GlobalSettings;
    import play.api.mvc.EssentialFilter;
    
    public class Global extends GlobalSettings {
        public <T extends EssentialFilter> Class<T>[] filters() {
            return new Class[]{MyGzipFilter.class};
        }
    }
    

    【讨论】:

    • 谢谢,您的解决方案有效。但是我认为您犯了一个错误:该行应该是private GzipFilter filter = new GzipFilter(Gzip.gzip(8192),102400,shouldGzip); 请参阅the source:private val DefaultChunkSize = 8192。还是我错了?
    【解决方案2】:

    您可以在您的 java play 项目中使用 scala 文件。你不需要为此做任何特殊的步骤,所以如果你发现这个过滤器很容易在 scala 中编码 - 只需将 scala 文件添加到你的项目中。例如我有一个 java play 项目,但 gzip 过滤器在 scala 中:

    package filters
    
    import javax.inject.Inject
    
    import play.api.http.HttpFilters
    import play.filters.gzip.GzipFilter
    
    import akka.stream.Materializer
    
    import play.api.libs.concurrent.Execution.Implicits._
    
    class Gzip @Inject() (implicit val mat: Materializer) extends HttpFilters {
      def filters = Seq(new GzipFilter(shouldGzip = (request, response) =>
         response.body.contentType.exists(_.startsWith("text/html"))))
    }
    

    application.conf

    play.http.filters = "filters.Gzip"
    

    【讨论】:

    • 感谢您的回答!实际上,我最终使用的是 scala 文件/类。
    猜你喜欢
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多