登录/注册
JAVA知识库
功能强大的 Servlet Filter 完整源代码
转自:http://dev.21tx.com
/* * <p>Company: </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 >