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