如何使用 CXF、JAX-RS 和 HTTP Caching

2022-09-03 00:29:36

CXF 文档将缓存称为高级 HTTP

CXF JAXRS 通过处理 If-Match、If-Modified-Since 和 ETags 标头,为许多高级 HTTP 功能提供支持。JAXRS 请求上下文对象可用于检查前提条件。Vary、CacheControl、Cookie 和 Set-Cookie 也受支持。

我真的很有兴趣使用这些功能(或至少探索)。但是,虽然“提供支持”听起来很有趣,但它在实现此类功能方面并不是特别有用。有关如何使用 If-Modified-From、CacheControl 或 ETags 的任何帮助或指示?


答案 1

实际上,答案并非特定于 CXF - 它是纯 JAX-RS:

// IPersonService.java
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.Response;

@GET
@Path("/person/{id}")
Response getPerson(@PathParam("id") String id, @Context Request request);


// PersonServiceImpl.java
import javax.ws.rs.core.CacheControl;
import javax.ws.rs.core.EntityTag;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;

public Response getPerson(String name, Request request) {
  Person person = _dao.getPerson(name);

  if (person == null) {
    return Response.noContent().build();
  }

  EntityTag eTag = new EntityTag(person.getUUID() + "-" + person.getVersion());

  CacheControl cc = new CacheControl();
  cc.setMaxAge(600);

  ResponseBuilder builder = request.evaluatePreconditions(person.getUpdated(), eTag);

  if (builder == null) {
    builder = Response.ok(person);
  }

  return builder.cacheControl(cc).lastModified(person.getUpdated()).build();
}

答案 2

在即将推出的 JAX-RS 2.0 中,将能够以声明方式应用高速缓存控制,如 http://jalg.net/2012/09/declarative-cache-control-with-jax-rs-2-0/

您至少可以在泽西岛进行测试。虽然不确定CXF和RESTEasy。