`
gupeng_ie
  • 浏览: 25783 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

全站压缩(filter)

阅读更多

 


 

---------------------------------------------------------------------------------------------------------------------------

  为什么要进行数据压缩?

 

  为了节省 访问网站时的流量,程序开发人员,在开发程序时,应该在服务器端,植入 数据压缩技术。

比如:用户在客户端 用手机(gprs)访问一个网站,如果此网站没有使用 数据压缩技术,那么用户

在此网站上,使用的 流量 可想而知。

----------------------------------------------------------------------------------------------------------------------------

数据压缩:在用户请求数据时,显示的结果经过一个压缩包传递的。

 

在java中有一个类,专门负责压缩数据

    GZIPOutputStream--输出流--压缩工具流

----------------------------------------------------------------------------------------------------------------------------

 

应该对哪些数据进行压缩?

 

  只对字符进行压缩

  因为对电影和图片等进行压缩,消耗内存很大。

  没有任何意义。

-----------------------------------------------------------------------------------------------------------------------------

**Gzip核心代码

 

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

 

// 准备压缩数据

String str = "大家好";

 

// 将数据封装到byte数组

byte[] beforeDatas = str.getBytes("UTF-8");

 

// 准备容器,盛放压缩数据

ByteArrayOutputStream container = new ByteArrayOutputStream();

 

// 创建压缩工具

GZIPOutputStream gzipTool = new GZIPOutputStream(container);

 

// 执行压缩

gzipTool.write(beforeDatas);

 

// gzip拥有缓存,需要刷新

gzipTool.close();

 

// 从container中获取 压缩数据

byte[] afterDatas = container.toByteArray();

 

//验证压缩比

//System.out.println("before:" + beforeDatas.length);

//System.out.println("after:" + afterDatas.length);

 

// 获取输出字节流,*注意*只能用 字节流

ServletOutputStream outputStream = response.getOutputStream();

 

// 设置 响应编码,即输出流、浏览器编译 编码

response.setContentType("text/html;charset=UTF-8");

 

// 通知浏览器,这是压缩后的数据

response.setHeader("Content-Encoding", "gzip");

 

outputStream.write(afterDatas);

 

outputStream.close();

}

 

--------------------------------------------------------------------------------------------------------------

 

**全站压缩:

  

  全站:即为整个站点。

在myeclipse中,为一个web_program。

对应到tomcat中,是发布到webapp(WebApplication)中的一个web_program。

tomcat--web服务器,其中webapp中,存放着发布的站点。

一个站点--百度、谷歌、又或者搜狐。

 

  压缩:利用web技术,对 客户端 访问 站点中 的字符信息,服务端 进行压缩--打包后,

再响应给 客户端。

 

  全站压缩:通过filter拦截用户访问的字符信息,使用gzip压缩后,响应给用户。

 

  ------------

*全站压缩 分析:

 

  第一步:

在servlet,使用response.getWriter(),正常输出字符。

*只是在这里,我们获得的PrintWriter会是我们自己创建的类。

 

  第二步:

创建MyResponse extends HttpServletResponseWrapper

复写getWriter(),其他方法还用父类的。

 

  第三步:

使用filter,拦截字符。

创建MyResponse,并将其放入doFilter()。

在doFilter()后面,使用压缩技术。

 

*核心代码:

 

第一步:

public class OutServlet extends HttpServlet {

 

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

this.doPost(request, response);

}

 

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

 

PrintWriter writer = response.getWriter();

writer.print("早上好!");

writer.close();

}

}

第二步:

public class MyResponse extends HttpServletResponseWrapper{

 

//声明自己的PrintWriter

private PrintWriter printWriter;

//声明一个container

private ByteArrayOutputStream container;

 

public MyResponse(HttpServletResponse response) {

super(response);

System.out.println("new MyResponse时 创建container");

container = new ByteArrayOutputStream();

}

 

//重写getWriter()

@Override

public PrintWriter getWriter() throws IOException {

printWriter = new PrintWriter(new OutputStreamWriter(container, "UTF-8"));

return printWriter;

}

 

//获取 压缩前 数据

public byte[] getBeforeDatas(){

return container.toByteArray();

}

}

第三步:

public class GzipFilter implements Filter {

 

@Override

public void init(FilterConfig filterConfig) throws ServletException {

 

}

 

@Override

public void doFilter(ServletRequest request, ServletResponse response,

FilterChain chain) throws IOException, ServletException {

//把MyResponse传给servlet

MyResponse myResponse = new MyResponse((HttpServletResponse)response);

 

//将请求放行,传入我们提供的MyResponse,进入到servlet

chain.doFilter(request, myResponse);

 

//从servlet执行后,通过此filter返回到浏览器

//获取beforeDatas

byte[] beforeDatas = myResponse.getBeforeDatas();

 

//声明 压缩后 数据存放container

ByteArrayOutputStream container = new ByteArrayOutputStream();

 

//创建压缩工具

GZIPOutputStream gzipTool = new GZIPOutputStream(container);

 

//执行压缩

gzipTool.write(beforeDatas);

 

//刷出缓存

gzipTool.close();

 

//获得压缩后的数据

byte[] afterDatas = container.toByteArray();

 

//查看压缩比

System.out.println("before:"+beforeDatas.length);

System.out.println("after:"+afterDatas.length);

 

//转换响应类型

HttpServletResponse resp = (HttpServletResponse)response;

 

//设置响应编码

resp.setContentType("text/html;charset=UTF-8");

 

//通知浏览器,此数据为 压缩后的数据

resp.setHeader("Content-Encoding", "gzip");

 

//必须使用 字节流 输出

ServletOutputStream outputStream = resp.getOutputStream();

outputStream.write(afterDatas);

outputStream.close();

 

}

 

@Override

public void destroy() {

 

}

}

 

  • 大小: 21 KB
分享到:
评论

相关推荐

    javaweb中Filter(过滤器)的常见应用.docx

    下面详细介绍如何通过`Filter`来统一设置全站的字符编码。 ##### 2.1 实现原理 为了实现全站字符编码的统一设置,我们可以创建一个名为`CharacterEncodingFilter`的过滤器类,该类实现了`javax.servlet.Filter`...

    [整站程序]EasyJF官网全站源码_easyjfcom_src.zip

    【压缩包子文件】"整站程序_EasyJF官网全站源码_easyjfcom_src"可能包含以下部分: 1. **项目结构**:源码通常会按照MVC(Model-View-Controller)架构组织,包括业务逻辑层、数据访问层和视图层。 2. **配置文件**...

    WordPress主题添加整站全站SEO功能(纯代码)

    为了帮助你的WordPress主题具备整站全站的SEO功能,而不依赖第三方插件,我们可以直接通过代码实现这一目标。下面将详细介绍如何通过纯代码方式来实现WordPress主题的SEO功能。 首先,我们需要了解SEO的基本元素,...

    Java的学习之路,学习JavaEE以及框架时候的一些项目,结合博客和源码,让你受益匪浅,适合Java初学者和刚入门开始学框架者

    [Database-support-package]-数据库需要用到的-c3p0/dbcp/dbUtils工具支持包 [Hibernate]利用Hibernate进行一对多的级联操作-Web实例 [Java_MySQL_jar]-数据库连接支持包 ...[myGzipWeb]全站压缩

    javaweb中Filter(过滤器)的常见应用

    本文将深入探讨javaweb中Filter的常见应用,以及如何解决全站字符编码问题。 首先,Filter是Java Servlet API的一部分,它遵循Servlet规范中的Filter接口。通过实现Filter接口并覆盖其`doFilter()`方法,开发者可以...

    mysql spring c3p0/dbcp/dbUtils工具支持包

    [Database-support-package]-数据库需要用到的-c3p0/dbcp/dbUtils工具支持包 [Hibernate]利用Hibernate进行一对多的级联操作-Web实例 [Java_MySQL_jar]-数据库连接支持包...[myGzipWeb]全站压缩 [myJavaMainDemo]Java-Q

    详解Servlet之过滤器(Filter)

    在Web开发中,有很多全站性的问题需要处理,例如中文乱码问题、权限访问控制等。使用Servlet 之过滤器可以统一进行过滤,简化开发过程,并提高开发效率。 Servlet 之过滤器的用途 Servlet 之过滤器可以实现用户在...

    javaweb过滤器

    4. **全站GZIP压缩过滤器**:虽然实现起来较为复杂,但能显著减少传输的数据量,提高性能。 #### 巩固包装设计模式——装饰模式 1. **装饰模式的基本步骤**: - 定义一个接口,该接口定义了一组基本的操作。 - ...

    滤波器开发软件

    2. **低通滤波器设计软件(FilterLab)下载 v2.0免费版_滤波器设计软件 - pc6下载站.url**:这个文件是一个链接,指向了FilterLab的下载页面,版本号v2.0,表明软件已经经过了一定程度的更新和优化。免费版意味着用户...

    前端春招秋招/前端工程师面试全集

    - CSRF(跨站请求伪造)和XSS(跨站脚本攻击)是两种常见的Web安全威胁,防范措施包括验证令牌、输入过滤等。 - Cookie可以通过设置HttpOnly和Secure标志来防止XSS攻击。 9. **浏览器工作原理**: - 当用户输入...

    Hadoop实战

    895.2.1 Reduce侧的联结 905.2.2 基于DistributedCache的复制联结 985.2.3 半联结:map侧过滤后在reduce侧联结 1015.3 创建一个Bloom filter 1025.3.1 Bloom filter做了什么 1025.3.2 实现一个Bloom filter 1045.3.3...

    Redis在微博场景下的优化实践.pdf

    兰将州在“全球敏捷运维峰会”北京站的演讲中详细介绍了Redis在微博的应用及优化实践,涵盖了Redis的选择原因、应用场景、面临挑战以及一系列优化策略。 首先,Redis在微博的应用非常广泛,包括但不限于信息流、...

    Servlet3.1规范(最终版)(中英双版本)

    2. **WebSocket支持**:随着实时Web应用的需求增加,Servlet 3.1开始支持WebSocket协议,提供了一种低延迟、双向通信的机制,允许客户端和服务器之间进行全双工的通信,而无需频繁地打开和关闭连接。 3. **HTTP/2...

    JavaScript Programmer_s Reference.pdf

    5. **数组与集合**:介绍数组的基本操作方法,例如push、pop、shift、unshift等,同时涵盖数组遍历技巧及高级特性(如map、filter、reduce)。 #### 三、DOM操作与事件处理 1. **文档对象模型(DOM)**:解析DOM树...

    JS学习

    JS的学习涵盖了从基础语法到高级特性的全方位理解。 1. **基础语法**:JS的基础包括变量(var、let、const)、数据类型(Number、String、Boolean、Null、Undefined、Object、Symbol)、运算符(算术、比较、逻辑、...

Global site tag (gtag.js) - Google Analytics