java - with - Jersey:默認緩存控制為無緩存




jersey restful download (4)

我想你可以使用

isNoCache(true)

這將停止瀏覽器中的緩存。

看到:

http://jersey.java.net/nonav/apidocs/1.12/jersey/javax/ws/rs/core/CacheControl.html#isNoCache%28%29

希望這可以幫助。

在編寫REST風格的Web服務時,如果在客戶端(當前是.NET胖客戶端)上啟用任何類型的緩存,則會遇到問題。 默認情況下,Jersey不會發送任何類型的緩存控制頭,所以客戶端會自動緩存大部分頁面(這似乎是有效的行為)。

我想讓Jersey在默認情況下發送一個“no-cache”的緩存控制,然後特別是響應覆蓋緩存控制。

有沒有辦法與澤西島做到這一點?

我發現RESTeasy能夠使用@NoCache註釋來指定整個類的設置,但是我沒有發現任何與Jersey相似的東西。


澤西通過使用ResourceFilterFactory這很容易 - 您可以創建任何自定義註釋附加到您的方法來設置緩存控制設置。 ResourceFilterFactories會在應用程序初始化時調用每個被發現的資源方法 - 在你的ResourceFilterFactory中,你可以檢查方法是否有你的@CacheControlHeader註解(或者任何你想調用的方法) - 如果沒有,只需返迴響應過濾器,添加“no-cache “指令來響應,否則應該使用註釋中的設置。 這裡是一個如何做到這一點的例子:

public class CacheFilterFactory implements ResourceFilterFactory {
    private static final List<ResourceFilter> NO_CACHE_FILTER = Collections.<ResourceFilter>singletonList(new CacheResponseFilter("no-cache"));

    @Override
    public List<ResourceFilter> create(AbstractMethod am) {
        CacheControlHeader cch = am.getAnnotation(CacheControlHeader.class);
        if (cch == null) {
            return NO_CACHE_FILTER;
        } else {
            return Collections.<ResourceFilter>singletonList(new CacheResponseFilter(cch.value()));
        }
    }

    private static class CacheResponseFilter implements ResourceFilter, ContainerResponseFilter {
        private final String headerValue;

        CacheResponseFilter(String headerValue) {
            this.headerValue = headerValue;
        }

        @Override
        public ContainerRequestFilter getRequestFilter() {
            return null;
        }

        @Override
        public ContainerResponseFilter getResponseFilter() {
            return this;
        }

        @Override
        public ContainerResponse filter(ContainerRequest request, ContainerResponse response) {
            // attache Cache Control header to each response based on the annotation value
            response.getHttpHeaders().putSingle(HttpHeaders.CACHE_CONTROL, headerValue);
            return response;
        }
    }
}

註釋可以像這樣:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface CacheControlHeader {
    String value();
}

通過將以下init參數添加到web.xml中Jersey servlet的定義中,可以在您的應用程序中註冊ResourceFilterFactory:

<init-param>
    <param-name>com.sun.jersey.spi.container.ResourceFilters</param-name>
    <param-value>package.name.CacheFilterFactory</param-value>
</init-param>

我發現了一個可以禁用緩存的註釋。 您可以使用以下註釋為您的API:

@CacheControl(noCache = true)

參考: 澤西註解緩存控制


由於ResourceFilterFactory和ResourceFilter已被刪除,@ martin-matula的解決方案無法與JAX-RS 2.0 / Jersey 2.x一起使用。 該解決方案可以按照以下方式適應JAX-RS 2.0。

註解:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface CacheControlHeader {
  String value();
}

DynamicFeature:

@Provider
public class CacheFilterFactory implements DynamicFeature {

  private static final CacheResponseFilter NO_CACHE_FILTER = 
          new CacheResponseFilter("no-cache");

  @Override
  public void configure(ResourceInfo resourceInfo, 
                        FeatureContext featureContext) {

    CacheControlHeader cch = resourceInfo.getResourceMethod()
            .getAnnotation(CacheControlHeader.class);
    if (cch == null) {
      featureContext.register(NO_CACHE_FILTER);
    } else {
      featureContext.register(new CacheResponseFilter(cch.value()));
    }
  }

  private static class CacheResponseFilter implements ContainerResponseFilter {
    private final String headerValue;

    CacheResponseFilter(String headerValue) {
      this.headerValue = headerValue;
    }

    @Override
    public void filter(ContainerRequestContext containerRequestContext,
                       ContainerResponseContext containerResponseContext) {
      // attache Cache Control header to each response
      // based on the annotation value                     
      containerResponseContext
              .getHeaders()
              .putSingle(HttpHeaders.CACHE_CONTROL, headerValue);
    }

  }
}

CacheFilterFactory需要註冊Jersey。 我正在通過Dropwizard - 使用environment.jersey()。register() - 但是在獨立系統上,我明白這可以通過例如讓澤西掃描您的類為@Provider註釋定義以下內容在您的web.xml :

<servlet>
    <servlet-name>my.package.MyApplication</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>

    <!-- Register resources and providers under my.package. -->
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>my.package</param-value>
    </init-param>
</servlet>

有關註冊組件的更多信息,請參閱此文章







jax-rs