首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jersey,内容gzip/deflate

Jersey,内容gzip/deflate
EN

Stack Overflow用户
提问于 2013-09-26 13:13:22
回答 2查看 2.3K关注 0票数 2

我正在尝试理解如何根据Content-Encoding gzip|deflate应用不同的拦截器,并根据Accept-Encoding提供数据。我读过关于gzip/deflate拦截器的文章,但我不太理解它是如何工作的。

代码语言:javascript
复制
public Response bigPayload( PayloadDto data ) {
   ...
   return Response.ok( BigDataDto ).build(); 
}

基本上,我希望能够接受gzip/deflate作为有效负载json,并返回gzip/deflate数据(如果支持)。

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2014-05-13 22:03:27

要在服务器端使用GZIP和Jersey,首先应该实现ReaderInterceptor和WriterInterceptor:

代码语言:javascript
复制
@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配置的自动扫描包/子包下:

代码语言:javascript
复制
<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>
票数 2
EN

Stack Overflow用户

发布于 2013-11-05 17:25:25

当用户请求设置了头Accept-Encoding: gzip, deflate时,您希望从用户请求返回压缩响应,然后您需要在应用服务器中启用压缩。

在Tomcat中,您需要更改<TOMCAT_HOME>/conf/server.xml,因为压缩在默认情况下是关闭的。

代码语言:javascript
复制
    <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"/>

请注意,您需要定义希望应用程序服务器压缩的压缩compress。

然后你可以用curl来测试它……

未压缩内容...

代码语言:javascript
复制
curl http://localhost:8080/your/url/too/data

压缩内容...

代码语言:javascript
复制
curl -H "Accept-Encoding: gzip, deflate" http://localhost:8080/your/url/too/data
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19019879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档