2014-01-29 279 views
2

我在写一个REST服务,我发送的大小约为3MB的JSON响应。应用程序使用Scalatra Framework开发,并在Tomcat服务器上运行。由于数据量很大,我想在通过网络发送给浏览器客户端之前压缩内容。GZip压缩的REST响应

要压缩的响应,我在tomcat的server.xml文件中添加以下代码:

<Connector port="8080" maxHttpHeaderSize="8192" 
       maxThreads="150" minSpareThreads="25" maxSpareThreads="75" 
       enableLookups="false" redirectPort="8443" acceptCount="100" 
       connectionTimeout="20000" disableUploadTimeout="true" 
       compression="on" 
       compressionMinSize="100" 
       noCompressionUserAgents="gozilla, traviata" compressableMimeType="text/html,text/xml,text/json,text/javascript,text/css,text/plain,         application/javascript,application/xml,application/xml+xhtml,application/json"/> 

但我没有找到之前传送的内容,并添加上述配置后的任何不同。它正在添加内容编码标头内容编码:gzip。这并没有解决我的实际目标。

为了测试这个配置是否真正起作用,我将JSON文件复制到服务器并试图访问该文件。它被作为客户端的小型压​​缩文件接收。

似乎我缺少一些配置来添加HTTP压缩JSON响应作为压缩。有人可以帮我解决这个问题吗?

+0

看到这个回答gzip'ing回应:http://stackoverflow.com/a/4755728/89435 – mavroprovato

+0

@mavroprovato,谢谢。在建议主题中的讨论帮助我解决了我的问题 – Rajeev

回答

4

我能够通过使用ehcache-web dependency中的GzipFilter来解决此问题。

添加下面的依赖关系build.scala:

"org.slf4j" % "slf4j-jdk14" % "1.6.4", 
"net.sf.ehcache" % "ehcache-web" % "2.0.4", 

过滤器映射在web.xml中

<filter> 
     <filter-class>net.sf.ehcache.constructs.web.filter.GzipFilter</filter-class> 
     <filter-name>GzipFilter</filter-name> 
    </filter> 
    <filter-mapping> 
     <filter-name>GzipFilter</filter-name> 
     <url-pattern>/rest/*</url-pattern> 
    </filter-mapping> 

以上代码的变化已经解决了我的问题。现在响应被压缩。