为JBOSS服务器设置静态内容的cache header

来源:互联网 发布:南京田家炳中学知乎 编辑:程序博客网 时间:2024/05/22 01:28

为jboss服务器的静态内容如js,css,gif等设置cache header,特别是expire header,可以大大提高web服务的效率,使浏览器充分利用缓存。

首先增加一个java类,用于设置response的http header。


package org.foundation.servlet.filter; import java.io.IOException;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.Locale;import java.util.TimeZone; 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; /** * The Class CacheHeaderFilter. * * @author */public class CacheHeaderFilter implements Filter {     /**     * The Constant MILLISECONDS_IN_SECOND.     */    private static final int MILLISECONDS_IN_SECOND = 1000;     /** The Constant POST_CHECK_VALUE. */    private static final String POST_CHECK_VALUE = "post-check=";     /** The Constant PRE_CHECK_VALUE. */    private static final String PRE_CHECK_VALUE = "pre-check=";     /** The Constant MAX_AGE_VALUE. */    private static final String MAX_AGE_VALUE = "max-age=";     /** The Constant ZERO_STRING_VALUE. */    private static final String ZERO_STRING_VALUE = "0";     /** The Constant NO_STORE_VALUE. */    private static final String NO_STORE_VALUE = "no-store";     /** The Constant NO_CACHE_VALUE. */    private static final String NO_CACHE_VALUE = "no-cache";     /** The Constant PRAGMA_HEADER. */    private static final String PRAGMA_HEADER = "Pragma";     /** The Constant CACHE_CONTROL_HEADER. */    private static final String CACHE_CONTROL_HEADER = "Cache-Control";     /** The Constant EXPIRES_HEADER. */    private static final String EXPIRES_HEADER = "Expires";     /** The Constant LAST_MODIFIED_HEADER. */    private static final String LAST_MODIFIED_HEADER = "Last-Modified";     /** The Constant CACHE_TIME_PARAM_NAME. */    private static final String CACHE_TIME_PARAM_NAME = "CacheTime";     /** The Static HTTP_DATE_FORMAT object. */    private static final DateFormat HTTP_DATE_FORMAT = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US); static {HTTP_DATE_FORMAT.setTimeZone(TimeZone.getTimeZone("GMT"));}     /** The reply headers. */    private String[][] mReplyHeaders = { {} };     /** The cache time in seconds. */    private Long mCacheTime = 0L;     /**     * Initializes the Servlet filter with the cache time and sets up the unchanging headers.     *     * @param pConfig the config     *     * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)     */    public void init(final FilterConfig pConfig) {        final ArrayList<String[]> newReplyHeaders = new ArrayList<String[]>();        this.mCacheTime = Long.parseLong(pConfig.getInitParameter(CACHE_TIME_PARAM_NAME));        if (this.mCacheTime > 0L) {            newReplyHeaders.add(new String[] { CACHE_CONTROL_HEADER, MAX_AGE_VALUE + this.mCacheTime.longValue() });            newReplyHeaders.add(new String[] { CACHE_CONTROL_HEADER, PRE_CHECK_VALUE + this.mCacheTime.longValue() });            newReplyHeaders.add(new String[] { CACHE_CONTROL_HEADER, POST_CHECK_VALUE + this.mCacheTime.longValue() });        } else {            newReplyHeaders.add(new String[] { PRAGMA_HEADER, NO_CACHE_VALUE });            newReplyHeaders.add(new String[] { EXPIRES_HEADER, ZERO_STRING_VALUE });            newReplyHeaders.add(new String[] { CACHE_CONTROL_HEADER, NO_CACHE_VALUE });            newReplyHeaders.add(new String[] { CACHE_CONTROL_HEADER, NO_STORE_VALUE });        }        this.mReplyHeaders = new String[newReplyHeaders.size()][2];        newReplyHeaders.toArray(this.mReplyHeaders);    }     /**     * Do filter.     *     * @param pRequest the request     * @param pResponse the response     * @param pChain the chain     *     * @throws IOException Signals that an I/O exception has occurred.     * @throws ServletException the servlet exception     *     * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse,     *      javax.servlet.FilterChain)     */    public void doFilter(final ServletRequest pRequest, final ServletResponse pResponse, final FilterChain pChain)            throws IOException, ServletException {        // Apply the headers        final HttpServletResponse httpResponse = (HttpServletResponse) pResponse;        for (final String[] replyHeader : this.mReplyHeaders) {            final String name = replyHeader[0];            final String value = replyHeader[1];            httpResponse.addHeader(name, value);        }        if (this.mCacheTime > 0L) {            final long now = System.currentTimeMillis();             final DateFormat httpDateFormat = (DateFormat) HTTP_DATE_FORMAT.clone();            httpResponse.addHeader(LAST_MODIFIED_HEADER, httpDateFormat.format(new Date(now)));            httpResponse.addHeader(EXPIRES_HEADER, httpDateFormat.format(new Date(now                    + (this.mCacheTime.longValue() * MILLISECONDS_IN_SECOND))));        }        pChain.doFilter(pRequest, pResponse);    }     /**     * Destroy all humans!     *     * @see javax.servlet.Filter#destroy()     */    public void destroy() {    } }

然后在需要使用的应用中,设置web.xml,增加对于静态内容的过滤器,设置缓存时间。

<filter>        <filter-name>CacheFilterOneWeek</filter-name>        <filter-class>org.foundation.servlet.filter.CacheHeaderFilter</filter-class>        <init-param>            <param-name>CacheTime</param-name>            <param-value>604800</param-value>        </init-param>    </filter>     <filter>        <filter-name>CacheFilterOneDay</filter-name>        <filter-class>org.foundation.servlet.filter.CacheHeaderFilter</filter-class>        <init-param>            <param-name>CacheTime</param-name>            <param-value>86400</param-value>        </init-param>    </filter>     <filter>        <filter-name>CacheFilterOneHour</filter-name>        <filter-class>org.foundation.servlet.filter.CacheHeaderFilter</filter-class>        <init-param>            <param-name>CacheTime</param-name>            <param-value>3600</param-value>        </init-param>    </filter> ....... <filter-mapping>        <filter-name>CacheFilterOneDay</filter-name>        <url-pattern>*.js</url-pattern>    </filter-mapping>    <filter-mapping>        <filter-name>CacheFilterOneDay</filter-name>        <url-pattern>*.css</url-pattern>    </filter-mapping>    <filter-mapping>        <filter-name>CacheFilterOneWeek</filter-name>        <url-pattern>*.jpg</url-pattern>    </filter-mapping>    <filter-mapping>        <filter-name>CacheFilterOneWeek</filter-name>        <url-pattern>*.gif</url-pattern>    </filter-mapping>

重新部署相应的war包,重启jboss即可。