Не удается сжать ответ сервера Java, отправленный в JSP - PullRequest
1 голос
/ 24 февраля 2012

У меня проблемы с возвратом сжатого ответа (GZip) из моего сервлета Java в JSP.

Поток:

  1. Запрос приходит к сервлету Java
  2. Обработка запроса и создание объекта JSON с ответом
  3. Преобразование объекта JSON в строку
  4. Сжатие строки ответа с помощью GZip
  5. Сжатая строка ответа установленакак атрибут в объекте запроса и управление передается в JSP
  6. В JSP строка ответа (сжатая) печатается на экране

Меры предосторожности:

  1. Для объекта запроса установлено «Accepting-Encoding» с помощью «gzip»
  2. В заголовке ответа «Content-Encoding» установлено на «gzip»
  3. Тип содержимого ответа установлен на «application / json»
  4. Кодировка символов ответа установлена ​​на «ISO-8859-1»

Результат:

  1. Firefox показывает «Ошибка кодирования содержимого» * ​​1034 *
  2. Chrome показывает «Ошибка 330 (net :: ERR_CONTENT_DECODING_FAILED):Неизвестная ошибка."

Может ли кто-нибудь помочь мне указать, в правильном направлении, пожалуйста?

Ответы [ 2 ]

3 голосов
/ 24 февраля 2012

Сжатая строка ответа задается как атрибут в объекте запроса, и управление передается в JSP

Вы не должны были перенаправлять ответ JSON в JSP,Вы должны были напечатать JSON plain в ответ и иметь код JavaScript / Ajax в вашем приложении JSP Android для вызова URL сервлета, который возвращает JSON.См. Также Как использовать сервлеты и Ajax? .

Что касается сжатия GZIP, вам не следует делать это самостоятельно.Пусть сервер сделает сам.

Исправьте ваш код, чтобы удалить все попытки ручного сжатия ответа, в итоге он должен выглядеть примерно так:

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String json = createItSomehow();
    response.setContentType("application/json");
    response.setCharacterEncoding("UTF-8");
    response.getWriter().write(json);
}

Вот и все, если вы позволитеВаше приложение для Android вызовет URL-адрес сервлета, оно получит строку JSON.

Наконец, отредактируйте конфигурацию сервера, чтобы включить автоматическое сжатие GZIP.В случае, например, Tomcat, это будет вопрос добавления compression="on" к элементу <Connector> в файле /conf/server.xml Tomcat:

<Connector ... compression="on">

Согласно документация , сжимаемые типы пантомимы по умолчанию text/html,text/xml,text/plain.Вы можете настроить это так, чтобы добавить application/json.

<Connector ... compression="on" compressableMimeType="text/html,text/xml,text/plain,application/json">

Несвязанный к конкретной проблеме, кодировка символа ответа должна быть установлена ​​на UTF-8 что соответствует спецификации JSON.

2 голосов
/ 24 февраля 2012

JSP предназначены для визуализации текстовых данных клиенту. GZIP - это двоичные данные, даже если это сжатый текст внизу.

Я предлагаю использовать фильтр сервлетов GZIP для сжатия ваших данных на лету, вместо того, чтобы делать это программно в вашей бизнес-логике.

См. Этот предыдущий вопрос о том, как получить один из готовых: Какой компрессионный (самый популярный GZIP-фильтр) вы бы предложили?

Если этого не сделать, то напишите свой собственный фильтр сервлетов, который делает то же самое.

...