Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JBoss7设置缓存控制,将RESTEasy的所有响应的Pragma设置为无缓存_Jboss_Jax Rs_Jboss7.x_Resteasy_Cache Control - Fatal编程技术网

JBoss7设置缓存控制,将RESTEasy的所有响应的Pragma设置为无缓存

JBoss7设置缓存控制,将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

我试图使用RESTEasy框架将缓存控制头添加到JBoss7中生成的响应中。但是,由于JBoss在默认情况下添加了一个无缓存头,所有响应最终都会得到多个缓存控制头

我找不到任何删除它的设置,添加拦截器也不起作用,因为稍后会添加无缓存头

有人能告诉我如何在JBoss7中禁用默认的pragma和cache控制头吗

注意:我将resteasy用于无状态EJB

@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无关。