2013-02-06 34 views

回答

3

因此,基於@Dave提供的提示,我提出了以下方法。

在web.xml安裝後面的過濾器&它的映射。

<filter> 
    <filter-name>StaticContentCacheHeaderFilter</filter-name> 
    <filter-class>management.filters.StaticContentCacheHeaderFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>StaticContentCacheHeaderFilter</filter-name> 
    <url-pattern>/images/*</url-pattern> 
</filter-mapping> 

implements Filter有以下方法StaticContentCacheHeader -

@Override 
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 

    HttpServletResponse response = (HttpServletResponse) servletResponse; 
    HttpServletRequest request = (HttpServletRequest) servletRequest; 

    long ifModifiedSince = 0; 
    try { 
     ifModifiedSince = request.getDateHeader("If-Modified-Since"); 
    } catch (Exception e) { 
     LOG.warning("Invalid If-Modified-Since header value: '" 
       + request.getHeader("If-Modified-Since") + "', ignoring"); 
    } 

    long now = DateTime.now().getMillis(); 

    long lastModifiedMillis = now; 

    DateTime dateTime = new DateTime(); 

    //1 month seems to be the minimum recommended period for static resources acc to   
    //https://developers.google.com/speed/docs/best-practices/caching#LeverageBrowserCaching 
    long expires = dateTime.plusMonths(1).getMillis(); 

    if (ifModifiedSince > 0 && ifModifiedSince <= lastModifiedMillis) { 
     // not modified, content is not sent - only basic 
     // headers and status SC_NOT_MODIFIED 
     response.setDateHeader("Expires", expires); 
     response.setStatus(HttpServletResponse.SC_NOT_MODIFIED); 
     return; 
    } 

    // set heading information for caching static content 
    response.setDateHeader("Date", now); 
    response.setDateHeader("Expires", expires); 
    response.setDateHeader("Retry-After", expires); 
    response.setHeader("Cache-Control", "public"); 
    response.setDateHeader("Last-Modified", lastModifiedMillis); 

    filterChain.doFilter(servletRequest, servletResponse); 
} 

這將設置緩存頭從現在起一個月內到期。

讓我知道是否有更好的方法來處理這個問題。

0

使用過濾器;一旦確定它們不是S2服務的資源,它們不應該由Struts 2處理。

相關問題