JBoss7为RESTEasy的所有响应设置Cache-Control,Pragma到no-cache

时间:2016-01-30 02:47:03

标签: jboss jax-rs jboss7.x resteasy cache-control

我尝试使用RESTEasy框架将Cache-Control标头添加到JBoss 7中生成的响应中。但是,由于JBoss默认添加了no-cache标头,所有响应最终都会获得多个Cache-Control标头。

我无法找到任何设置将其删除,并且添加拦截器也无法正常工作,因为稍后会添加无缓存标头。

有人能告诉我如何在JBoss 7中禁用默认的pragma和cache-control标头吗?

注意:我正在使用无状态EJB的resteasy。

@Path("/api")
@Local
public interface UCSRestServiceInterface
{
    @GET
    @Path("/token")
    @Produces("application/json")
    @Cache(maxAge = 3600, noTransform = true)
    public Response getToken();
}

获取响应标题,

{
  "pragma": "No-cache",
  "date": "Thu, 11 Feb 2016 20:16:30 GMT",
  "content-encoding": "gzip",
  "server": "Apache-Coyote/1.1",
  "x-frame-options": "SAMEORIGIN",
  "vary": "Accept-Encoding,User-Agent",
  "content-type": "application/json",
  "cache-control": "no-cache, no-transform, max-age=3600",
  "transfer-encoding": "chunked",
  "connection": "Keep-Alive",
  "keep-alive": "timeout=15, max=100",
  "expires": "Wed, 31 Dec 1969 19:00:00 EST"
}

2 个答案:

答案 0 :(得分:1)

Web应用程序中的过滤器资源基本上允许您拦截请求和响应,主要是为一些通过更改请求/响应标头工作的用例而设计的。更多详情here

由于您使用的是RESTEasy,因此您可以使用ContainerResponseFilter; JAX-RS提供的过滤器接口。您可以通过实现此接口来编写自定义筛选器。过滤器类(在您的Web应用程序源代码中添加一个)如下所示: -

@Provider
public class YourCustomFilter implements ContainerResponseFilter{

// you can check the actual string value by using method "getStringHeaders" on 'resp' below
private static final String CACHE_CONTROL = "cache-control";

@Override
public void filter(ContainerRequestContext req,
        ContainerResponseContext resp) throws IOException {

    if(resp.getHeaders().containsKey(CACHE_CONTROL)){
       resp.getHeaders().remove(CACHE_CONTROL);
       resp.getHeaders().add(CACHE_CONTROL, "no-transform, max-age=3600");
    }
    resp.getHeaders().add(CACHE_CONTROL, "no-transform, max-age=3600");

  }

}

在这里,你基本上检查Cache-Control标题的前提,如果存在,删除现有的标题并添加一个你自己的标题。 请不要忘记jax rs运行时发现自定义过滤器所需的@Provider注释。

请注意,使用此过滤器会拦截对您的webapp的所有请求。如果您希望拦截某个资源或资源方法,可以探索@NameBinding的使用

如果有效,请告诉我。

答案 1 :(得分:0)

我发现此解决方法包括在存在“ Cache-Control”标头且不存在“ no-cache”时为Pragma标头设置空值

def appendCategorySlug(self, slug):
    parts = slug.split('-')
    parent = self.categoryModel.invisibleRootItem()
    for name in parts:
        for row in range(parent.rowCount()):
            child = parent.child(row)
            if child.text() == name:
                parent = child
                break
        else:
            item = QtGui.QStandardItem(name)
            parent.appendRow(item)
            parent = item

import javax.annotation.Priority; import javax.ws.rs.Priorities; import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerResponseContext; import javax.ws.rs.container.ContainerResponseFilter; import javax.ws.rs.core.CacheControl; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.ext.Provider; import java.io.IOException; @Priority(Priorities.HEADER_DECORATOR - 1) @Provider public class PragmaRemover implements ContainerResponseFilter { private static final String PRAGMA = "Pragma"; @Override public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException { MultivaluedMap<String, Object> headers = responseContext.getHeaders(); if(headers.containsKey(HttpHeaders.CACHE_CONTROL)){ for (Object header : headers.get(HttpHeaders.CACHE_CONTROL)) { CacheControl cacheControl = (CacheControl) header; if(!cacheControl.isNoCache()){ headers.add(PRAGMA, ""); } } } } } 要确保由resteasy设置了缓存头。

请不要忘记将此过滤器添加到您的Jax-Rs应用程序中。