JAX-RS Java EE 8:如果设置了某些标头,则 Gzip 输出 JSON



我正在做一个关于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(中使用它来决定是否压缩。

祝你好运

最新更新