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 服务的默认行为或过滤器引起的。我的问题是:
- 是否有更好的方法来设置 max-age 并在 JAX-RS + EJB 中启用缓存?
- 有没有办法禁用此 no-cache 默认行为? (或者换句话说,这通常在哪里配置?)
- ..and..我的解决方案有什么问题? :-)
注意:也许这不相关,我已经配置了一个 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>
通过这种方式,不再将 Pragma 和 nocache 指令添加到响应和我在问题中发布的代码中,它只是按预期工作。
编辑:提醒,当请求私有资源时,在同一个URL,必须return不同的内容给不同的用户你必须:
- 将 private header 添加到该响应中,以便您的反向代理
不缓存该内容或替代..
- ..留下 nocache header 用于响应
我写了一个提供休息服务的无状态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 服务的默认行为或过滤器引起的。我的问题是:
- 是否有更好的方法来设置 max-age 并在 JAX-RS + EJB 中启用缓存?
- 有没有办法禁用此 no-cache 默认行为? (或者换句话说,这通常在哪里配置?)
- ..and..我的解决方案有什么问题? :-)
注意:也许这不相关,我已经配置了一个 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>
通过这种方式,不再将 Pragma 和 nocache 指令添加到响应和我在问题中发布的代码中,它只是按预期工作。
编辑:提醒,当请求私有资源时,在同一个URL,必须return不同的内容给不同的用户你必须:
- 将 private header 添加到该响应中,以便您的反向代理 不缓存该内容或替代..
- ..留下 nocache header 用于响应