JBoss7设置缓存控制,将RESTEasy的所有响应的Pragma设置为无缓存
我试图使用RESTEasy框架将缓存控制头添加到JBoss7中生成的响应中。但是,由于JBoss在默认情况下添加了一个无缓存头,所有响应最终都会得到多个缓存控制头 我找不到任何删除它的设置,添加拦截器也不起作用,因为稍后会添加无缓存头 有人能告诉我如何在JBoss7中禁用默认的pragma和cache控制头吗 注意:我将resteasy用于无状态EJBJBoss7设置缓存控制,将RESTEasy的所有响应的Pragma设置为无缓存,jboss,jax-rs,jboss7.x,resteasy,cache-control,Jboss,Jax Rs,Jboss7.x,Resteasy,Cache Control,我试图使用RESTEasy框架将缓存控制头添加到JBoss7中生成的响应中。但是,由于JBoss在默认情况下添加了一个无缓存头,所有响应最终都会得到多个缓存控制头 我找不到任何删除它的设置,添加拦截器也不起作用,因为稍后会添加无缓存头 有人能告诉我如何在JBoss7中禁用默认的pragma和cache控制头吗 注意:我将resteasy用于无状态EJB @Path("/api") @Local public interface UCSRestServiceInterface { @GET
@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"
}
web应用程序中的过滤器资源基本上可以让您拦截请求和响应,主要是为一些通过更改请求/响应头工作的用例而设计的。更多细节 因为您使用的是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");
}
}
在这里,您基本上检查缓存控制头的PRESENSE,如果存在,则删除现有的头并添加您自己的头。
请不要忘记jax-rs运行时发现定制过滤器所需的@Provider
注释
请注意,使用此筛选器将拦截对您的webapp的所有请求。如果您希望拦截某个资源或资源方法,可以探索
让我知道这是否有效。我发现这种解决方法包括在存在“缓存控制”标头且不存在“无缓存”时为Pragma标头设置空值
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, "");
}
}
}
}
}
import javax.annotation.Priority;
导入javax.ws.rs.Priorities;
导入javax.ws.rs.container.ContainerRequestContext;
导入javax.ws.rs.container.ContainerResponseContext;
导入javax.ws.rs.container.ContainerResponseFilter;
导入javax.ws.rs.core.CacheControl;
导入javax.ws.rs.core.HttpHeaders;
导入javax.ws.rs.core.MultivaluedMap;
导入javax.ws.rs.ext.Provider;
导入java.io.IOException;
@优先级(Priorities.HEADER_DECORATOR-1)
@提供者
公共类PragmaRemover实现ContainerResponseFilter{
私有静态最终字符串PRAGMA=“PRAGMA”;
@凌驾
公共无效筛选器(ContainerRequestContext requestContext、ContainerResponseContext responseContext responseContext)引发IOException{
多值映射头=responseContext.getHeaders();
if(headers.containsKey(HttpHeaders.CACHE_控件)){
for(对象头:headers.get(HttpHeaders.CACHE_控件)){
CacheControl CacheControl=(CacheControl)头;
如果(!cacheControl.isNoCache()){
headers.add(PRAGMA,“”);
}
}
}
}
}
Priorities.HEADER\u DECORATOR-1
用于确保缓存头已由resteasy设置
不要忘记将这个过滤器添加到Jax-Rs应用程序。编写一个过滤器。接受回应;我对wildfly 10也有同样的问题(看起来也和wildfly 8一样),在响应头中始终存在以下内容:“缓存控制:无缓存,无存储,必须重新验证”。添加@Cache注释只需添加第二个头字段。这不可能是正确的行为!你找到这个问题的解决办法了吗?对不起。但添加过滤器也不能解决问题。筛选器找到的唯一标头是content type,这表明JBOSS正在处理响应筛选器后添加Pragma+缓存控制标头。看起来在上有解决方案,但我没有付费订阅来查看。抱歉。有几天他离开了苏。您可以尝试两件事:-1)尝试将@BindingPriority(0)注释添加到筛选器中。2) 导航到在中找到的server.xml,在resteasy中看不到任何BindingPriority注释。jboss 7中standalone.xml中没有阀门设置(server.xml在旧版本中)。尝试了@Priority,但仍然没有帮助。这个问题似乎与jax-rs或resteasy无关。