Cache control 在Dropwizard中设置静态资产的缓存控制头
在Dropwizard服务中设置静态资产的缓存控制头的最佳方法是什么 一些谷歌搜索显示了一个AssetsBundle构造函数: 然而,在进一步的调查中,看起来包com.yammer.dropwizard.bundles从5.1版开始就不是dropwizard的一部分Cache control 在Dropwizard中设置静态资产的缓存控制头,cache-control,dropwizard,Cache Control,Dropwizard,在Dropwizard服务中设置静态资产的缓存控制头的最佳方法是什么 一些谷歌搜索显示了一个AssetsBundle构造函数: 然而,在进一步的调查中,看起来包com.yammer.dropwizard.bundles从5.1版开始就不是dropwizard的一部分 也许我遗漏了一些显而易见的东西,但有没有更好的方法来处理这个问题?如果有人感兴趣(从这个问题的观点数量来看,他们可能不感兴趣),这就是我解决这个问题的方法 我在与我的服务类相同的包中创建了CacheControlFilter类:
也许我遗漏了一些显而易见的东西,但有没有更好的方法来处理这个问题?如果有人感兴趣(从这个问题的观点数量来看,他们可能不感兴趣),这就是我解决这个问题的方法 我在与我的服务类相同的包中创建了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
public class WebConfiguration extends Configuration {
@JsonProperty
private String enableCacheControl;
public String getEnableCacheControl() {
return enableCacheControl;
}
public void setEnableCacheControl(String enableCacheControl) {
this.enableCacheControl = enableCacheControl;
}
} // 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),因此我无法验证。