Jersey Expires Header无法正常工作

时间:2012-02-05 13:56:15

标签: java rest jersey jax-rs

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

每次我使用Chrome浏览REST资源时,我都会注意到HTTP Header Expires设置为星期四,01 Jan 1970 01:00:00 CET

我尝试编辑响应添加:

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

不幸的是,这会增加另一个HTTP Header Expires,而不是替换旧的。

有什么问题?

4 个答案:

答案 0 :(得分:1)

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

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

使用cURL调用时,这些是返回的标题:

< 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
< 

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

解决方法:

  1. 使用参数

    将响应对象注入方法
      

    @Context javax.servlet.http.HttpServletResponse response

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

      

    response.setDateHeader(&#34; Expires&#34;,System.currentTimeMillis()+ 14400000);

  3. 我在ResponseBuilder上调用.build()之前使用了#2,不确定它是否会有所不同。

答案 3 :(得分: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();