2012-02-05 37 views
4

我正在使用Jersey bundle 1.11来提供一些RESTful Web服务。Jersey Expires Header not working

每当我使用Chrome浏览REST资源时,我注意到HTTP头过期设置为Thu,01 Jan 1970 01:00:00 CET

我尝试过编辑响应加入:

return Response.ok(myObject).expires(new Date(System.currentTimeMillis() + 3000)).build(); 

不幸的是,这又增加了HTTP头过期,而不是换旧人。

问题是什么?

+1

听起来像它可能是一个错误。 – 2012-02-05 14:02:54

+0

标题在默认情况下不会被添加到任何地方,必须有其他逻辑或者可能是你的容器添加了它 - 检查它的设置/文档.. – 2012-02-10 09:19:02

回答

1

FWIW,我看到完全相同的行为。这里的容器是JBoss 4.2.3。这是一种使用BASIC认证的PUT方法。我的回答是这样产生的:

Date exp = new Date(System.currentTimeMillis() + lifetime); 
return Response.noContent().expires(exp).build(); 

当卷曲调用,这些都是传回的标题:

< HTTP/1.1 204 No Content 
< Server: Apache-Coyote/1.1 
< Pragma: No-cache 
< Cache-Control: no-cache 
< Expires: Thu, 01 Jan 1970 01:00:00 CET 
< X-Powered-By: Servlet 2.4; JBoss-4.2.3.GA (... 
< Expires: Tue, 13 Mar 2012 11:08:54 GMT 
< Date: Tue, 13 Mar 2012 11:08:24 GMT 
< 
0

这是为了防止浏览器所请求的资源的缓存。 日期本身就是零时间的时间戳,即UNIX时代的开始。

0

我发现我的应用程序服务器(在这种情况下,JBoss 4.2.3.GA)不允许Jersey以这种方式覆盖标题。

要解决办法:

  1. 使用参数注入响应对象进入方法:

    @Context javax.servlet.http.HttpServletResponse响应

  2. 设置响应对象上的标题而不是使用.expires():

    response.setDateHeader(“Expires”,System.currentTimeMillis()+ 14400000);

我用#2之前,我对ResponseBuilder名为.build(),如果它的确与众不同,或当你不知道这个不知道。

0

我有同样的问题。我的解决方法是:

  1. 注入响应 @Context javax.servlet.http.HttpServletResponse response

  2. 重置响应对象 response.reset();

  3. 使用ResponseBuilder设置头。 return Response .ok(icon.getData()) .type(icon.getContentType()) .expires(cal.getTime()) .build();