2010-05-15 60 views
0

我設置緩存選項爲我的圖像時,struts2有奇怪的丟棄行爲。Struts 2丟棄緩存標題

我試圖把圖片從數據庫將在客戶端緩存 要渲染的圖像我使用(http://struts.apache.org/2.x/docs/how-can-we-display-dynamic-or-static-images-that-can-be-provided-as-an-array-of-bytes.html),其中特殊結果類型呈現如下:

public void execute(ActionInvocation invocation) throws Exception { 
    ...//some preparation 
    HttpServletResponse response = ServletActionContext.getResponse(); 
    HttpServletRequest request = ServletActionContext.getRequest(); 
    ServletOutputStream os = response.getOutputStream(); 
    try 
    { 
     byte[] imageBytes = action.getImage(); 
     response.setContentType("image/gif"); 
     response.setContentLength(imageBytes.length); 
     //I want cache up to 10 min 
     Date future = new Date(((new Date()).getTime() + 1000 * 10*60l)); 
     ; 
     response.addDateHeader("Expires", future.getTime()); 
     response.setHeader("Cache-Control", "max-age=" + 10*60 + ""); 
     response.addHeader("cache-Control", "public"); 
     response.setHeader("ETag", request.getRequestURI()); 
     os.write(imageBytes); 
    } 
    catch(Exception e) 
    { 
     response.sendError(HttpServletResponse.SC_NOT_FOUND); 
    } 

    os.flush(); 
    os.close(); 
} 

但是,當圖像嵌入到網頁它總是重載(螢火蟲顯示代碼200),和沒有到期,也沒有最大年齡在頭部

Host localhost:9090 
Accept image/png,image/*;q=0.8,*/*;q=0.5 
Accept-Language en-us,en;q=0.5 
Accept-Encoding gzip,deflate 
Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive 300 
Connection keep-alive 
Referer http://localhost:9090/web/result?matchId=1 
Cookie JSESSIONID=4156BEED69CAB0B84D950932AB9EA1AC; 
If-None-Match /web/_srv/teamcolor 
Cache-Control max-age=0 

介紹我不知道它爲什麼dissapered,可在網址的問題?它是帶參數的形式:

http://localhost:9090/web/_srv/teamcolor?loginId=3 

回答

2

最後我發現我的代碼有什麼問題,它很奇怪,因爲它是部分工作(顯示圖像)。

罪魁禍首是以下行:

HttpServletResponse response = ServletActionContext.getResponse(); 

它必須改爲:

HttpServletResponse response = (HttpServletResponse) 
    invocation.getInvocationContext().get(StrutsStatics.HTTP_RESPONSE); 

它看起來像是一種魔力,但顯然都響應共享相同的輸出流,但不標題聲明的容器。

0

不知道這是否會更好,但你可以嘗試。創建一個修改響應頭的自定義攔截器。像這樣的東西(注意,我沒有測試過這一點):

package com.yourpackage.interceptor; 

import java.util.Date; 

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.apache.struts2.StrutsStatics; 

import com.opensymphony.xwork2.ActionContext; 
import com.opensymphony.xwork2.ActionInvocation; 
import com.opensymphony.xwork2.interceptor.AbstractInterceptor; 

public class ResponseHeadersInterceptor extends AbstractInterceptor { 

    @Override 
    public String intercept(ActionInvocation invocation) throws Exception { 

     ActionContext context = invocation.getInvocationContext(); 
     HttpServletResponse response = (HttpServletResponse)context.get(StrutsStatics.HTTP_RESPONSE); 
     HttpServletRequest request = (HttpServletRequest)context.get(StrutsStatics.HTTP_REQUEST); 

     if (response!=null) { 
      Date future = new Date(((new Date()).getTime() + 1000 * 10*60l)); 
      response.addDateHeader("Expires", future.getTime()); 
      response.setHeader("Cache-Control", "max-age=" + 10*60 + ""); 
      response.addHeader("cache-Control", "public"); 
      if (request!=null) 
       response.setHeader("ETag", request.getRequestURI()); 
     } 

     return invocation.invoke(); 
    } 

} 

然後在你的struts.xml中,定義攔截器和一個新的攔截器棧:

<interceptors> 
    <interceptor name="responseHeaders" class="com.yourpackage.interceptor.ResponseHeadersInterceptor" />  
    <interceptor-stack name="extendedStack"> 
     <interceptor-ref name="defaultStack" /> 
     <interceptor-ref name="responseHeaders" /> 
    </interceptor-stack>   
</interceptors> 

然後修改你的行動定義使用extendedStack

+0

不幸的是結果是相同的 - 這意味着攔截器和結果類型都不會影響頭。它由支柱攜帶 – Dewfy 2010-05-25 14:44:02