服务端采用gzip对文本内容进行压缩处理,客户端使用HttpClient获取数据并进行gzip解压缩。

一: 服务端

public class GzipTestServlet extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setHeader("Cache-Control", "no-cache");
response.setContentType("text/html;charset=UTF-8"); String str = "中文测试this is a test!"; if (isGzipSupport(request)) {//支持gzip
response.setHeader("Content-Encoding", "gzip");
OutputStream os = response.getOutputStream();
GZIPOutputStream gs = new GZIPOutputStream(os);
gs.write(str.getBytes("UTF-8"));//解决中文乱码问题
gs.finish();
gs.close();
os.close();
} else {
PrintWriter out = response.getWriter();
out.write(str);
out.flush();
out.close();
}
} /**
* 判断客户端是否要求进行gzip压缩处理
* @param request
* @return
*/
private boolean isGzipSupport(HttpServletRequest request) {
String headEncoding = request.getHeader("accept-encoding");
return (headEncoding != null && (headEncoding.indexOf("gzip") != -1));
} @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
} @Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
}

二:客户端

  采用HttpClient3.1。

(1)UngzipPostMethod.java

/**
* 继承PostMethod重写getResponseBodyAsString方法支持Gzip解压缩*/
public class UngzipPostMethod extends org.apache.commons.httpclient.methods.PostMethod{
public UngzipPostMethod(String uri){
super(uri);
} @Override
public String getResponseBodyAsString() throws IOException {
GZIPInputStream gzin;
if(getResponseBody()!=null ||getResponseStream() != null ){
if(getResponseHeader("Content-Encoding") != null && getResponseHeader("Content-Encoding").getValue().toLowerCase().indexOf("gzip") != -1) {
InputStream is = getResponseBodyAsStream();
gzin = new GZIPInputStream(is); InputStreamReader isr = new InputStreamReader(gzin,getResponseCharSet()); BufferedReader br = new BufferedReader(isr);
StringBuilder sb = new StringBuilder();
String tmp;
while((tmp = br.readLine())!=null){
sb.append(tmp);
sb.append("\r\n");
}
br.close();
isr.close();
return sb.toString();
}else{
//否则正常返回
return super.getResponseBodyAsString();
}
}else{
return null;
}
}
}

(2)HttpUtil.java

public class HttpUtil {
/**
* 获取到解压缩的内容
* @param url
* @param list
* @return
*/
public String postGzipRequest(String url, List<NameValuePair> list){
HttpClient client = new HttpClient();
UngzipPostMethod post = new UngzipPostMethod(url);
post.setRequestHeader("Accept-Encoding", "gzip, deflate");
post.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "UTF-8");
StringBuilder sb = new StringBuilder(); if(list!=null){
int len = list.size();
NameValuePair[] params = new NameValuePair[len];
for(int i=0; i<len; i++){
params[i] = list.get(i);
}
post.setRequestBody(params);
}
try {
//执行post
int statusCode = client.executeMethod(post); if (statusCode == HttpStatus.SC_OK) {
sb.append(post.getResponseBodyAsString());
} } catch (IOException ex) {
java.util.logging.Logger.getLogger(HttpUtil.class.getName()).log(Level.SEVERE, null, ex);
}
return sb.toString();
}
}

(3)Test.java

public class Test {
public static void main(String args[]){
HttpUtil httpUtil = new HttpUtil();
String url = "http://localhost:8080/tsmanager/GzipTestServlet.do";
System.out.println("内容:"+httpUtil.postGzipRequest(url, null));
}
}

客户端HttpClient处理 Servlet Gzip的更多相关文章

  1. HttpClient学习整理

    HttpClient简介HttpClient 功能介绍    1. 读取网页(HTTP/HTTPS)内容    2.使用POST方式提交数据(httpClient3)    3. 处理页面重定向    ...

  2. android之HttpClient

    Apache包是对android联网访问封装的很好的一个包,也是android访问网络最常用的类. 下面分别讲一下怎么用HttpClient实现get,post请求. 1.Get 请求 HttpGet ...

  3. android HTTPclient

    Apache包是对android联网访问封装的很好的一个包,也是android访问网络最常用的类. 下面分别讲一下怎么用HttpClient实现get,post请求. 1.Get 请求 1 2 3 4 ...

  4. HttpClient与APS.NET Web API:请求内容的压缩与解压

    首先说明一下,这里的压缩与解压不是通常所说的http compression——那是响应内容在服务端压缩.在客户端解压,而这里是请求内容在客户端压缩.在服务端解压. 对于响应内容的压缩,一般Web服务 ...

  5. java apache commons HttpClient发送get和post请求的学习整理(转)

    文章转自:http://blog.csdn.net/ambitiontan/archive/2006/01/06/572171.aspx HttpClient 是我最近想研究的东西,以前想过的一些应用 ...

  6. httpclient模拟浏览器get\post

    一般的情况下我们都是使用IE或者Navigator浏览器来访问一个WEB服务器,用来浏览页面查看信息或者提交一些数据等等.所访问的这些页面有的仅 仅是一些普通的页面,有的需要用户登录后方可使用,或者需 ...

  7. HTTP协议 Servlet入门 Servlet工作原理和生命周期 Servlet细节 ServletConfig对象

    1 HTTP协议特点   1)客户端->服务端(请求request)有三部份     a)请求行--请求行用于描述客户端的请求方式.请求的资源名称,以及使用的HTTP协议版本号 请求行中的GET ...

  8. Android中利用httpclient进行网络通信的方法(以用户登录为例说明)

    http://www.android100.org/html/201406/09/22915.html 1.服务器端 服务器端和android没有太大关系,对J2EE比较熟悉的话写起来应该很容易,这里 ...

  9. HttpClient使用详解

    http://itindex.net/detail/52566-httpclient HttpClient使用详解 标签: httpclient | 发表时间:2015-01-22 12:07 | 作 ...

随机推荐

  1. getResources().getXml()获取xml

    获取XML文件的基本思路是,通过getResources().getXml()获的XML原始文件,得到XmlResourceParser对象,通过该对象来判断是文档的开头还是结尾,是某个标签的开始还是 ...

  2. cf D. Alternating Current

    http://codeforces.com/contest/344/problem/D #include <cstdio> #include <cstring> #includ ...

  3. Linux 下的下载文件命令

    普通文件只需 wget  fileAddr 下载带有登录验证的文件 [chen@localhost Downloads]$ wget --user='av\bname' --ask-password ...

  4. 初识lucene

    lucene的介绍网上有好多,再写一遍可能有点多余了. 使用lucene之前,有一系列的疑问 为什么lucene就比数据库快? 倒排索引是什么,他是怎么做到的 lucene的数据结构是什么样的,cpu ...

  5. 关于Yeoman使用的总结

    Yeoman由三部分组成 Yo 用于项目构建. Grunt 用于项目管理,任务制定. Bower 用于项目依赖管理. 经过一段时间的使用,对这些东西有了一些个人总结: 总体上说这些内容学习曲线略高,不 ...

  6. 【剑指offer】面试题29:数组中出现次数超过一半的数字

    题目: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...

  7. 怎样合并排序数组(How to merge 2 sorted arrays?)

    Question: We have 2 sorted arrays and we want to combine them into a single sorted array. Input: arr ...

  8. UVa10340.All in All

    题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  9. jquery.validate详解一

    jQuery校验 官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation 一导入js库 <script src=&q ...

  10. 禁用UITableViewCell 重用机制

    有时候不想让Cell重用,怎么办勒.接下来介绍两种方法 方法一 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAt ...