当页面引用一个比较大的js和css文件时,会出现较大下载延迟,占用带宽的问题,如果一个应用里有很多这样的js或CSS文件,那么就需要优化了。

比如ext-all.js有1.4M,页面引用这个文件,正常引用如下:

  1. <script type="text/javascript" charset="utf-8" src="/extjs/ext-all.js"></script>

HTTP中响应头(Response Headers)属性content-Encoding,可以指定内容编码方式。内容编码方式则指出字节如何编码为其他字节。
比如我们这里设定content-Encoding:gzip,这样浏览器请求一个gzip格式的文件到浏览器端,然后浏览器端再按照gzip格式解压使用。

这样就给刚才的问题提供了一种思路,我们可以把服务器端较大的js或CSS使用gizp压缩一下,文件就变小了,然后发送这个较小的文件到浏览器端,让浏览器解压后共页面引用。

第一步:把js文件压缩一下

  1. ext-all.gzjs

第二步:html添加引用

  1. <script type="text/javascript" charset="utf-8" src="/extjs/ext-all.gzjs"></script>

第三步:web.xml设置header属性过滤器

  1. <filter>
  2. <filter-name>GzipFilter</filter-name>
  3. <filter-class>com.util.GzipFilter</filter-class>
  4. <init-param>
  5. <param-name>headers</param-name>
  6. <param-value>Content-Encoding=gzip</param-value>
  7. </init-param>
  8. </filter>
  9. <filter-mapping>
  10. <filter-name>GzipFilter</filter-name>
  11. <url-pattern>*.gzjs</url-pattern>
  12. </filter-mapping>
  13. <filter-mapping>
  14. <filter-name>GzipFilter</filter-name>
  15. <url-pattern>*.gzcss</url-pattern>
  16. </filter-mapping>

第四步:实现过滤器GzipFilter

  1. package com.util;
  2.  
  3. import java.io.IOException;
  4. import java.util.HashMap;
  5. import java.util.Map;
  6. import java.util.Map.Entry;
  7.  
  8. import javax.servlet.Filter;
  9. import javax.servlet.FilterChain;
  10. import javax.servlet.FilterConfig;
  11. import javax.servlet.ServletException;
  12. import javax.servlet.ServletRequest;
  13. import javax.servlet.ServletResponse;
  14. import javax.servlet.http.HttpServletResponse;
  15. public class GzipFilter implements Filter {
  16.  
  17. /** 参数键值:头信息 */
  18. public static final String PARAM_KEY_HEADERS = "headers";
  19.  
  20. /** 头信息 */
  21. private Map<String, String> headers;
  22.  
  23. /**
  24. * <B>方法名称:</B>初始化<BR>
  25. * <B>概要说明:</B>初始化过滤器<BR>
  26. *
  27. * @param fConfig 过滤器配置
  28. * @throws ServletException Servlet异常
  29. * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
  30. */
  31. public void init(FilterConfig fConfig) throws ServletException {
  32. String param = fConfig.getInitParameter(PARAM_KEY_HEADERS);
  33. if (param == null || param.trim().length() < 1) {
  34. return;
  35. }
  36. this.headers = new HashMap<String, String>();
  37. String[] params = param.split(",");
  38. String[] kvs = null;
  39. for (int i = 0; i < params.length; i++) {
  40. param = params[i];
  41. if (param != null && param.trim().length() > 0) {
  42. kvs = param.split("=");
  43. if (kvs != null && kvs.length == 2) {
  44. headers.put(kvs[0], kvs[1]);
  45. }
  46. }
  47. }
  48. if (this.headers.isEmpty()) {
  49. this.headers = null;
  50. }
  51. }
  52.  
  53. /**
  54. * <B>方法名称:</B>过滤处理<BR>
  55. * <B>概要说明:</B>设定编码格式<BR>
  56. *
  57. * @param request 请求
  58. * @param response 响应
  59. * @param chain 过滤器链
  60. * @throws IOException IO异常
  61. * @throws ServletException Servlet异常
  62. * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest,
  63. * javax.servlet.ServletResponse, javax.servlet.FilterChain)
  64. */
  65. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
  66. ServletException {
  67. if (this.headers != null) {
  68. HttpServletResponse res = (HttpServletResponse) response;
  69. for (Entry<String, String> header : this.headers.entrySet()) {
  70. res.addHeader(header.getKey(), header.getValue());
  71. }
  72. }
  73. chain.doFilter(request, response);
  74. }
  75.  
  76. public void destroy() {
  77. this.headers.clear();
  78. this.headers = null;
  79. }
  80.  
  81. }

浏览器页面请求js、css大文件处理的更多相关文章

  1. Node + js实现大文件分片上传基本原理及实践(一)

    _ 阅读目录 一:什么是分片上传? 二:理解Blob对象中的slice方法对文件进行分割及其他知识点 三. 使用 spark-md5 生成 md5文件 四. 使用koa+js实现大文件分片上传实践 回 ...

  2. 使用监听器解决路径问题,例如在jsp页面引入js,css的web应用路径

    使用监听器解决路径问题,例如在jsp页面引入js,css的web应用路径 经常地,我们要在jsp等页面引入像js,css这样的文件,但是在服务器来访问的时候,这时间就有关到相对路径与绝对路径了.像网页 ...

  3. [Asp.net Mvc]为js,css静态文件添加版本号

    方式一: 思路 string version = ViewBag.Version; @Scripts.RenderFormat("<script type=\"text/ja ...

  4. 构建工具是如何用 node 操作 html/js/css/md 文件的

    构建工具是如何用 node 操作 html/js/css/md 文件的 从本质上来说,html/js/css/md ... 源代码文件都是文本文件,文本文件的内容都是字符串,对文本文件的操作其实就是对 ...

  5. js之大文件断点续传

    文件夹上传:从前端到后端 文件上传是 Web 开发肯定会碰到的问题,而文件夹上传则更加难缠.网上关于文件夹上传的资料多集中在前端,缺少对于后端的关注,然后讲某个后端框架文件上传的文章又不会涉及文件夹. ...

  6. js实现大文件上传分片上传断点续传

    文件夹上传:从前端到后端 文件上传是 Web 开发肯定会碰到的问题,而文件夹上传则更加难缠.网上关于文件夹上传的资料多集中在前端,缺少对于后端的关注,然后讲某个后端框架文件上传的文章又不会涉及文件夹. ...

  7. ASP.NET MVC 扩展HtmlHelper类为 js ,css 资源文件添加版本号

    写在前面 在项目部署当中会需要更新 css 文件或 js 等资源文件,为了避免由于浏览器缓存的原因无法加载新的 css 或 js ,一般的做法是在资源文件的后面加上一个版本号来解决,这样浏览器就会去服 ...

  8. Vue.js实现大文件分片md5断点续传

    背景 根据部门的业务需求,需要在网络状态不良的情况下上传很大的文件(1G+).其中会遇到的问题:1,文件过大,超出服务端的请求大小限制:2,请求时间过长,请求超时:3,传输中断,必须重新上传导致前功尽 ...

  9. js解决大文件断点续传

    最近遇见一个需要上传百兆大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现. 在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表 ...

随机推荐

  1. 【pyqtgraph绘图】Qt速成课程

    解读官方API-Qt速成课程 参考:http://www.pyqtgraph.org/documentation/qtcrashcourse.html Qt速成课程 PyQtGraph广泛使用Qt来生 ...

  2. 不能往Windows Server 2008 R2 Server中复制文件的解决方法

    目前一直直接往Windows 2008 R2 Server中复制文件(暂时还没有搭建ftp服务),突然不能复制了,于是百度找到了解决方法,特此记录(记忆). 1.在任务管理器中找到“rdpclip.e ...

  3. 【托业】【新托业TOEIC新题型真题】学习笔记5-题库二->P7

    --------------------------------------单词-------------------------------------- amenity 适意:休闲设施 onsit ...

  4. js字符串拼接

    1. 2. 3.

  5. MySQL group replication介绍

    “MySQL group replication” group replication是MySQL官方开发的一个开源插件,是实现MySQL高可用集群的一个工具.第一个GA版本正式发布于MySQL5.7 ...

  6. NYOJ 圈水池

    #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #i ...

  7. 微信小程序使用阿里图标-iconfont

    步骤一:下载项目图标 步骤二:解压文件,重命名 iconfont.css为 iconfont.wxss ,并复制 到项目 static文件夹 icon文件夹下                     ...

  8. vertical-align:middle实现图片与文字垂直居中对齐

    css代码: header .logo{ display:inline-block; margin-left: 10px; width: 15%; line-height: 9.1rem; backg ...

  9. Centos7上安装Apache

    Apache HTTP服务器是世界上最流行的Web服务器. 它是一款免费的开源和跨平台的HTTP服务器,提供强大的功能,可以通过各种模块进行扩展. 以下说明介绍如何在CentOS 7机器上安装和管理A ...

  10. js模拟栈---汉诺塔

    var Stack = (function(){ var items = new WeakMap(); //先入后出,后入先出 class Stack{ constructor(){ items.se ...