GZIPは/seam/resource/*を圧縮していません
容器にgzipを設定しても/seam/resource/*を圧縮することはできません.ブロックを使用して圧縮を実現する必要があります.ie 5でも発見されました.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>