好记性不如烂笔头16-http协议(2)和页面数据压缩传递

我们在使用HttpServletRequest和HttpServletReonse等工具类的时候,这些工具类走的协议就是http协议,http协议也是我们日常WEB开发通用的协议。因为http协议封装的很好,因此我们往往忽视了它,但是在对性能的极致追求中,这些基础协议,又成为我们继续努力的基础。

响应,在http协议中有非常重要的作用。

可以设置Location响应头,实现请求重定向(可以查看HttpServletRequest相关内容);也可以设置Content-Encoding响应头,告诉浏览器数据的压缩格式;还可以设置content-type响应头,指定回送数据类型;也可以设置content-disposition响应头,让浏览器下载文件((可以查看HttpServletReonse相关内容))…

还可以利用它,做很多很多的事情。

1、WEB数据传输中的压缩(Content-Encoding)的源代码

在带宽不够的时候,压缩是一种解决事情的好方法;现在的带宽是越来越大了,不过文件也越来越大,压缩还是有英雄用武之地的。其中百度等网站也是使用压缩的数据传递方式。

package com.servlet;

import java.io.ByteArrayOutputStream;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.util.zip.GZIPOutputStream;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

/**

*通过HttpServletResponse实现传输文件的压缩

*

*@author 范芳铭

*/

public class ResponseEncode extendsHttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponseresponse)

throws ServletException,IOException {

String data = "123456789012345678901234567890" +

"123456789012345678901234567890" +

"123456789012345678901234567890" +

"123456789012345678901234567890" +

"123456789012345678901234567890" +

"123456789012345678901234567890"+

"123456789012345678901234567890" +

"123456789012345678901234567890" +

"123456789012345678901234567890" +

"123456789012345678901234567890" ;

System.out.println("原始数据的大小为:" + data.getBytes().length);

ByteArrayOutputStream bout = new ByteArrayOutputStream();

//能够把文件进行压缩的对象

GZIPOutputStream gout = new GZIPOutputStream(bout); //buffer

gout.write(data.getBytes());

gout.close();

//得到压缩后的数据

byte g[] = bout.toByteArray();

//告诉浏览器用gzip的方式解压

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

response.setHeader("Content-Length",String.valueOf(g.length));

System.out.println("压缩后的数据的大小为:" + g.length);

response.getOutputStream().write(g);

}

publicvoid doPost(HttpServletRequest request, HttpServletResponse response)

throwsServletException, IOException {

doGet(request,response);

}

}

修改web.xml如下:

<servlet>

<servlet-name>encode</servlet-name>

<servlet-class>com.servlet.ResponseEncode</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>encode</servlet-name>

<url-pattern>/encode</url-pattern>

</servlet-mapping>

2、运行结果

浏览器上显示:123456789012345678901234…

好像没有什么效果。

3、测试压缩方法

在浏览器上的访问URL为:http://localhost:8080/webStudy/encode

所有的数据都很正常,但是好像什么都没有做,和普通的方法是一样的。

利用apache commons的httpClient写一个简单的测试用例。(在Apache commons 系列博客中有详细介绍)

httpClient的测试源代码:

package test.ffm83.commons.httpClient;

import org.apache.commons.lang.StringUtils;

import org.apache.http.HttpEntity;

import org.apache.http.HttpResponse;

import org.apache.http.client.HttpClient;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.impl.client.DefaultHttpClient;

import org.apache.http.util.EntityUtils;

/**

* httpClient 的简单应用

* 基于4.x版本

* @author 范芳铭

*/

public class EasyHttpGetA {

public finalstatic void main(String[] args) throws Exception {

getHttpGetOld("http://www.baidu.com/");

getHttpGetOld("http://localhost:8080/webStudy/encode");

}

private staticvoid getHttpGetOld(String url) throws Exception{

HttpClient httpclient = newDefaultHttpClient();  //老方法,不推荐使用

try {

HttpGet httpget = newHttpGet(url);

System.out.println(StringUtils.center(url, 50,"="));

HttpResponse response =httpclient.execute(httpget); //老方法,不推荐使用

HttpEntity entity =response.getEntity();

System.out.println(response.getStatusLine());

String webContent = "";

if (entity != null) {

webContent= EntityUtils.toString(entity);

System.out.println("ResponsegetContentLength: " + entity.getContentLength());

System.out.println("ResponsetoString() length: " + webContent.length());

}

System.out.println(response.toString()); //显示HTTP请求header

System.out.println("----------------------------------------");

httpget.abort();

}

finally {

httpclient.getConnectionManager().shutdown();

}

}

}

