---------------------------------------------------------------------------------------------------------------------------
为什么要进行数据压缩?
为了节省 访问网站时的流量,程序开发人员,在开发程序时,应该在服务器端,植入 数据压缩技术。
比如:用户在客户端 用手机(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() {
}
}
相关推荐
下面详细介绍如何通过`Filter`来统一设置全站的字符编码。 ##### 2.1 实现原理 为了实现全站字符编码的统一设置,我们可以创建一个名为`CharacterEncodingFilter`的过滤器类,该类实现了`javax.servlet.Filter`...
【压缩包子文件】"整站程序_EasyJF官网全站源码_easyjfcom_src"可能包含以下部分: 1. **项目结构**:源码通常会按照MVC(Model-View-Controller)架构组织,包括业务逻辑层、数据访问层和视图层。 2. **配置文件**...
为了帮助你的WordPress主题具备整站全站的SEO功能,而不依赖第三方插件,我们可以直接通过代码实现这一目标。下面将详细介绍如何通过纯代码方式来实现WordPress主题的SEO功能。 首先,我们需要了解SEO的基本元素,...
[Database-support-package]-数据库需要用到的-c3p0/dbcp/dbUtils工具支持包 [Hibernate]利用Hibernate进行一对多的级联操作-Web实例 [Java_MySQL_jar]-数据库连接支持包 ...[myGzipWeb]全站压缩
本文将深入探讨javaweb中Filter的常见应用,以及如何解决全站字符编码问题。 首先,Filter是Java Servlet API的一部分,它遵循Servlet规范中的Filter接口。通过实现Filter接口并覆盖其`doFilter()`方法,开发者可以...
[Database-support-package]-数据库需要用到的-c3p0/dbcp/dbUtils工具支持包 [Hibernate]利用Hibernate进行一对多的级联操作-Web实例 [Java_MySQL_jar]-数据库连接支持包...[myGzipWeb]全站压缩 [myJavaMainDemo]Java-Q
在Web开发中,有很多全站性的问题需要处理,例如中文乱码问题、权限访问控制等。使用Servlet 之过滤器可以统一进行过滤,简化开发过程,并提高开发效率。 Servlet 之过滤器的用途 Servlet 之过滤器可以实现用户在...
4. **全站GZIP压缩过滤器**:虽然实现起来较为复杂,但能显著减少传输的数据量,提高性能。 #### 巩固包装设计模式——装饰模式 1. **装饰模式的基本步骤**: - 定义一个接口,该接口定义了一组基本的操作。 - ...
2. **低通滤波器设计软件(FilterLab)下载 v2.0免费版_滤波器设计软件 - pc6下载站.url**:这个文件是一个链接,指向了FilterLab的下载页面,版本号v2.0,表明软件已经经过了一定程度的更新和优化。免费版意味着用户...
- CSRF(跨站请求伪造)和XSS(跨站脚本攻击)是两种常见的Web安全威胁,防范措施包括验证令牌、输入过滤等。 - Cookie可以通过设置HttpOnly和Secure标志来防止XSS攻击。 9. **浏览器工作原理**: - 当用户输入...
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在微博的应用及优化实践,涵盖了Redis的选择原因、应用场景、面临挑战以及一系列优化策略。 首先,Redis在微博的应用非常广泛,包括但不限于信息流、...
2. **WebSocket支持**:随着实时Web应用的需求增加,Servlet 3.1开始支持WebSocket协议,提供了一种低延迟、双向通信的机制,允许客户端和服务器之间进行全双工的通信,而无需频繁地打开和关闭连接。 3. **HTTP/2...
5. **数组与集合**:介绍数组的基本操作方法,例如push、pop、shift、unshift等,同时涵盖数组遍历技巧及高级特性(如map、filter、reduce)。 #### 三、DOM操作与事件处理 1. **文档对象模型(DOM)**:解析DOM树...
JS的学习涵盖了从基础语法到高级特性的全方位理解。 1. **基础语法**:JS的基础包括变量(var、let、const)、数据类型(Number、String、Boolean、Null、Undefined、Object、Symbol)、运算符(算术、比较、逻辑、...