Управление фильтром кодирования gzip в Java

В Play 2.3 вы можете настроить кодировку gzip для ответов, настроив фильтр gzip с помощью объекта Global. Посмотрите здесь, как настроить этот фильтр при использовании Scala или при использовании Джава.

При использовании Play with Scala вы также можете контролировать, какие ответы включены в фильтр, а какие нет, с помощью параметра shouldGzip, который принимает функцию заголовка запроса и заголовка ответа. Например. здесь будут сжаты только документы с кодировкой text/html:

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

Как я могу добиться того же в версии Java?


person mkurz    schedule 15.09.2014    source источник


Ответы (2)


Я нашел решение. Вы должны реализовать собственный фильтр и делегировать все запросы 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};
    }
}
person Andrzej Jozwik    schedule 16.09.2014
comment
Спасибо, ваше решение сработало. Однако я думаю, что вы допустили ошибку: строка должна быть private GzipFilter filter = new GzipFilter(Gzip.gzip(8192),102400,shouldGzip); См. источник: private val DefaultChunkSize = 8192. Или я ошибаюсь? - person mkurz; 13.02.2015

Вы можете использовать файл scala в своем проекте java play. Никаких специальных действий для этого делать не нужно, так что если вы видите, что этот фильтр очень легко написать на 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"
person Andriy Kuba    schedule 20.11.2015
comment
Спасибо за ответ! На самом деле я использовал файл/класс scala. - person mkurz; 23.11.2015