jakarta-ee - JAX-RS Java EE 8:如果设置了某些标头,则 Gzip 输出 JSON
问题描述
我正在做一个项目Java EE 8
。我正在使用 JAX-RS 来构建我的 API。gzip: 1
现在,如果在请求中找到类似的标头,我想压缩所有 API 的输出(顺便说一下,所有 API 都返回 JSON) 。
有什么方法可以拦截所有响应ContainerResponseFilter
,然后压缩/GZIP输出JSON?
解决方案
您可以使用 JAX-RSWriterInterceptor
来更改原始输出流。
下面是有趣的部分:
@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)中使用它来决定是否压缩。
祝你好运
推荐阅读
- twig - 在 Twig 中将字符串转换为浮点数
- firebase - 如何在 Firebase Functions 中考虑 Google Cloud Firestore 安全规则?
- php - php中的封装调用
- python-3.x - 如何将 Python 中的字典绘制成 3D 绘图?
- c - 分段故障。我哪里错了?C
- neo4j - 在同一关系上匹配 where AND
- xamarin - 如何在 Xamarin 中创建自定义控件?
- javascript - 如何使 TypeScript 枚举限制为特定数字
- c# - 尝试使用继承将新对象添加到列表时出现 NullReferenceException
- javascript - 在逆向工程代码制作网页插件时,如何找到某个元素接收到事件时调用了什么函数?