java - 如何在 jetty 服务器中为 CSS、Javascript、图像等静态资源设置过期 header

标签 java javascript servlets http-headers jetty

我看到有一个 similar question但找不到合适的答案..

任何新的答案将不胜感激。

最佳答案

试试这个:

  1. 定义一个添加响应头的过滤器:
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * A filter that modifies a response.
 * <p>
 * Init-parameters:
 * <ul>
 * <li>headers: A comma-separated list of init-parameter names. Each init-parameter represents a
 * response header to set. Each header value may contain multiple comma-separated values.</li>
 * </ul>
 * Sample usage:
 * <pre>
 * {@code
 * FilterHolder responseFilter = dynamicResources.addFilter(ResponseFilter.class, "*.js",
 *   EnumSet.allOf(DispatcherType.class));
 * responseFilter.setInitParameter("headers", "Cache-Control");
 * responseFilter.setInitParameter("Cache-Control", "max-age=60");
 * }
 * </pre>
 *
 * @author Gili Tzabari
 */
public class ResponseFilter implements Filter
{
    private final Multimap<String, String> headers = HashMultimap.create();

    @Override
    public void init(FilterConfig filterConfig) throws ServletException
    {
        String headerNames = filterConfig.getInitParameter("headers");
        if (headerNames == null)
            return;
        for (String name : headerNames.split(","))
        {
            String values = filterConfig.getInitParameter(name);
            if (values == null)
                continue;
            for (String value : values.split(","))
                headers.put(name, value);
        }
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException
    {
        if (response instanceof HttpServletResponse)
        {
            HttpServletResponse httpResponse = (HttpServletResponse) response;
            for (String key : headers.keySet())
                for (String value : headers.get(key))
                    httpResponse.addHeader(key, value);
        }
        chain.doFilter(request, response);
    }

    @Override
    public void destroy()
    {
    }
}
  1. 配置 Jetty 以将缓存 header 注入(inject)特定的 URL 模式:
FilterHolder responseFilter = dynamicResources.addFilter(ResponseFilter.class, "*.js",
    EnumSet.allOf(DispatcherType.class));
responseFilter.setInitParameter("headers", "Cache-Control");
responseFilter.setInitParameter("Cache-Control", "max-age=60");

关于java - 如何在 jetty 服务器中为 CSS、Javascript、图像等静态资源设置过期 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22006726/

相关文章:

java - JOGL/OPENGL 中的大型线带管理...?

javascript - mousedown 事件完成后销毁 bootstrap-popover

javascript - 正则表达式检查字符串是否是javascript函数?

javascript - 防止在输入内容时发帖

image - 通过 URI 中的文件名而不是请求参数来识别 servlet 中的图像请求

java - 将Spring 3.1迁移到Spring 4 : org. springframework.web.context.support.ServletContextFactoryBean

java - getResourceAsStream 方法的相对路径

java - Magnolia 5.4 升级发布/取消发布时的 java.nio.file.InvalidPathException

Java 正则表达式谜题

java - servlet如何工作?实例化, session ,共享变量和多线程