java - Jersey:默认缓存控制为无缓存

标签 java rest jersey jax-rs

在编写 RESTful Web 服务时,如果我在客户端(当前为 .NET 胖客户端)上启用任何类型的缓存,我会遇到问题。默认情况下,Jersey 不会发送任何类型的缓存控制 header ,因此客户端会自动缓存大多数页面(这似乎是有效的行为)。

我希望 Jersey 默认发送“无缓存”的缓存控制,然后特别是响应会覆盖缓存控制。

有什么方法可以用 Jersey 做到这一点?

我发现 RESTeasy 有能力使用@NoCache 注解来指定整个类的设置,但是我没有发现任何与 Jersey 类似的东西。

最佳答案

在 Jersey 中使用 ResourceFilterFactory 可以轻松实现这一点 - 您可以创建附加到方法的任何自定义注释来设置缓存控制设置。当应用程序初始化时,每个发现的资源方法都会调用 ResourceFilterFactories - 在您的 ResourceFilterFactory 中,您可以检查该方法是否具有您的 @CacheControlHeader 注释(或任何您想要调用的注释) - 如果没有,只需返回添加“无缓存”的响应过滤器"响应的指令,否则它应该使用注释中的设置。以下是如何做到这一点的示例:

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();
}

ResourceFilterFactory 可以通过在 web.xml 中的 Jersey servlet 定义中添加以下 init 参数来注册到您的应用程序中:

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

关于java - Jersey:默认缓存控制为无缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10934316/

相关文章:

java - 在函数原型(prototype)中它显示错误

java - 服务器签名声明 : REST Authentication without server side caching

xml - Grails RestClient访问POST响应XML

rest - REST 身份验证具体用在哪里?

java - JSON (org.json) 在发送到 REST 服务时丢失值

java - Jersey POJOMappingFeature 将 null 转换为空字符串?

java - 从 JAX-RS 1.x 迁移到 2.x( Jersey )- 将 QueryParams 设置为 map ?

java - 生成列名行

java - 菜单项标题未显示

c# - 如何在 Java 中使用 .Net 程序集