我正在使用WebSphere Application Server v7.0的<enable-file-serving value="true" />
功能为我的Java Web应用程序提供静态内容(图像,CSS,JavaScript)。WebSphere 7:修改静态内容文件服务的HTTP头
如何修改此静态内容的HTTP标头(例如,添加Cache-Control
或Expires
标头)?
我正在使用WebSphere Application Server v7.0的<enable-file-serving value="true" />
功能为我的Java Web应用程序提供静态内容(图像,CSS,JavaScript)。WebSphere 7:修改静态内容文件服务的HTTP头
如何修改此静态内容的HTTP标头(例如,添加Cache-Control
或Expires
标头)?
我最终编写了一个Filter
以基于请求的资源的URL添加HTTP标头。下面是一个简化版本:
CacheFilter.java
public class CacheFilter implements Filter {
private static long maxAge = 86400 * 30; // 30 days in seconds
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.setHeader("Cache-Control", "max-age=" + maxAge);
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
}
的web.xml
<filter>
<filter-name>cache</filter-name>
<filter-class>com.example.CacheFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>cache</filter-name>
<url-pattern>*.png</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>cache</filter-name>
<url-pattern>*.jpg</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>cache</filter-name>
<url-pattern>*.gif</url-pattern>
</filter-mapping>
根据规范(http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html)max-age是以毫秒为单位给出的,所以它应该是私有静态long maxAge = DateUtils.SECONDS_PER_DAY * 30;(我不知道这个常数是否存在)否则很好的答案 – jambriz 2013-04-16 21:01:43
@jambriz你是对的。我习惯于JavaScript,其中标准单位是毫秒。我已经纠正了答案。 – user113215 2013-04-16 21:23:23
我正在尝试做类似的事情。但它不起作用。我仍然看到没有缓存。你认为我错过了什么吗?我有完全相同的代码像你。 – webdev 2013-10-10 17:05:11
你好,建议的方法是移动静态内容IHS(IBM HTTP服务器 - 只是实际上是一个apache 2),如果需要,它将在WAS doind负载均衡和故障转移之前。检查:http://www-01.ibm.com/software/webservers/httpservers/ – 2013-03-15 03:35:55
@MarcosMaia我已经在使用IHS,但难以提取/分发/同步静态内容,以便从Web服务器提供服务,而不是应用程序服务器在我的环境中是不值得头痛的。 – user113215 2013-03-15 15:37:37