0

我有一个 Struts2(版本 2.2.6)Web 应用程序,我想在其中Expires为 struts2 的传统静态相关文件夹中不存在的静态资源设置响应标头。例如,它们被放置在根部的/images/, /css/,之下。/js/我希望所有资源都有一个自定义Expires响应标头。

如何在 Struts2 中做到这一点?

4

2 回答 2

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>

其中StaticContentCacheHeaderimplements Filter以下方法 -

@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);
}

这会将缓存标头设置为从现在起一个月后过期。

让我知道是否有更好的方法来处理这个问题。

于 2013-02-06T21:31:44.153 回答
0

使用过滤器;一旦确定它们不是 S2 服务的资源,它们就不应该由 Struts 2 处理。

于 2013-02-06T01:45:02.700 回答