Jersey 球衣,含量gzip/deflate

Jersey 球衣,含量gzip/deflate,jersey,jersey-2.0,Jersey,Jersey 2.0,我试图理解如何应用基于内容编码的不同拦截器gzip | deflate并根据Accept编码提供数据。我读过关于gzip/deflate拦截器的文章,但不太明白它是如何工作的 public Response bigPayload( PayloadDto data ) { ... return Response.ok( BigDataDto ).build(); } 基本上,我希望能够接受有效负载json的gzip/deflate,并在支持的情况下返回gzip/deflate数据

我试图理解如何应用基于内容编码的不同拦截器gzip | deflate并根据Accept编码提供数据。我读过关于gzip/deflate拦截器的文章,但不太明白它是如何工作的

public Response bigPayload( PayloadDto data ) {
   ...
   return Response.ok( BigDataDto ).build(); 
}
基本上,我希望能够接受有效负载json的gzip/deflate,并在支持的情况下返回gzip/deflate数据


谢谢。

当用户设置了头
接受编码:gzip,deflate
时,您希望从用户请求返回压缩响应,然后您需要在应用程序服务器中启用压缩

在Tomcat中,您需要更改
/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"/>
压缩内容

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

要在服务器端将GZIP与Jersey一起使用,首先应该实现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//此注释非常重要!
公共类GziInterceptor实现ReaderInterceptor、WriterInterceptor{
@凌驾
ReadFrom周围的公共对象(ReaderInterceptorContext上下文)引发IOException、WebApplicationException{
List header=context.getHeaders().get(“内容编码”);
//仅解压缩gzip流
if(header!=null&&header.contains(“gzip”))
setInputStream(新的GZIPInputStream(context.getInputStream());
返回上下文。继续();
}
@凌驾
WriteTo(WriterInterceptorContext上下文)周围的public void引发IOException、WebApplicationException{
setOutputStream(新的gzip输出流(context.getOutputStream());
context.getHeaders().add(“内容编码”、“gzip”);
context.procedure();
}
}
然后确保该@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>

运动衫
org.glassfish.jersey.servlet.ServletContainer
jersey.config.server.provider.packages
您的.provider.package

如果你想按需使用gzip压缩,也许你可以使用ThreadLocal变量来获得帮助,详细信息请查看我的帖子。

请看是的,我看到了,它在哪里说如何使它的头依赖于不同的内容,所以不同的拦截器可以附加到不同的内容,就我而言,这个主题的文档既不完整也不清楚。示例将起作用。非常有用,谢谢。缺少用于关闭if语句的右大括号。