Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.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
Cache control 在Dropwizard中设置静态资产的缓存控制头_Cache Control_Dropwizard - Fatal编程技术网

Cache control 在Dropwizard中设置静态资产的缓存控制头

Cache control 在Dropwizard中设置静态资产的缓存控制头,cache-control,dropwizard,Cache Control,Dropwizard,在Dropwizard服务中设置静态资产的缓存控制头的最佳方法是什么 一些谷歌搜索显示了一个AssetsBundle构造函数: 然而,在进一步的调查中,看起来包com.yammer.dropwizard.bundles从5.1版开始就不是dropwizard的一部分 也许我遗漏了一些显而易见的东西,但有没有更好的方法来处理这个问题?如果有人感兴趣(从这个问题的观点数量来看,他们可能不感兴趣),这就是我解决这个问题的方法 我在与我的服务类相同的包中创建了CacheControlFilter类:

在Dropwizard服务中设置静态资产的缓存控制头的最佳方法是什么

一些谷歌搜索显示了一个AssetsBundle构造函数:

然而,在进一步的调查中,看起来包com.yammer.dropwizard.bundles从5.1版开始就不是dropwizard的一部分


也许我遗漏了一些显而易见的东西,但有没有更好的方法来处理这个问题?

如果有人感兴趣(从这个问题的观点数量来看,他们可能不感兴趣),这就是我解决这个问题的方法

我在与我的服务类相同的包中创建了CacheControlFilter类:

public class CacheControlFilter implements Filter{

    public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {

        HttpServletResponse resp = (HttpServletResponse) response;

        // Add whatever headers you want here
        resp.setHeader("Cache-Control", "public, max-age=500000");
        resp.setHeader("Expires", new Date().getTime()+500000 + "");

        chain.doFilter(request, response);
    }

    public void destroy() {}

    public void init(FilterConfig arg0) throws ServletException {}
}
然后在服务类中,只需添加以下行:

env.addFilter(new CacheControlFilter(), "/*");
当然,您可以更细粒度地为图像文件和css文件添加不同的过滤器,但这会为所有请求添加标题

从评论中:

对于dropwizard 1.0.6。注册

env.servlets()
   .addFilter("MyFilter", new CacheControlFilter())
   .addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*") 

如果您只想清除每个请求的缓存,下面是我的解决方案,它使用DropWizard提供的CacheBastingFilter

  • 定义自定义配置,在我的例子中是WebConfiguration。设置DropWizard应用程序时使用此配置

    public class WebConfiguration extends Configuration {
    
    @JsonProperty
    private String enableCacheControl;
    
    public String getEnableCacheControl() {
        return enableCacheControl;
    }
    
    public void setEnableCacheControl(String enableCacheControl) {
        this.enableCacheControl = enableCacheControl;
    }
    
    }

  • 获取在#1中定义的配置,并根据其值注册CacheBastingFilter

  • 将此添加到您的跑步方法中-

        // get the cache control settings from the YAML - configuration
        String enableCacheControl = configuration.getEnableCacheControl();
        boolean enableCacheBustingFilter = Boolean.parseBoolean(enableCacheControl);
    
        if(enableCacheBustingFilter){
            // caching was enabled in YAML - was set to true - enabling the cacheBustingFilter
            // this will ALWAYS return  "must-revalidate,no-cache,no-store" in the Cache-Control response header
            environment.servlets().addFilter("CacheBustingFilter", new CacheBustingFilter())
                .addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*");
        }
    

    基于Tim Barclay的回答,我创建了一个过滤器,如果请求的资源是扩展名为js、css、png、jpg、gif或svg的文件,则该过滤器将设置
    缓存控制
    过期
    。否则,缓存将被禁用

    希望能对大家有所帮助

    受保护的void setCacheHeaders(环境、字符串urlPattern、整数秒){
    FilterRegistration.Dynamic filter=environment.servlets().addFilter(
    “cacheControlFilter”,
    新过滤器(){
    @凌驾
    public void init(FilterConfig FilterConfig)抛出ServletException{
    }
    @凌驾
    public void doFilter(ServletRequest ServletRequest、ServletResponse ServletResponse、FilterChain FilterChain)抛出IOException、ServletException{
    HttpServletRequest HttpServletRequest=(HttpServletRequest)servletRequest;
    HttpServletResponse HttpServletResponse=(HttpServletResponse)servletResponse;
    String[]cacheFileTypes={“js”、“css”、“png”、“jpg”、“gif”、“svg”};
    字符串filetypeRequested=FilenameUtils.getExtension(httpServletRequest.getRequestURL().toString());
    if(httpServletRequest.getMethod()=“GET”&&seconds>0&&Arrays.asList(cacheFileTypes).contains(filetypeRequested)){
    setHeader(“缓存控制”,“公共,最大年龄=”+秒);
    Calendar c=Calendar.getInstance();
    c、 设置时间(新日期());
    c、 添加(日历秒,秒);
    SimpleDateFormat=新的SimpleDateFormat(“EEE,d MMM yyyy HH:mm:ss zzz”,Locale.US);
    format.setTimeZone(TimeZone.getTimeZone(“GMT”));
    setHeader(“Expires”,format.format(c.getTime());
    }否则{
    setHeader(“缓存控制”,“无缓存,无存储,必须重新验证”);
    setHeader(“Expires”,“0”);
    setHeader(“Pragma”,“无缓存”);
    }
    doFilter(servletRequest,servletResponse);
    }
    @凌驾
    公共空间销毁(){
    }
    }
    );
    filter.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class),true,urlPattern);
    }
    
    PS:我无法获得接受答案的方式来设置
    Expires
    -标题以使其工作:

    resp.setHeader(“Expires”,new Date().getTime()+500000+”);
    
    相比之下,我的车非常臃肿,但它能工作:

    Calendar c=Calendar.getInstance();
    c、 设置时间(新日期());
    c、 添加(日历秒,秒);
    SimpleDateFormat=新的SimpleDateFormat(“EEE,d MMM yyyy HH:mm:ss zzz”,Locale.US);
    format.setTimeZone(TimeZone.getTimeZone(“GMT”));
    setHeader(“Expires”,format.format(c.getTime());
    
    在较新版本的Dropwizard
    @CacheControl
    注释中


    这对我很有帮助,谢谢。但是应该注意的是,这个过滤器,如编写的(和安装的)适用于所有类型的请求(GET、PUT等)。它不仅仅适用于静态资产的服务。从1.0.6开始工作。只需注册env.servlets().addFilter(“MyFilter”,CacheControlFilter()).addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST),true,“/*”)即可。谢谢--这很有效!我错过了“addMappingForUrlPatterns”,没有它,这就没有任何作用:-(根据@Rich对我答案的评论,我建议的可能不再适用于Dropwizard的当前版本。自2014年以来,我没有使用过它(或者实际上是Java),因此我无法验证。