使用 Wildfly 对 http 响应进行 Gzip 编码

Gzip encoding http responses with Wildfly

如果请求包含 Accepted-Encoding:gzip header,您是否知道是否可以将 wildfly 10 上应用程序 运行 的响应编码为 gzip 格式?我希望仅通过 Wildfly 配置和响应来完成更改,以在 header 中包含一些指示,表明响应具有 gzip 编码(content-encoding : gzip)。

我已经读到,由于 wildfly 8 可以使用 gzip 过滤器进行此类编码,因此我尝试将过滤器添加到 Wildfly 配置,类似于此处描述的过滤器:https://rumianom.pl/rumianom/entry/gzip_content_encoding_in_wildfly,但是没有成功。我尝试了很多谓词,比如 equals[%{i,Accepted-Encoding},\"gzip\"](我在 undertow 单元测试中找到了类似的例子)或 regex[pattern='(?:gzip)(;.*)?', value=%{o,Accept-Encoding}, full-match=false]。遗憾的是 none 我的解决方案奏效了。

这个或其变体实际上应该有效(使用 Wfly10 并且已经这样做了很长时间):

<subsystem xmlns="urn:jboss:domain:undertow:1.2">
<buffer-cache name="default"/>
<server name="default-server">
    <http-listener name="default" socket-binding="http" max-post-size="4194304000" max-parameters="10000"/>
    <https-listener name="https" socket-binding="https" security-realm="WebRealm" enabled-cipher-suites="TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_DSS_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_SHA256,TLS_ECDHE_RSA_WITH_AES_128_SHA,TLS_ECDHE_ECDSA_WITH_AES_128_SHA,TLS_ECDHE_RSA_WITH_AES_256_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_SHA384,TLS_ECDHE_RSA_WITH_AES_256_SHA,TLS_ECDHE_ECDSA_WITH_AES_256_SHA,TLS_DHE_RSA_WITH_AES_128_SHA256,TLS_DHE_RSA_WITH_AES_128_SHA,TLS_DHE_DSS_WITH_AES_128_SHA256,TLS_DHE_RSA_WITH_AES_256_SHA256,TLS_DHE_DSS_WITH_AES_256_SHA,TLS_DHE_RSA_WITH_AES_256_SHA" enabled-protocols="TLSv1,TLSv1.1,TLSv1.2" max-post-size="4194304000" max-parameters="10000" record-request-start-time="true"/>
    <host name="default-host" alias="localhost">
        <access-log pattern="%h %{i,X-Forwarded-For} %t %r %s %BByte %Dms &quot;%{i,User-Agent}&quot; %I" prefix="access"/>
        <filter-ref name="gzipFilter" predicate="exists['%{o,Content-Type}'] and regex[pattern='(?:application/javascript|text/css|text/html|text/xml|application/json)(;.*)?', value=%{o,Content-Type}, full-match=true]"/>
        <filter-ref name="X-Content-Type-Options"/>
        <filter-ref name="Vary-header"/>
    </host>
</server>
<servlet-container name="default">
    <jsp-config x-powered-by="false"/>
    <websockets/>
</servlet-container>
<filters>
    <response-header name="Vary-header" header-name="Vary" header-value="Accept-Encoding"/>
    <response-header name="X-Content-Type-Options" header-name="X-Content-Type-Options" header-value="nosniff"/>
    <gzip name="gzipFilter"/>
</filters>
</subsystem>

然后您需要定义 reference/configure 过滤器,在您的情况下,至少是 gzipFilter。

过滤模式 <filter-ref name="gzipFilter" predicate="regex(pattern='(?:gzip)(;.*)?', value=%{i,Accept-Encoding}, full-match=true)"/> 有效。如果您的模式具有特殊字符,例如 .你需要逃避他们。 请注意,我没有找到任何关于 value= 中的 "i" 和 "o" 值的文档。似乎如果 "o" 给出模式搜索 header 从应用程序输出(响应),如果 "i" 给出它匹配输入消息(请求)。