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

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

 
  1 /** */ /**//*
  2 * <p>Company: 凌科软件 www.elingke.com </p>
  3 * @author liubaojun
  4 * @version 1.0
  5 * Created on 2004-11-29
  6 * 来源于 elinkBSP 部分源代码
  7 */

  8 package  com.elink.control;
  9
 10 import  java.io. * ;
 11 import  java.util. * ;
 12 import  java.util.zip. * ;
 13 import  javax.servlet. * ;
 14 import  javax.servlet.http. * ;
 15 // import com.elink.util.*;
 16
 17 /** */ /** */ /** */ /**
 18 * @author liubj
 19 */

 20
 21 public   class  BusiFilter  implements  Filter
 22 {
 23 private FilterConfig config  = null;
 24 private HashMap expiresMap  = null;
 25 private String encoding = null;
 26
 27 public void init(FilterConfig filterConfig)
 28 {
 29  this.config = filterConfig;
 30  this.encoding = config.getInitParameter("encoding");
 31  if( encoding == null || encoding.length() == 0 )
 32  {
 33   encoding = "GBK";
 34  }

 35  expiresMap = new HashMap();
 36  Enumeration names = config.getInitParameterNames();
 37  while( names.hasMoreElements() )
 38  {
 39   String paramName = (String)names.nextElement();
 40   if!"encoding".equals(paramName) )
 41   {
 42    String paramValue = config.getInitParameter(paramName);
 43    try
 44    {
 45     Integer expires = Integer.valueOf( config.getInitParameter(paramName) );
 46     expiresMap.put(paramName, expires);
 47    }

 48    catch( Exception ex)
 49    {
 50     //LogUtil.logError( "Filter."+paramValue+"="+paramValue);
 51    }

 52   }

 53  }

 54 }

 55
 56 public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain)
 57  throws IOException, ServletException
 58 {
 59  // 汉字问题
 60  HttpServletRequest httpRequest = (HttpServletRequest)request;
 61  httpRequest.setCharacterEncoding( encoding );
 62//  chain.doFilter(request, response);
 63
 64        // 压缩传输
 65  HttpServletResponse httpResponse = (HttpServletResponse)response;
 66  String uri = httpRequest.getRequestURI();
 67  
 68  String transferEncoding = getGZIPEncoding((HttpServletRequest)request);
 69  if (transferEncoding == null)
 70  {
 71   setResponseHeader( httpResponse, uri, transferEncoding );
 72   chain.doFilter(request, response);
 73  }

 74  else
 75  {
 76   if( uri.endsWith(".ctl"|| uri.endsWith("busictrl") ) // 不处理的 URL
 77   {
 78    chain.doFilter(request, response);
 79   }

 80   else
 81   {
 82    setResponseHeader( httpResponse, uri, transferEncoding );
 83    httpResponse.setHeader("Content-Encoding", transferEncoding);
 84    GZIPEncodableResponse wrappedResponse = new GZIPEncodableResponse((HttpServletResponse)response);
 85    chain.doFilter(request, wrappedResponse);
 86    wrappedResponse.flush();
 87   }

 88  }

 89 }

 90
 91 public void destroy()
 92 {
 93 }

 94 
 95 private void setResponseHeader( HttpServletResponse response, String uri, String transferEncoding )
 96 {
 97  //LogUtil.logDebug( uri + ".Accept-Encoding: "+ transferEncoding);
 98  String ext = null;
 99  int dot =  uri.lastIndexOf(".");
100  if( dot != -1 )
101  {
102   ext = uri.substring( dot+1 );
103  }

104  if( ext!= null && ext.length() > 0 )
105  {
106   Integer expires = (Integer)expiresMap.get(ext);
107   if( expires != null )
108   {
109    //LogUtil.logDebug( uri + ".Expires: "+ expires.intValue());
110    if( expires.intValue() > 0 )
111    {
112     response.setHeader("Cache-Control","max-age="+expires.intValue()); //HTTP 1.1
113    }

114    else
115    {
116     response.setHeader("Cache-Control","no-cache");
117     response.setHeader("Pragma","no-cache"); //HTTP 1.0
118     response.setDateHeader ("Expires", expires.intValue() );
119    }

120   }

121  }

122 }

123
124private static String getGZIPEncoding(HttpServletRequest request)
125 {
126  String acceptEncoding = request.getHeader("Accept-Encoding");
127  if (acceptEncoding == null)
128   return null;
129  acceptEncoding = acceptEncoding.toLowerCase();
130  if (acceptEncoding.indexOf("x-gzip">= 0)
131  {
132   return "x-gzip";
133  }

134  if (acceptEncoding.indexOf("gzip">= 0)
135  {
136   return "gzip";
137  }

138  return null;
139 }

140
141 private class GZIPEncodableResponse extends HttpServletResponseWrapper
142 {
143  private GZIPServletStream wrappedOut;
144
145  public GZIPEncodableResponse(HttpServletResponse response) throws IOException
146  {
147   super(response);
148   wrappedOut = new GZIPServletStream(response.getOutputStream());
149  }

150
151  public ServletOutputStream getOutputStream() throws IOException
152  {
153   return wrappedOut;
154  }

155
156  private PrintWriter wrappedWriter;
157
158  public PrintWriter getWriter() throws IOException
159  {
160   if (wrappedWriter == null)
161   {
162    wrappedWriter = new PrintWriter(new OutputStreamWriter(
163      getOutputStream(), getCharacterEncoding()));
164   }

165   return wrappedWriter;
166  }

167
168  public void flush() throws IOException
169  {
170   if (wrappedWriter != null)
171   {
172    wrappedWriter.flush();
173   }

174   wrappedOut.finish();
175  }

176 }

177
178 private class GZIPServletStream extends ServletOutputStream
179 {
180  private GZIPOutputStream outputStream;
181
182  public GZIPServletStream(OutputStream source) throws IOException
183  {
184   outputStream = new GZIPOutputStream(source);
185  }

186
187  public void finish() throws IOException
188  {
189   outputStream.finish();
190  }

191
192  public void write(byte[] buf) throws IOException
193  {
194   outputStream.write(buf);
195  }

196
197  public void write(byte[] buf, int off, int len) throws IOException
198  {
199   outputStream.write(buf, off, len);
200  }

201
202  public void write(int c) throws IOException
203  {
204   outputStream.write(c);
205  }

206
207  public void flush() throws IOException
208  {
209   outputStream.flush();
210  }

211
212  public void close() throws IOException
213  {
214   outputStream.close();
215  }

216 }

217}

配置文件

 1 < filter >
 2   < filter-name > busifilter </ filter-name >
 3   < filter-class > com.elink.control.BusiFilter </ filter-class >
 4   < init-param >
 5       < param-name > encoding </ param-name >
 6       < param-value > GBK </ param-value >
 7   </ init-param >
 8   < init-param >
 9    < param-name > js </ param-name >
10    < param-value > 3600 </ param-value >
11   </ init-param >
12   < init-param >
13    < param-name > gif </ param-name >
14    < param-value > 3600 </ param-value >
15   </ init-param >
16   < init-param >
17    < param-name > jpg </ param-name >
18    < param-value > 3600 </ param-value >
19   </ init-param >
20   < init-param >
21    < param-name > css </ param-name >
22    < param-value > 3600 </ param-value >
23   </ init-param >
24   < init-param >
25    < param-name > bo </ param-name >
26    < param-value > 0 </ param-value >
27   </ init-param >
28   < init-param >
29    < param-name > jsp </ param-name >
30    < param-value > 0 </ param-value >
31   </ init-param >
32    </ filter >
33    < filter-mapping >
34   < filter-name > busifilter </ filter-name >
35   < url-pattern > /* </ url-pattern >
36    </ filter-mapping >
37

 

 

你可能感兴趣的:(功能强大的 Servlet Filter 完整源代码)