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