我正在做一个关于Java EE 8
的项目。我正在使用 JAX-RS 来构建我的 API。现在,如果在请求中找到标头(例如gzip: 1
(,我想压缩我所有 API 的输出(顺便说一下,所有 API 都返回 JSON(。
有没有办法拦截ContainerResponseFilter
中的所有响应,然后压缩/GZIP输出JSON?
您可以使用JAX- RSWriterInterceptor
来更改原始输出流。
一切都在这里解释:https://dennis-xlc.gitbooks.io/restful-java-with-jax-rs-2-0-2rd-edition/en/part1/chapter12/reader_and_writer_interceptors.html
以下是有趣的部分:
@Provider
public class GZIPEncoder implements WriterInterceptor {
public void aroundWriteTo(WriterInterceptorContext ctx)
throws IOException, WebApplicationException {
GZIPOutputStream os = new GZIPOutputStream(ctx.getOutputStream());
ctx.getHeaders().putSingle("Content-Encoding", "gzip");
ctx.setOutputStream(os);
ctx.proceed();
return;
}
}
现在为了在请求和响应之间共享一些信息(是否标记为gzip(,您可以使用InterceptorContext.set/getProperty
:
"属性允许 JAX-RS 过滤器和拦截器交换此接口尚未提供的其他定制信息。
因此,首先在拦截请求时设置一个属性,然后在写入拦截器(GZIPEncoder(中使用它来决定是否压缩。
祝你好运