在实际当中大量的js和页面内容使得页面呈现要花很长时间,特别是使用ext。如是找到这种办法去处理一下,还没有测试有多大的优化性能。[color=red]全部实现代码在附件中[/color]
public class CompressionFilter implements Filter {
// 适合在上JBoss, Jetty, JOnAS, OC4J, Orion,and Tomcat,其它的可能有bug
static boolean useFilter = true;
public static final String ENCODING = "UTF-8";
private static final String _GZIP = "gzip";
private static final String _ALREADY_FILTERED = CompressionFilter.class.getName() + "_ALREADY_FILTERED";
private static final String _COMPRESS = "compress";
public static String[] BOOLEANS = {"true", "t", "y", "on", "1"};
private static Log _log = LogFactory.getLog(CompressionFilter.class);
public void init(FilterConfig config) {
}
public void doFilter(
ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
if (_log.isDebugEnabled()) {
if (useFilter) {
_log.debug("Compression is enabled");
}
else {
_log.debug("Compression is disabled");
}
}
HttpServletRequest httpReq = (HttpServletRequest)req;
HttpServletResponse httpRes = (HttpServletResponse)res;
String completeURL = httpReq.getRequestURL().toString();
if (useFilter && isCompress(httpReq) && !isInclude(httpReq) &&
acceptsGzip(httpReq) && !isAlreadyFiltered(httpReq)) {
if (_log.isDebugEnabled()) {
_log.debug("Compressing " + completeURL);
}
httpReq.setAttribute(_ALREADY_FILTERED, Boolean.TRUE);
CompressionResponse compressionResponse =
new CompressionResponse(httpRes);
chain.doFilter(req, compressionResponse);
compressionResponse.finishResponse();
}
else {
if (_log.isDebugEnabled()) {
_log.debug("Not compressing " + completeURL);
}
chain.doFilter(req, res);
}
}
public void destroy() {
}
protected boolean isAlreadyFiltered(HttpServletRequest req) {
if (req.getAttribute(_ALREADY_FILTERED) != null) {
return true;
}
else {
return false;
}
}
protected boolean isCompress(HttpServletRequest req) {
if (!getBoolean(req.getParameter(_COMPRESS), true)) {
return false;
}
else {
return true;
}
}
protected boolean isInclude(HttpServletRequest req) {
String uri = (String)req.getAttribute("javax.servlet.include.request_uri");
if (uri == null) {
return false;
}
else {
return true;
}
}
protected boolean acceptsGzip(HttpServletRequest req) {
String acceptEncoding = req.getHeader("Accept-Encoding");
if ((acceptEncoding != null) &&
(acceptEncoding.indexOf(_GZIP) != -1)) {
return true;
}
else {
return false;
}
}
protected boolean getBoolean(String value, boolean defaultValue) {
if (value != null) {
try {
value = value.trim();
if (value.equalsIgnoreCase(BOOLEANS[0]) ||
value.equalsIgnoreCase(BOOLEANS[1]) ||
value.equalsIgnoreCase(BOOLEANS[2]) ||
value.equalsIgnoreCase(BOOLEANS[3]) ||
value.equalsIgnoreCase(BOOLEANS[4])) {
return true;
}
else {
return false;
}
}
catch (Exception e) {
}
}
return defaultValue;
}
}