17

CXFのドキュメントでは、キャッシングはAdvanced HTTPとして言及されています。

CXF JAXRS は、If-Match、If-Modified-Since、および ETags ヘッダーを処理することにより、多数の高度な HTTP 機能のサポートを提供します。JAXRS リクエスト コンテキスト オブジェクトを使用して、前提条件を確認できます。Vary、CacheControl、Cookie、および Set-Cookie もサポートされています。

私はこれらの機能を使用する (または少なくとも調査する) ことに本当に興味があります。ただし、「サポートを提供する」というのは非常に興味深いように聞こえますが、そのような機能の実装には特に役立ちません。If-Modified-Since、CacheControl、または ETags の使用方法に関するヘルプまたはポインタはありますか?

4

3 に答える 3

27

実際、答えは 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();
}
于 2010-01-19T09:24:33.993 に答える
5

今後のJAX-RS2.0では、http://jalg.net/2012/09/declarative-cache-control-with-jax-rs-2-0/で説明されているように、Cache-Controlを宣言的に適用できるようになります。

少なくともJerseyでこれをすでにテストできます。ただし、CXFとRESTEasyについてはよくわかりません。

于 2012-09-24T22:05:45.573 に答える