2010-09-02 6 views
2

Comment gzip une réponse ajax avec Struts2? J'ai essayé de créer un filtre mais cela n'a pas fonctionné. Au côté client, j'utilise jQuery et la réponse ajax que j'attends est en json.Comment gzip requêtes ajax avec Struts 2?

Ce code je sur le serveur:

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

Je redirigeant la réponse à la page jsp factice défini à struts.xml.

La raison pour laquelle je veux gzip les données de retour est parce qu'il y a une situation où je dois renvoyer un json de taille relativement grande au client.

Toute référence fournie sera appréciée.

Merci.

Répondre

5

Vous ne devriez pas gzip les réponses au hasard. Vous pouvez seulement gzip la réponse lorsque le client a notifié au serveur qu'il accepte (comprend) les réponses gzippées. Vous pouvez le faire en déterminant si l'en-tête de demande Accept-Encoding contient gzip. Si c'est le cas, vous pouvez envelopper en toute sécurité le OutputStream de la réponse dans un GZIPOutputStream. Il suffit d'ajouter au préalable l'en-tête Content-Encoding avec la valeur gzip pour informer le client de l'encodage du contenu, afin que le client sache qu'il doit le décompresser.

En bref:

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")); 

(notez que vous souhaitez définir le type de contenu et le codage des caractères ainsi, cela est pris en compte dans l'exemple)

Vous pourrait également configurer cela au niveau du serveur d'applications. Comme on ne sait pas lequel vous utilisez, voici un exemple ciblé sur Tomcat: vérifiez les attributs compression et compressableMimeType de l'élément <Connector> dans /conf/server.xml: HTTP connector reference. De cette façon, vous pouvez simplement écrire à la réponse sans vous soucier de gzipping.