通过使用ResourceFilterFactory,使用Jersey可以轻松实现-
您可以创建附加到方法的任何自定义注释来设置缓存控制设置。应用程序初始化时,将为每个发现的资源方法调用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();}通过将以下初始化参数添加到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>



