首页 > 解决方案 > JAX-RS Java EE 8:如果设置了某些标头,则 Gzip 输出 JSON

问题描述

我正在做一个项目Java EE 8。我正在使用 JAX-RS 来构建我的 API。gzip: 1现在,如果在请求中找到类似的标头,我想压缩所有 API 的输出(顺便说一下,所有 API 都返回 JSON) 。

有什么方法可以拦截所有响应ContainerResponseFilter,然后压缩/GZIP输出JSON?

标签: jakarta-eewildfly

解决方案


您可以使用 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)中使用它来决定是否压缩。

祝你好运


推荐阅读