功能强大的 Servlet Filter 完整源代码

类别:Java 点击:0 评论:0 推荐:

/*
 * <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>

本文地址:http://com.8s8s.com/it/it13013.htm