我有一個Struts2(版本2.2.6)web應用程序,我想爲靜態資源設置Expires
響應頭,不存在於傳統的與struts2相關的靜態文件夾中。例如。它們被放置在根下的/images/
,/css/
,/js/
之下。我希望所有資源都有自定義的Expires
響應標題。在Struts2 HOWTO中爲靜態內容設置緩存標題不在標準/ struts /,/ template /目錄中
如何在Struts2中做到這一點?
我有一個Struts2(版本2.2.6)web應用程序,我想爲靜態資源設置Expires
響應頭,不存在於傳統的與struts2相關的靜態文件夾中。例如。它們被放置在根下的/images/
,/css/
,/js/
之下。我希望所有資源都有自定義的Expires
響應標題。在Struts2 HOWTO中爲靜態內容設置緩存標題不在標準/ struts /,/ template /目錄中
如何在Struts2中做到這一點?
因此,基於@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);
}
這將設置緩存頭從現在起一個月內到期。
讓我知道是否有更好的方法來處理這個問題。
使用過濾器;一旦確定它們不是S2服務的資源,它們不應該由Struts 2處理。