Как сжать ajax-запросы в Struts 2? - PullRequest
4 голосов
/ 03 сентября 2010

Как получить ответ ajax с Struts2? Я пытался создать фильтр, но это не сработало. На стороне клиента я использую jQuery, и ожидаемый ответ ajax находится в json.

Это код, который я использовал на сервере:

    ByteArrayOutputStream out = new ByteArrayOutputStream();
    GZIPOutputStream gz = new GZIPOutputStream(out);
    gz.write(json.getBytes());
    gz.close();

Я перенаправляю ответ на фиктивную страницу jsp, определенную в struts.xml.

Причина, по которой я хочу сжать данные обратно, заключается в том, что есть ситуация, когда я должен отправить сравнительно большой размер json обратно клиенту.

Любая предоставленная ссылка будет оценена.

Спасибо.

Ответы [ 2 ]

6 голосов
/ 29 октября 2010

Если ваш ответ JSON, я бы порекомендовал использовать плагин struts2-json http://struts.apache.org/2.1.8/docs/json-plugin.html и установить для параметра enableGZIP значение true.

6 голосов
/ 03 сентября 2010

Вы не должны случайным образом отправлять ответы.Вы можете сжать ответ только в том случае, если клиент уведомил сервер о том, что он принимает (понимает) сжатые ответы.Это можно сделать, определив, содержит ли заголовок запроса Accept-Encoding gzip.Если оно есть, вы можете смело обернуть OutputStream ответа в GZIPOutputStream.Вам нужно только предварительно добавить заголовок Content-Encoding со значением gzip, чтобы сообщить клиенту, в какую кодировку было отправлено содержимое, чтобы клиент знал, что ему нужно его разархивировать.

В двух словах:

response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
OutputStream output = response.getOutputStream();

String acceptEncoding = request.getHeader("Accept-Encoding");
if (acceptEncoding != null && acceptEncoding.contains("gzip")) {
    response.setHeader("Content-Encoding", "gzip");
    output = new GZIPOutputStream(output);
}

output.write(json.getBytes("UTF-8"));

(обратите внимание, что вы также хотели бы установить тип содержимого и кодировку символов, это учитывается в примере)

Вы также можете настроить это на уровне сервера приложений.Поскольку неясно, какой из них вы используете, вот лишь пример, нацеленный на Tomcat: проверьте атрибуты compression и compressableMimeType элемента <Connector> в /conf/server.xml: Ссылка на HTTP-коннектор .Таким образом, вы можете просто написать ответ, не беспокоясь о том, чтобы его сжать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...