如何nginx 开启gzipp过滤掉

您必须才能发表留言!
最新日志热评日志随机日志没有更多推荐了,
不良信息举报
举报内容:
filter结合gzip 解决web应用中网络传输数据量大的问题
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
java web实现Gzip压缩传输
摘要:为了减少数据在网络中的传输量,从而减少传输时长,增加用户体验,浏览器大都是支持Gzip压缩技术的。http的请求头Accept-Encoding:gzip,deflate就表示这次请求可以接受Gzip压缩后的数据,但是这只表示客户端接受的数据可以是压缩数据,服务端具体要怎么实现压缩呢?我们就从代码层面讲解一下服务端实现压缩后的数据传输。第一步、将响应对象HttpServletResponse包装为我们自己继承HttpServletResponseWrapper的MyRespo
为了减少数据在网络中的传输量,从而减少传输时长,增加用户体验,浏览器大都是支持Gzip压缩技术的。http的请求头 Accept-Encoding:gzip, deflate 就表示这次请求可以接受Gzip压缩后的数据,但是这只表示客户端接受的数据可以是压缩数据,服务端具体要怎么实现压缩呢?我们就从代码层面讲解一下服务端实现压缩后的数据传输。
第一步、将响应对象HttpServletResponse包装为我们自己继承HttpServletResponseWrapper的MyResponse对象,MyResponse类会重写父类的getWriter()方法,在getWriter()方法内我们可以将响应数据缓存到PrintWriter中, 然后对外提供一个获取缓存在PrintWriter中数据的方法getBytes()。
第二部、包装完HttpServletResponse对象后就需要创建一个过滤器GzipFilter来过滤我们需要压缩的请求数据了,在执行chain.doFilter()方法前我们需要将HttpServletResponse包装为我们自己的MyResponse对象,然后执行doFilter()方法。然后再取得我们第一步缓存的响应数据,并将数据进行GZIPOutputStream压缩,最后将压缩后的数据返回给客户端。
第三部、配置需要过滤的请求类型,即配置过滤路径。
具体代码如下:
一、包装响应对象HttpServletResponse package com.qbian.import java.io.ByteArrayOutputSimport java.io.IOEimport java.io.OutputStreamWimport java.io.PrintWimport java.io.UnsupportedEncodingEimport javax.servlet.ServletOutputSimport javax.servlet.http.HttpServletRimport javax.servlet.http.HttpServletResponseWpublic class MyResponse extends HttpServletResponseWrapper{ private ByteArrayOutputStream bytes = new ByteArrayOutputStream(); private HttpServletR private PrintW public MyResponse(HttpServletResponse response) { super(response); this.response = } @Override public ServletOutputStream getOutputStream() throws IOException { return new MyServletOutputStream(bytes); // 将数据写到 byte 中 } /** * 重写父类的 getWriter() 方法,将响应数据缓存在 PrintWriter 中 */ @Override public PrintWriter getWriter() throws IOException { try{ pwrite = new PrintWriter(new OutputStreamWriter(bytes, &utf-8&)); } catch(UnsupportedEncodingException e) { e.printStackTrace(); } } /** * 获取缓存在 PrintWriter 中的响应数据 * @return */ public byte[] getBytes() { if(null != pwrite) { pwrite.close(); return bytes.toByteArray(); } if(null != bytes) { try { bytes.flush(); } catch(IOException e) { e.printStackTrace(); } } return bytes.toByteArray(); } class MyServletOutputStream extends ServletOutputStream { private ByteArrayOutputS public MyServletOutputStream(ByteArrayOutputStream ostream) { this.ostream = } @Override public void write(int b) throws IOException { ostream.write(b); // 将数据写到 stream 中 } }}
二、创建过滤器 GzipFilter package com.qbian.import java.io.ByteArrayOutputSimport java.io.IOEimport java.util.zip.GZIPOutputSimport javax.servlet.Fimport javax.servlet.FilterCimport javax.servlet.FilterCimport javax.servlet.ServletEimport javax.servlet.ServletRimport javax.servlet.ServletRimport javax.servlet.http.HttpServletRimport javax.servlet.http.HttpServletRimport com.qbian.gzip.MyRpublic class GzipFilter implements Filter{ @Override public void destroy() { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) HttpServletResponse resp = (HttpServletResponse) MyResponse mResp = new MyResponse(resp); // 包装响应对象 resp 并缓存响应数据 chain.doFilter(req, mResp); byte[] bytes = mResp.getBytes(); // 获取缓存的响应数据 System.out.println(&压缩前大小:& + bytes.length); ByteArrayOutputStream bout = new ByteArrayOutputStream(); GZIPOutputStream gzipOut = new GZIPOutputStream(bout); // 创建 GZIPOutputStream 对象 gzipOut.write(bytes); // 将响应的数据写到 Gzip 压缩流中 gzipOut.close(); // 将数据刷新到 bout 字节流数组 byte[] bts = bout.toByteArray(); System.out.println(&压缩后大小:& + bts.length); resp.setHeader(&Content-Encoding&, &gzip&); // 设置响应头信息 resp.getOutputStream().write(bts); // 将压缩数据响应给客户端 } @Override public void init(FilterConfig arg0) throws ServletException { System.out.println(&+++启动压缩。&); }}
三、在 web.xml 中配置需要压缩的请求路径 &?xml version=&1.0& encoding=&UTF-8&?& &web-app version=&2.5& xmlns=&http://java.sun.com/xml/ns/javaee& xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance& xsi:schemaLocation=&http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd&& &display-name&demo&/display-name& &!-- Gzip 过滤器配置 --& &filter& &filter-name&gzipF&/filter-name& &filter-class&com.qbian.filter.GzipFilter&/filter-class& &/filter& &!-- Gzip for JavaScript --& &filter-mapping& &filter-name&gzipF&/filter-name& &url-pattern&*.js&/url-pattern& &/filter-mapping& &!-- Gzip for HTML --& &filter-mapping& &filter-name&gzipF&/filter-name& &url-pattern&*.html&/url-pattern& &/filter-mapping& &!-- Gzip for CSS --& &filter-mapping& &filter-name&gzipF&/filter-name& &url-pattern&*.css&/url-pattern& &/filter-mapping&&/web-app&
最后我们可以对比下看看压缩的效果,将 web.xml 中的 &filter-mapping& &filter-name&gzipF&/filter-name& &url-pattern&*.js&/url-pattern&&/filter-mapping&
注释掉,然后我们请求服务器一个JavaScript文件,具体信息如下图所示:
再将上面我们对*.js过滤器配置解开注释,让其起到作用。然后再请求刚刚请求的JavaScript文件看一看服务器响应的文件大小是多少,具体信息如下图所示。
再看看我们后台打印的压缩前后的大小对比,如下图所示。
从以上对比信息中我们可以看到我们写的Gzip压缩过滤器起作用了,并且压缩率很高。
这是服务端的压缩,前端的JavaScript和CSS在上线时也是需要压缩的,不过前端构建工具很多,我就不在这里简绍了。
总结:现在的开发都是前后端分离,前端框架也有很多,我这次使用的就是angularJs,对于一个单一页面应用来说,ng需要加载的js文件有很多。ng的默认加载方式是在启动以后会执行angular.bootstrap()方法并挂载我们创建的相关控制器及其服务,也就是默认的加载方式是同步加载的,这时将JavaScript文件进行合并压缩还是很有必要的。
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
为您提供0门槛上云实践机会
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
java web实现Gzip压缩传输相关信息,包括
的信息,所有java web实现Gzip压缩传输相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
International没有更多推荐了,
不良信息举报
举报内容:
Wireshark过滤规则之:http数据包
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!没有更多推荐了,
不良信息举报
举报内容:
利用GZIP压缩网页相关知识
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!

我要回帖

更多关于 网站如何开启gzip压缩 的文章

 

随机推荐