就算你在容器里面设置了gzip,也不能对/seam/resource/*进行压缩,需要使用拦截器才能实现压缩,同时也发现在ie5.x下对/seam/resource/*进行压缩,解压后js文件有错,这应该是IE的问题。以下是我所使用的代码:
public class GzipSeamResourceServlet implements Filter {
	
	public static final String gzip="gzip";
	public static final String transferEncoding = "transferEncoding";
	
	public void init(FilterConfig filterConfig) {
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		
		HttpServletRequest httpRequest = (HttpServletRequest) request;

		HttpSession session = httpRequest.getSession();
		
		if (session.getAttribute(gzip) == null) {
			
			final String gzipStr = getGZIPEncoding((HttpServletRequest) request);
			if(gzipStr!=null){
				session.setAttribute(transferEncoding,gzipStr );
				session.setAttribute(gzip,true );
				String s = ((HttpServletRequest)request).getHeader("user-agent") ;
				if((s.indexOf("MSIE 5.")+s.indexOf("MSIE 4.")+s.indexOf("MSIE 3."))>0){
					session.setAttribute(gzip,false );
					YcEJB_INFO.logger.info("浏览器信息为:"+s);
				}
			}else{
				session.setAttribute(gzip,false );
			}
		}
		

		if ((Boolean)session.getAttribute(gzip) ) {
			HttpServletResponse hsr=((HttpServletResponse) response);
			hsr.setHeader("Content-Encoding", (String)session.getAttribute(transferEncoding));
			GZIPEncodableResponse wrappedResponse = new GZIPEncodableResponse(hsr);
			chain.doFilter(request, wrappedResponse);
			wrappedResponse.flush();
		} else {
			chain.doFilter(request, response);

		}
	}

	public void destroy() {
	}

	private static String getGZIPEncoding(HttpServletRequest request) {
		String acceptEncoding = request.getHeader("Accept-Encoding");
		if (acceptEncoding == null)
			return null;
		acceptEncoding = acceptEncoding.toLowerCase();
		if (acceptEncoding.indexOf("x-gzip") >= 0) {
			return "x-gzip";
		}
		if (acceptEncoding.indexOf("gzip") >= 0) {
			return "gzip";
		}
		return null;
	}

	private class GZIPEncodableResponse extends HttpServletResponseWrapper {
		private GZIPServletStream wrappedOut;

		public GZIPEncodableResponse(HttpServletResponse response) throws IOException {
			super(response);
			wrappedOut = new GZIPServletStream(response.getOutputStream());
		}

		public ServletOutputStream getOutputStream() throws IOException {
			return wrappedOut;
		}

		private PrintWriter wrappedWriter;

		public PrintWriter getWriter() throws IOException {
			if (wrappedWriter == null) {
				wrappedWriter = new PrintWriter(new OutputStreamWriter(getOutputStream(), getCharacterEncoding()));
			}
			return wrappedWriter;
		}

		public void flush() throws IOException {
			if (wrappedWriter != null) {
				wrappedWriter.flush();
			}
			wrappedOut.finish();
		}
	}

	private class GZIPServletStream extends ServletOutputStream {
		private GZIPOutputStream outputStream;

		public GZIPServletStream(OutputStream source) throws IOException {
			outputStream = new GZIPOutputStream(source);
		}

		public void finish() throws IOException {
			outputStream.finish();
		}

		public void write(byte[] buf) throws IOException {
			outputStream.write(buf);
		}

		public void write(byte[] buf, int off, int len) throws IOException {
			outputStream.write(buf, off, len);
		}

		public void write(int c) throws IOException {
			outputStream.write(c);
		}

		public void flush() throws IOException {
			outputStream.flush();
		}

		public void close() throws IOException {
			outputStream.close();
		}
	}

}


web.ini增加
	<filter>
		<filter-name>GZIPEncoder</filter-name>
		<filter-class>filters.GzipSeamResourceServlet</filter-class>
	</filter>

	<filter-mapping>
		<filter-name>GZIPEncoder</filter-name>
		<url-pattern>/seam/resource/*</url-pattern>
	</filter-mapping>
评论
发表评论

您还没有登录,请登录后发表评论

xxqn
  • 浏览: 1584 次
  • 性别: Icon_minigender_1
  • 来自: 广东韶关
  • 详细资料
搜索本博客
存档
最新评论