4、最终运行结果

我在这里测试了两个URL地址,一个是百度的,一个是http://localhost:8080/webStudy/encode

运行结果如下:

==============http://www.baidu.com/===============

HTTP/1.1 200 OK

Response getContentLength: -1

Response toString() length: 88174

HTTP/1.1 200 OK [Date: Mon, 02 Feb2015 07:35:35 GMT, Content-Type: text/html; charset=utf-8, Transfer-Encoding:chunked, Connection: Keep-Alive, Vary: Accept-Encoding, Set-Cookie:BAIDUID=79C3549FB148B3FD0457B06C79D0BB4C:FG=1; expires=Thu, 31-Dec-37
23:55:55GMT; max-age=2147483647; path=/; domain=.baidu.com, Set-Cookie:BAIDUPSID=79C3549FB148B3FD0457B06C79D0BB4C; expires=Thu, 31-Dec-37 23:55:55GMT; max-age=2147483647; path=/; domain=.baidu.com, Set-Cookie: BDSVRTM=0;path=/, Set-Cookie: BD_HOME=0; path=/,
Set-Cookie: H_PS_PSSID=11384_6354_1426_11361_11156_10902_11226_11394_11101_11399_11277_11241_11280_11151_11243_11404_10618_10634;path=/; domain=.baidu.com, P3P: CP=" OTI DSP COR IVA OUR IND COM ",Cache-Control: private, Cxy_all: baidu+fefa91c7f05681df2e287f12aec4d30b,
Expires:Mon, 02 Feb 2015 07:35:27 GMT, X-Powered-By: HPHP, Server: BWS/1.1, BDPAGETYPE:1, BDQID: 0xec3eeae200002e8a, BDUSERID: 0][email protected]

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

======http://localhost:8080/webStudy/encode=======

HTTP/1.1 200 OK

Response getContentLength: 35

Response toString() length: 35

HTTP/1.1 200 OK [Server:Apache-Coyote/1.1, Content-Encoding: gzip, Content-Length: 35, Date: Mon, 02Feb 2015 07:37:50 GMT] [email protected]

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

从工具中能够看到:

Response getContentLength: 35

Response toString() length: 35

而从控制台打印出来的内容:

原始数据的大小为:300

压缩后的数据的大小为:35

浏览器具备了自我解压的能力,数据在传输过程中被压缩,降低了带宽的使用。

时间: 2024-08-30 10:10:31

好记性不如烂笔头16-http协议(2)和页面数据压缩传递的相关文章

从“好记性不如烂笔头”“记问之学不足为人师”到“一事不知是我之耻”

“好记性不如烂笔头”错在一笔记容易丢失,二考验随时发生而笔记常不随身.因此记到大脑里最可靠. “记问之学不足为人师”错在低估记忆力的作用而盲目推崇推理逻辑,这像不打地基盖楼,要不不牢靠要不会垮. “一事不知是我之耻”这是一种认真积极的态度,这样才能应付随时出现的挑战. 2017年3月12日00:34:22

Python学习中的随笔,好记性不如烂笔头

本文 为博主看了 vamei 的blog 写下的随笔 . 致敬Vamei 1.type()   可以显示参数的类型 如 : a=12   type(a) 为 int 2.python的基本类型 为 int float bool string   如 int :  i=1   ,   float :  f=12.5  ,  bool : b= True  or  Flase , string :  s='Hello , word !' 使用前无需声明类型  即 动态类型 3.1序列有 tuple

好记性不如烂笔头

