/*  * <p>Company: 凌科软件 www.elingke.com </p>  * @author liubaojun  * @version 1.0  * Created on 2004-11-29  * 来源于 elinkBSP 部分源代码  */ package com.elink.control; 
import java.io.*; import java.util.*; import java.util.zip.*; import javax.servlet.*; import javax.servlet.http.*; //import com.elink.util.*; 
/**  * @author liubj  */ 
public class BusiFilter implements Filter {  private FilterConfig config  = null;  private HashMap expiresMap  = null;  private String encoding = null; 
 public void init(FilterConfig filterConfig)  {   this.config = filterConfig;   this.encoding = config.getInitParameter("encoding");   if( encoding == null || encoding.length() == 0 )   {    encoding = "GBK";   }   expiresMap = new HashMap();   Enumeration names = config.getInitParameterNames();   while( names.hasMoreElements() )   {    String paramName = (String)names.nextElement();    if( !"encoding".equals(paramName) )    {     String paramValue = config.getInitParameter(paramName);     try     {      Integer expires = Integer.valueOf( config.getInitParameter(paramName) );      expiresMap.put(paramName, expires);     }     catch( Exception ex)     {      //LogUtil.logError( "Filter."+paramValue+"="+paramValue);     }    }   }  } 
 public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain)   throws IOException, ServletException  {   // 汉字问题   HttpServletRequest httpRequest = (HttpServletRequest)request;   httpRequest.setCharacterEncoding( encoding ); //  chain.doFilter(request, response); 
        // 压缩传输   HttpServletResponse httpResponse = (HttpServletResponse)response;   String uri = httpRequest.getRequestURI();      String transferEncoding = getGZIPEncoding((HttpServletRequest)request);   if (transferEncoding == null)   {    setResponseHeader( httpResponse, uri, transferEncoding );    chain.doFilter(request, response);   }   else   {    if( uri.endsWith(".ctl") || uri.endsWith("busictrl") ) // 不处理的 URL    {     chain.doFilter(request, response);    }    else    {     setResponseHeader( httpResponse, uri, transferEncoding );     httpResponse.setHeader("Content-Encoding", transferEncoding);     GZIPEncodableResponse wrappedResponse = new GZIPEncodableResponse((HttpServletResponse)response);     chain.doFilter(request, wrappedResponse);     wrappedResponse.flush();    }   }  } 
 public void destroy()  {  }    private void setResponseHeader( HttpServletResponse response, String uri, String transferEncoding )  {   //LogUtil.logDebug( uri + ".Accept-Encoding: "+ transferEncoding);   String ext = null;   int dot =  uri.lastIndexOf(".");   if( dot != -1 )   {    ext = uri.substring( dot+1 );   }   if( ext!= null && ext.length() > 0 )   {    Integer expires = (Integer)expiresMap.get(ext);    if( expires != null )    {     //LogUtil.logDebug( uri + ".Expires: "+ expires.intValue());     if( expires.intValue() > 0 )     {      response.setHeader("Cache-Control","max-age="+expires.intValue()); //HTTP 1.1     }     else     {      response.setHeader("Cache-Control","no-cache");      response.setHeader("Pragma","no-cache"); //HTTP 1.0      response.setDateHeader ("Expires", expires.intValue() );     }    }   }  } 
 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();   }  } }
  配置文件 <filter>  <filter-name>busifilter</filter-name>  <filter-class>com.elink.control.BusiFilter</filter-class>  <init-param>      <param-name>encoding</param-name>      <param-value>GBK</param-value>  </init-param>  <init-param>   <param-name>js</param-name>   <param-value>3600</param-value>  </init-param>  <init-param>   <param-name>gif</param-name>   <param-value>3600</param-value>  </init-param>  <init-param>   <param-name>jpg</param-name>   <param-value>3600</param-value>  </init-param>  <init-param>   <param-name>css</param-name>   <param-value>3600</param-value>  </init-param>  <init-param>   <param-name>bo</param-name>   <param-value>0</param-value>  </init-param>  <init-param>   <param-name>jsp</param-name>   <param-value>0</param-value>  </init-param>   </filter>   <filter-mapping>  <filter-name>busifilter</filter-name>  <url-pattern>/*</url-pattern>   </filter-mapping>  
 
  |