我尝试使用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"
}
答案 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应用程序中。