2010-05-15 1 views
0

내 이미지의 캐시 옵션을 설정하는 동안 struts2의 이상한 버리기 동작이 있습니다. 제가 DB에서 이미지를 넣을려고스트럿츠 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)를 보여줍니다), 및 기간 제한 없음하지도 않으며, 최대 사용 기간은 내가 URL에 문제가있을 수 있습니다이 dissapered 왜 아무 생각이,이 없다

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 

헤더

에 제시되어있다? 매개 변수가있는 양식입니다.

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

답변

2

마침내 나는 내 코드가 무엇이 잘못되었는지를 발견했습니다. 부분적으로 작동하기 때문에 (이미지가 표시됨) 오히려 이상합니다.

범인은 행 다음에있다 :

그것은 다음과 같이 교체해야합니다
HttpServletResponse response = ServletActionContext.getResponse(); 

:

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

그것은이다 마술의 종류처럼 보이지만 분명히 응답 주 모두 같은 출력 스트림 아니라 헤더 선언의 컨테이너.

0

더 잘 작동하는지 확실하지 않지만 시도해 볼 수는 있습니다. 응답 헤더를 수정하는 사용자 정의 인터셉터를 만듭니다. 이런 식으로 뭔가 (주,이 테스트를하지 않은 경우) :

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

그런 다음에 액션 정의를 수정 :

당신의 struts.xml에서 다음
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(); 
    } 

} 

는 인터셉터 새로운 인터셉터 스택을 정의 extendedStack을 사용하십시오.

+0

결과는 동일합니다. 즉, 인터셉터도 결과 유형도 헤더에 영향을주지 않습니다. 그것은 스트럿츠에 의해 운반됩니다. – Dewfy