Jersey 球衣,含量gzip/deflate
我试图理解如何应用基于内容编码的不同拦截器gzip | deflate并根据Accept编码提供数据。我读过关于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数据
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语句的右大括号。