JAX-RS WildFly 10 上的 REST 服务 + EJB,总是在响应中添加 no-cache HTTP header

JAX-RS REST service + EJB on WildFly 10, always adds no-cache HTTP header in responses

我写了一个提供休息服务的无状态EJB。 我正在使用 Wildfly 10 应用程序服务器并使用 Netbeans IDE 进行开发。

我试图通过在服务方法的 http-response 中添加 max-age header 来缓存几个方法的 return 值几个小时。请考虑这是我的 bean 的简化版本:

    @Stateless
    @DeclareRoles({"role1","role2"})
    @RolesAllowed({"role1","role2"})
    @Path("api-dummy")
    public class DummyApiREST {

        @EJB
        private StuffFacade stuffFacade;

        @GET
        @Path("get-stuff")
        @Produces({MediaType.APPLICATION_JSON})
        public Response findStuff() {
            Stuff stuff = stuffFacade.getStuff();
            Response.ResponseBuilder builder = Response.status(Response.Status.OK).entity(stuff);
            Utils.setCacheHeader(maxAgeSeconds, builder);
            return builder.build();
        }
   }

以及 setCacheHeader 方法:

private static Response.ResponseBuilder setCacheHeader(int maxAgeSeconds, Response.ResponseBuilder builder) {
        CacheControl cc = new CacheControl();
        cc.setNoCache(false);
        cc.setNoStore(false);
        cc.setMaxAge(maxAgeSeconds);
        cc.setPrivate(true);
        builder.cacheControl(cc);
        return builder;
 }

但是 "get-stuff" 的 returned 响应总是包含 Cache-Control header 的副本;重复的 header 包含 no-cache 指令(这也是一个 Pragma header):

HTTP/1.1 200 OK
Expires: 0
Cache-Control: no-cache, no-store, must-revalidate
Cache-Control: no-transform, max-age=60, private
X-Powered-By: Undertow/1
Server: WildFly/10
Pragma: no-cache
Date: Thu, 13 Apr 2017 15:11:17 GMT
Connection: keep-alive
Content-Type: application/json

我想问题是由我的 EJB 中 JAX-RS 服务的默认行为或过滤器引起的。我的问题是:

注意:也许这不相关,我已经配置了一个 jdbc security-domain 并且用户身份验证和主体工作正常。

此致

我找到了解决办法。 默认情况下,Wildfly(我认为 JBoss 也是)将 no-cache 指令添加到 all 私有资源(需要鉴权的资源)

您必须更改 standalone.xml 文件中的配置,添加属性 disable-caching-*到 server-container 标签:

<servlet-container name="default" disable-caching-for-secured-pages="false">
                    <jsp-config/>
                    <websockets/>
</servlet-container>

通过这种方式,不再将 Pragmanocache 指令添加到响应和我在问题中发布的代码中,它只是按预期工作。

编辑:提醒,当请求私有资源时,在同一个URL,必须return不同的内容给不同的用户你必须:

  • private header 添加到该响应中,以便您的反向代理 不缓存该内容或替代..
  • ..留下 nocache header 用于响应