2013-09-26 60 views
2

我想了解如何申請基於內容編碼gzip的不同攔截器|放氣,並根據供應數據的Accept-Encoding。我正在閱讀gzip/deflate攔截器,但不太明白這是如何工作的。球衣,內容的gzip /緊縮

public Response bigPayload(PayloadDto data) { 
    ... 
    return Response.ok(BigDataDto).build(); 
} 

基本上我想是能夠接受的gzip /放氣的有效載荷JSON和返回的gzip /如果支持緊縮的數據。

謝謝。

你正在尋找
+0

見https://jersey.java.net/documentation/latest/filters-and-interceptors.html#d0e6704 – 2013-09-26 05:56:29

+1

是的,我看到的是,這裏沒有說如何使頭靠等不同攔截器可以連接到一個不同的內容,據我所關心的文件不完整,對於這個話題也不清楚。 示例將工作。 – user2649908

回答

0

我從返回時,他們已設置頁眉Accept-Encoding: gzip, deflate那麼你需要能夠在應用服務器壓縮用戶請求一個壓縮的響應。

在Tomcat中,你需要改變<TOMCAT_HOME>/conf/server.xml壓縮是默認關閉的。

<Connector connectionTimeout="20000" 
      port="8080" protocol="HTTP/1.1" 
      redirectPort="8443" 
      compression="on" 
      compressionMinSize="1" 
      noCompressionUserAgents="gozilla, traviata" 
      compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"/> 

請注意,您需要定義您想要應用程序服務器進行壓縮的compressableMimeType。

你可以接着用捲曲測試這個....

壓縮內容...

curl http://localhost:8080/your/url/too/data 

壓縮內容...

curl -H "Accept-Encoding: gzip, deflate" http://localhost:8080/your/url/too/data 
2

要在服務器與澤西使用GZIP側,首先你應該實現ReaderInterceptor和WriterInterceptor:

@Provider // This Annotation is IMPORTANT! 
public class GZipInterceptor implements ReaderInterceptor, WriterInterceptor { 
    @Override 
    public Object aroundReadFrom(ReaderInterceptorContext context) throws IOException, WebApplicationException { 
     List<String> header = context.getHeaders().get("Content-Encoding"); 
     // decompress gzip stream only 
     if (header != null && header.contains("gzip")) 
      context.setInputStream(new GZIPInputStream(context.getInputStream())); 
     return context.proceed(); 
    } 

    @Override 
    public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException { 
     context.setOutputStream(new GZIPOutputStream(context.getOutputStream())); 
     context.getHeaders().add("Content-Encoding", "gzip"); 
     context.proceed(); 
    } 
} 

並確保此@Provider類的自動掃描包/它通過web.xml中配置的子包下:

<servlet> 
    <servlet-name>Jersey</servlet-name> 
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>jersey.config.server.provider.packages</param-name> 
     <param-value>your.provider.package</param-value> 
    </init-param> 
</servlet> 

如果你想使用需求gzip壓縮,也許你可以使用求助ThreadLocal變量,詳情請查看我的職務here

+0

非常有用,謝謝。缺少關閉if語句的大括號。 – seinecle