2012-02-05 36 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();