Notes: 在GlassFish中缓存静态资源,开启Gzip
前面有文章介绍到,我们有网站项目是跑在GlassFishV3服务器上的,因此针对常用的网站优化措施,比如静态资源添加一个an expires header,网站开启Gzip功能,在GlassFishV3这两个的配置稍不一样。 为静态资源添加an expires header 如果你使用的是A...
前面有文章介绍到,我们有网站项目是跑在GlassFishV3服务器上的,因此针对常用的网站优化措施,比如静态资源添加一个an expires header,网站开启Gzip功能,在GlassFishV3这两个的配置稍不一样。
为静态资源添加an expires header
如果你使用的是Apache或者Nginx这个配置是非常容易的,这里以Nginx为例,在Server段加入以下代码即可:
[code]
location ~ \.(gif|jpg|jpeg|png|ico|css|js)$ {
expires 7d;
}
[/code]
但是如果你是Nginx+GlassFish的搭配,这个可能就不起作用了,至少我截止目前测试的结果是不支持的,(如果你知道如何配置并让起作用,一定告诉我)。
在GlassFishV3中要为静态资源添加an expires header,需要写点儿代码,加点配置,如下:
在web.xml中配置一个filter:
[code]
<filter>
<filter-name>ExpiresFilter</filter-name>
<filter-class>server.ExpiresFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ExpiresFilter</filter-name>
<url-pattern>/images/*</url-pattern>
<url-pattern>/theme/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
[/code]
ExpiresFilter.java
[code]
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
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 expires filter adds the expires HTTP header based on the deployment policy.
* Many sites have a fixed deployment schedule where deployments take place
* based on timed regular intervals. This filter adds the expires header of the
* next possible deployment time, to support browser caching.
* @author chris.webster@sun.com
*/
public class ExpiresFilter implements Filter {
private FilterConfig filterConfig;
private String expires;
private long nextDeploymentTime;
public ExpiresFilter() {
expires = nextDeploymentTime();
}
private String nextDeploymentTime() {
// assume next deployment is M-F at 09:45
Calendar c = Calendar.getInstance();
//默认缓存1天
int dayOffset = 1;
//周五+2天
if (c.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY) {
dayOffset += 2;
}
//周六+1天
if (c.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) {
dayOffset++;
}
c.add(Calendar.DAY_OF_MONTH, dayOffset);
c.set(c.get(Calendar.YEAR), c.get(Calendar.MONTH),
c.get(Calendar.DAY_OF_MONTH), 9, 45);
nextDeploymentTime = c.getTimeInMillis();
String pattern = "EEE, dd MMM yyyy HH:mm:ss z";
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
return sdf.format(c.getTime());
}
private void addCacheHeaders(ServletRequest request, ServletResponse response)
throws IOException, ServletException {
HttpServletResponse sr = (HttpServletResponse) response;
sr.setHeader("Expires", expires);
long now = (new Date()).getTime();
long expireTime = nextDeploymentTime - now;
expireTime /= 1000;
sr.setHeader("Cache-Control", "max-age="
+ Long.toString(expireTime) + ";public;must-revalidate;");
}
/**
*
* @param request The servlet request we are processing
* @param response The servlet response we are creating
* @param chain The filter chain we are processing
*
* @exception IOException if an input/output error occurs
* @exception ServletException if a servlet error occurs
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
addCacheHeaders(request, response);
chain.doFilter(request, response);
}
/**
* Return the filter configuration object for this filter.
*/
private FilterConfig getFilterConfig() {
return filterConfig;
}
/**
* Set the filter configuration object for this filter.
*
* @param filterConfig The filter configuration object
*/
private void setFilterConfig(FilterConfig filterConfig) {
this.filterConfig = filterConfig;
}
/**
* Destroy method for this filter
*
*/
public void destroy() {
}
/**
* Init method for this filter
*
*/
public void init(FilterConfig filterConfig) {
setFilterConfig(filterConfig);
}
/**
* Return a String representation of this object.
*/
@Override
public String toString() {
if (getFilterConfig() == null) {
return ("ExpiresFilter()");
}
StringBuffer sb = new StringBuffer("ExpiresFilter(");
sb.append(getFilterConfig());
sb.append(")");
return (sb.toString());
}
}
[/code]
开启Gzip
开启Gzip同样,在Apache和Nginx中配置比较方便,这里仍以Nginx为例,在Http段加入以下代码即可:
[code]
gzip on;
gzip_min_length 1000;
gzip_types text/plain application/x-javascript text/css application/xml text/javascript;
[/code]
同样的问题,在Nginx+GlassFish的搭配下一样不起作用,好在GlassFishV3支持通过管理端来配置,开启Gzip:
评论交流
暂无评论,欢迎留下你的想法