2008-03-04
GZIP没有对/seam/resource/*进行压缩
就算你在容器里面设置了gzip,也不能对/seam/resource/*进行压缩,需要使用拦截器才能实现压缩,同时也发现在ie5.x下对/seam/resource/*进行压缩,解压后js文件有错,这应该是IE的问题。以下是我所使用的代码:
web.ini增加
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>
- 12:06
- 浏览 (305)
- 评论 (0)
- 发布在 JBoss SEAM 圈子
- 相关推荐
发表评论
- 浏览: 1584 次
- 性别:

- 来自: 广东韶关

- 详细资料
搜索本博客
最近加入圈子
链接
最新评论
-
javascript框架之XHTML、 ...
这也是迫于无奈,你说的问题我暂时还没遇到。 根据我的了解,js兼容性问题只出现在 ...
-- by xxqn -
javascript框架之XHTML、 ...
这种招数楼主也想的出来 佩服佩服不过浏览器,特别是IE,对于[标准模式][混杂模 ...
-- by 打倒小日本 -
javascript国际化终极方法
采用dojo 这样的javacript框架,里面有许多器件都是已经国际化了的,拿 ...
-- by xxqn -
javascript国际化终极方法
我们的项目没有用js做国际化,而是用java的国际化。js的国际化会不会有效率的 ...
-- by jelly -
jboss集成tomcat页面压缩 ...
对于大页面,压缩效果非常明显,680k压缩后23k。
-- by xxqn






评论排行榜