GZIP没有对/seam/resource/*进行压缩

就算你在容器里面设置了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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值