javaWeb客户端使用缓存过滤器服务器端使用gzip压缩提高访问效率
来源:互联网 发布:怎么找网络推手 编辑:程序博客网 时间:2024/06/15 13:50
缓存过滤器:让客户端使用已经加载过的资源,不重复到服务器端请求资源。
package org.per.lm.cachefilter;import java.io.IOException;import java.io.PrintStream;import java.util.ArrayList;import java.util.List;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;public class CacheFilter implements Filter{ boolean isFil = false;//是否进行过滤 boolean isPrintMsg = false;//是否在控制台显示过滤消息 List<String> noFilFolder = null; public void init(FilterConfig config) throws ServletException { if (config.getInitParameter("isFil").toLowerCase().equals("true")) this.isFil = true; if (this.isFil) { if (config.getInitParameter("noFilFolder") != null) { String noFilFolderstr = config.getInitParameter("noFilFolder"); if (!noFilFolderstr.equals("")) { if (noFilFolderstr.indexOf(",") == -1) { this.noFilFolder = new ArrayList(); this.noFilFolder.add(noFilFolderstr); } else { this.noFilFolder = new ArrayList(); String[] noFilFolderarr = noFilFolderstr.split(","); for (String s : noFilFolderarr) { this.noFilFolder.add(s); } } } } if ((config.getInitParameter("printMsg") != null) && (config.getInitParameter("printMsg").toLowerCase().equals("true"))) this.isPrintMsg = true; } } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { boolean isdoFilter = true; if (this.isFil) { HttpServletRequest httpRequest = (HttpServletRequest)request; HttpSession session = httpRequest.getSession(); List filterFileNameList = new ArrayList(); if (session.getAttribute("org.per.lm.att.filterFileName") != null) filterFileNameList = (List)session.getAttribute("org.per.lm.att.filterFileName"); else { session.setAttribute("org.per.lm.att.filterFileName", filterFileNameList); } String url = httpRequest.getServletPath(); url = url.substring(1); String hz = url.substring(url.lastIndexOf(".") + 1); isPrintMsg("-------------------------------------"); isPrintMsg("过滤文件集合size:" + filterFileNameList.size()); isPrintMsg(url); if (url.indexOf("/") != -1) { boolean flag = false; if (this.noFilFolder != null) { for (String name : this.noFilFolder) { if (url.indexOf(name) == 0) { flag = true; isPrintMsg(name + "文件夹不过滤!"); break; } } } if (!flag) { if (filterFileNameList.contains(url)) { isPrintMsg("过滤掉:" + url); ((HttpServletResponse)response).setStatus(304); isdoFilter = false; } else { isPrintMsg("新增过滤:" + url); filterFileNameList.add(url); session.setAttribute("org.per.lm.att.filterFileName", filterFileNameList); } } } else if (filterFileNameList.contains(url)) { isPrintMsg("过滤掉:" + url); ((HttpServletResponse)response).setStatus(304); isdoFilter = false; } else { isPrintMsg("新增过滤:" + url); filterFileNameList.add(url); session.setAttribute("org.per.lm.att.filterFileName", filterFileNameList); } } if (isdoFilter) chain.doFilter(request, response); } public void destroy() { } private void isPrintMsg(String log) { if (this.isPrintMsg) System.out.println(log); }}
web.xml配置:<filter> <filter-name>cache-filter</filter-name> <filter-class>org.per.lm.cachefilter.CacheFilter</filter-class> <init-param> <param-name>isFil</param-name> <param-value>true</param-value><!-- 是否开启过滤 true开启 false或其他不开启 --> </init-param> <init-param> <param-name>noFilFolder</param-name> <param-value>images,js/myjs</param-value><!-- 不需要过滤的文件夹 多个文件夹以,隔开 不填将全过滤--> </init-param> <init-param> <param-name>printMsg</param-name> <param-value></param-value><!-- 是否打印过滤信息 true打印 false或其他不打印 --> </init-param> <init-param> <param-name>sessionPassedTime</param-name> <param-value>120</param-value><!-- 设置session过期时间(过滤器的有效时间) 单位分钟 格式不对默认为30分钟 不能设置为0 否则会出错 --> </init-param> </filter><filter-mapping> <filter-name>cache-filter</filter-name> <url-pattern>*.js</url-pattern><!--要过滤的文件类型--> <url-pattern>*.css</url-pattern></filter-mapping>
gzip:Gzip开启以后会将输出到用户浏览器的数据进行压缩的处理,这样就会减小通过网络传输的数据量,提高浏览的速度。
package org.per.lm.gzipfilter;import java.io.IOException; import java.util.Enumeration; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class GzipFilter implements Filter { private boolean isGzip = true; @SuppressWarnings("unchecked") public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { boolean compress = false; if (request instanceof HttpServletRequest){ HttpServletRequest httpRequest = (HttpServletRequest) request; Enumeration headers = httpRequest.getHeaders("Accept-Encoding"); while (headers.hasMoreElements()){ String value = (String) headers.nextElement(); if (value.indexOf("gzip") != -1) compress = true; } } if (compress && isGzip){//如果浏览器支持则压缩 HttpServletResponse httpResponse = (HttpServletResponse) response; httpResponse.addHeader("Content-Encoding", "gzip"); CompressionResponse compressionResponse= new CompressionResponse(httpResponse); chain.doFilter(request, compressionResponse); compressionResponse.close(); }else//如果浏览器不支持则不压缩 chain.doFilter(request, response); } public void init(FilterConfig config) throws ServletException { String isGzipstr = config.getInitParameter("isGzip"); if(isGzipstr == null || isGzipstr.equals("") || !isGzipstr.toLowerCase().equals("true")) isGzip = false; } public void destroy(){ } } import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; public class CompressionResponse extends HttpServletResponseWrapper{ protected HttpServletResponse response; private ServletOutputStream out; private CompressedStream compressedOut; private PrintWriter writer; protected int contentLength; public CompressionResponse(HttpServletResponse response) throws IOException { super(response); this.response = response; compressedOut = new CompressedStream(response.getOutputStream()); } public void setContentLength(int len) { contentLength = len; } public ServletOutputStream getOutputStream() throws IOException { if (null == out) { if (null != writer) { throw new IllegalStateException("getWriter() has already been called on this response."); } out = compressedOut; } return out; } public PrintWriter getWriter() throws IOException { if (null == writer) { if (null != out) { throw new IllegalStateException("getOutputStream() has already been called on this response."); } writer = new PrintWriter(compressedOut); } return writer; } public void flushBuffer() { try { if (writer != null) { writer.flush(); }else if (out != null) { out.flush(); } }catch (IOException e) { e.printStackTrace(); } } public void reset() { super.reset(); try { compressedOut.reset(); }catch (IOException e) { throw new RuntimeException(e); } } public void resetBuffer() { super.resetBuffer(); try { compressedOut.reset(); }catch (IOException e) { throw new RuntimeException(e); } } public void close() throws IOException { compressedOut.close(); } } import java.io.IOException; import java.util.zip.GZIPOutputStream; import javax.servlet.ServletOutputStream; public class CompressedStream extends ServletOutputStream { private ServletOutputStream out; private GZIPOutputStream gzip; /** * 指定压缩缓冲流 * @param 输出流到压缩 * @throws IOException if an error occurs with the {@link GZIPOutputStream}. */ public CompressedStream(ServletOutputStream out) throws IOException { this.out = out; reset(); } /** @see ServletOutputStream * */ public void close() throws IOException { gzip.close(); } /** @see ServletOutputStream * */ public void flush() throws IOException { gzip.flush(); } /** @see ServletOutputStream * */ public void write(byte[] b) throws IOException { write(b, 0, b.length); } /** @see ServletOutputStream * */ public void write(byte[] b, int off, int len) throws IOException { gzip.write(b, off, len); } /** @see ServletOutputStream * */ public void write(int b) throws IOException { gzip.write(b); } public void reset() throws IOException { gzip = new GZIPOutputStream(out); } }
web.xml配置: <filter> <filter-name>gzip</filter-name> <filter-class>org.per.lm.gzipfilter.GzipFilter</filter-class><!-- 在服务器端进行gzip压缩 --> <init-param> <param-name>isGzip</param-name> <param-value>true</param-value><!-- 是否开启gzip压缩 只有为true开启 false或其他不开启 --> </init-param> </filter><filter-mapping> <filter-name>gzip</filter-name> <url-pattern>*.js</url-pattern><!--需要压缩的类型--> <url-pattern>*.css</url-pattern> <url-pattern>*.html</url-pattern> <url-pattern>*.htm</url-pattern> </filter-mapping>
经过测试,这两个过滤器可以结合使用。
- javaWeb客户端使用缓存过滤器服务器端使用gzip压缩提高访问效率
- android下使用gzip压缩提升访问server api的效率
- phpnow开启gzip压缩提高访问速度
- 使用gzip压缩页面
- servlet使用gzip压缩
- ExtJS使用gzip压缩
- ExtJS使用gzip压缩
- gin使用gzip压缩
- [转贴]使用GZIP缓存技术提高网页加载速度
- 使用GZIP压缩的方式向客户端传输响应数据
- HTTP1.1访问HTTPS使用gzip压缩及解压缩
- JavaWeb 过滤器的使用
- JavaWeb开启GZIP压缩
- 使用servlet技术控制客户端访问缓存
- 使用servlet技术控制客户端访问缓存
- 使用页面Gzip压缩提速
- 使用页面Gzip压缩提速
- 使用页面Gzip压缩提速
- 自动定时备份sqlserver数据库的方法
- 马化腾内部邮件曝光:腾讯全面无线化
- Linux编译生成
- NetBeans+Mac+Boost开发环境
- 终端命令行进入sqlite3
- javaWeb客户端使用缓存过滤器服务器端使用gzip压缩提高访问效率
- Math.round和floor
- WiDiSK版本信息
- js Cookie设置
- Reverse words in a string.
- LINQ - 操作XML
- synchronized
- 网页游戏中的资源压缩问题
- Android: 运行配置好的模拟器