热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

客户端HttpClient4处理ServletGzip后的内容

1、服务器端servlet代码:protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresp

1、服务器端servlet代码:

protected void doPost(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));
    }

通过判断http的header中accept-encoding 是否为gzip(表明客户端支持gzip解压,服务端可以使用gzip进行数据压缩),对返回的数据进行gzip压缩。

部署后,浏览器上访问可以得到如下内容:

中文测试this is a test!

通过抓包可以发现:


浏览器默认发送的request请求中会携带aeecpt-encoding gzip信息(现代浏览器都支持gzip解压)


2、客户端代码:

package nc.edu.nuc.utils;

import java.io.IOException;
import java.nio.charset.Charset;

import org.apache.http.Header;
import org.apache.http.HeaderElement;
import org.apache.http.HttpEntity;
import org.apache.http.HttpException;
import org.apache.http.HttpRequest;
import org.apache.http.HttpRequestInterceptor;
import org.apache.http.HttpResponse;
import org.apache.http.HttpResponseInterceptor;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.GzipDecompressingEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.EntityUtils;


@SuppressWarnings("deprecation")
public class HttpInterceptorUtil {
	private static DefaultHttpClient httpclient = new DefaultHttpClient();  
	
	static {
		httpclient.addRequestInterceptor(new HttpRequestInterceptor() {
			public void process(final HttpRequest request, final HttpContext arg1)
					throws HttpException, IOException {
				if (!request.containsHeader("Accept-Encoding")) {
					request.addHeader("Accept-Encoding", "gzip");
				}
			}
		});
		
		/*httpclient.addResponseInterceptor(new HttpResponseInterceptor() {  
	           public void process(  
	                   final HttpResponse response,   
	                   final HttpContext context) throws HttpException, IOException {  
	               HttpEntity entity = response.getEntity();  
	               Header ceheader = entity.getContentEncoding();  
	               if (ceheader != null) {  
	                   HeaderElement[] codecs = ceheader.getElements();  
	                   for (int i = 0; i  
 
1)httpClient支持拦截器,我们队client添加了request和response两个拦截器,request拦截器目的是在http header中添加content-encoding gzip信息,方便告诉服务端可以使用gzip压缩,客户端支持解压;response拦截器目的是对gzip数据进行解压。

2)如果把response拦截器注释掉,返回的数据就是乱码:

executing request http://localhost:8080/WebTest/SendAndGzipServlet
----------------------------------------
HTTP/1.1 200 OK
Content-Encoding: gzip
Content-Length: 46
----------------------------------------
?



推荐阅读
  • 前端技术分享——利用Canvas绘制鼠标轨迹
    作为一名前端开发者,我已经积累了Vue、React、正则表达式、算法以及小程序等方面的技能,但Canvas一直是我的盲区。因此,我在2018年为自己设定了一个新的学习目标:掌握Canvas,特别是如何使用它来创建CSS3难以实现的动态效果。 ... [详细]
  • 深入理解SAP Fiori及其核心概念
    本文详细介绍了SAP Fiori的基本概念、发展历程、核心特性、应用类型、运行环境以及开发工具等,旨在帮助读者全面了解SAP Fiori的技术框架和应用场景。 ... [详细]
  • 正在学习操作系统开发,遇到一个内核在GRUB Legacy(0.97)中无法成功引导的问题。具体表现为输入内核命令后显示错误信息,尝试引导时GRUB挂起。 ... [详细]
  • 本文探讨了在使用 ClickOnce 部署方式时遇到的自动更新失败问题,包括本地安装与服务器安装的不同表现,并提供了详细的解决方案。 ... [详细]
  • Web网络基础
    目录儿1使用HTTP协议访问Web2HTTP的诞生2.1因特网的起源2.2互联网、因特网与万维网2.3万维网与HTTP3网络基础TCPIP3.1TCPIP协议族3.2TCPIP的分 ... [详细]
  • 深入解析轻量级数据库 SQL Server Express LocalDB
    本文详细介绍了 SQL Server Express LocalDB,这是一种轻量级的本地 T-SQL 数据库解决方案,特别适合开发环境使用。文章还探讨了 LocalDB 与其他轻量级数据库的对比,并提供了安装和连接 LocalDB 的步骤。 ... [详细]
  • 解决宝塔面板Nginx反向代理缓存问题
    本文介绍如何在宝塔控制面板中通过编辑Nginx配置文件来解决反向代理中的缓存问题,确保每次请求都能从服务器获取最新的数据。 ... [详细]
  • 深入解析Nacos服务自动注册机制
    本文将探讨Nacos服务自动注册的具体实现方法,特别是如何通过Spring事件机制完成服务注册。通过对Nacos源码的详细分析,帮助读者理解其背后的原理。 ... [详细]
  • 在尝试通过自定义端口部署Spring Cloud Eureka时遇到了连接失败的问题。本文详细描述了问题的现象,并提供了有效的解决方案,以帮助遇到类似情况的开发者。 ... [详细]
  • 本文详细介绍了如何利用go-zero框架从需求分析到最终部署至Kubernetes的全过程,特别聚焦于微服务架构中的网关设计与实现。项目采用了go-zero及其生态组件,涵盖了从API设计到RPC调用,再到生产环境下的监控与维护等多方面内容。 ... [详细]
  • 本文详细介绍了如何在不同操作系统中设置 Node.js 的环境变量,包括通过命令行、npm 脚本以及直接在代码中设置的方法。 ... [详细]
  • 本文介绍了一个基本的同步Socket程序,演示了如何实现客户端与服务器之间的简单消息传递。此外,文章还概述了Socket的基本工作流程,并计划在未来探讨同步与异步Socket的区别。 ... [详细]
  • Kubernetes 实践指南:初次体验
    本文介绍了如何通过官方提供的简易示例,快速上手 Kubernetes (K8S),并深入理解其核心概念和操作流程。 ... [详细]
  • Kubernetes Services详解
    本文深入探讨了Kubernetes中的服务(Services)概念,解释了如何通过Services实现Pods之间的稳定通信,以及如何管理没有选择器的服务。 ... [详细]
  • 个人博客:打开链接依赖倒置原则定义依赖倒置原则(DependenceInversionPrinciple,DIP)定义如下:Highlevelmo ... [详细]
author-avatar
坚强的浅悠轩_871
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有