今天再次深刻领悟这个技能.tm竟然忘记博客园的用户名了.... 好记性不如烂笔头,布布扣,bubuko.com

开篇记(好记性不如烂笔头)

入园两年零三个月,我居然没有一点东西记载下来实在是不应该. 爷爷曾经告诉过我,好记性不如烂笔头.他告诉了我最鲜明的例子.爷爷的脑子一直很好用,记性也是比常人好上一些,当然这也直接导致了爷爷的性格很是高傲.爷爷年轻的时候喜欢舞文弄墨什么的,所以呢每逢人家红白喜事的时候都会去人家及里面瞅上一眼,看看人家送上的喜联或者挽联.有此爱好的还有我的一个另一个宋爷爷,他们经常约好一起的.爷爷老是自信于强悍的记忆能力,每次都是记在脑子中,而宋爷爷却每次都将那些很好的对联记载一个小本子上面.如今爷爷年纪越来越大,

好记性不如烂笔头89-spring3学习(10)-spring3常用schema(持续整理)

Spring3有很多的schema,这些schema对应很多不同的功能.使用这些常用的schema,能让我们避免重复发明轮子,提高我们的开发效率. 我以为这是一个很常见的信息,到网上随便整理下就能完成,可能用的关键词不对,怎么找也没有找到相对比较全面的. 正所谓,好记性不如烂笔头,自己动手把自己能收集到的整理下来,以后需要找资料也能方便点. spring-beans-3.0.xsd 用途:spring3最主要的schema,用于配置bean 命名空间: http://www.springfram

好记性不如烂笔头48-java拦截器-JDK自带动态代理和CGLIB效率比较(3)

Java中自带的动态代理的类必须要实现一个接口,而且据说使用反射的效率也并不是很高.于是CGLIB就诞生了. 使用CGLib实现动态代理,完全不受代理类必须实现接口的限制,而且CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理类,理论上比使用Java反射效率要高. 那么我们测试下,这个运行的效率如何. 1. 测试的准备情况 准备1:好记性不如烂笔头46-java拦截器-彻底理解动态代理的概念(1) http://blog.csdn.net/ffm83/article/details/

博客开通啦,好记性不如烂笔头

好记性不如烂笔头,勤能补拙.2016年,我即将步入工作,结束十多年的学生生活.如果说,人生每一个阶段都是一个新的开始,那么,今年又是我新生的一年. 新年新希望, 第一:希望自己能够工作顺利,在自己的岗位上做一个称职又出色的员工 第二:希望自己能够每天都开开心心的 第三:努力变美,努力减肥.多读书,多看报,少吃零食多运动- 第四:努力学习.学习才能使自己更上一层楼,才能让自己实现自己的愿望,学无止境,自制,坚持,总结,记录. 第五:希望家人和朋友们都开开心心的,心想事成万事如意. 第六:希望,我和

好记性不如烂笔头(零)

俗话说,好记性不如烂笔头! 在平常的开发工作中,很多时候我们都会用到一些代码量比较小,但是却很有用的功能,但是,都只是写过就算,下一次再想起来用的时候,已经不知道该去哪儿找了. 常常因为这些小点而浪费时间,也随着年纪渐长,智商有限,还是靠记下来,以备不时之需呀. 获取圆形图片 /** * bitmap 要进行剪裁的位图 * size 剪裁的圆形图片的大小 */ public static Bitmap getCroppedRoundBitmap(Bitmap bitmap, int size)

【好记性不如烂笔头】常用的图片 文件格式 和 纹理格式

[好记性不如烂笔头]常用的图片 文件格式 和 纹理格式 1,常用的图片文件格式: bmp ( window 下通用格式 Bitmap 除了深度可选,不采用任何压缩) gif (一种基于LZW算法的连续色调的无损压缩格式 压缩率在50%) jpeg(非常流行的图像格式,有损压缩 ,不支持透明像素 ,压缩比较大 ) png(和jpg类似,压缩比高于gif ,支持透明度,无损压缩 ) 2,常用的纹理格式: R5G6B5, A4R4G4B4, A1R5G5B5, R8G8B8, A8R8G8B8 pvr