前段时间在项目中看到如下的代码:
HttpServletResponse response = (HttpServletResponse)servletResponse; response.setHeader("Transfer-Encoding", "utf8"); filterChain.doFilter(servletRequest, servletResponse);
原意是想对输出的内容进行编码,却用错了响应头,结果这个错误的响应头对后面的客户端程序带来了许多麻烦。这里有必要对这个这块的内容进行详细地了解。
传输数据编码:Transfer-Encoding
数据编码,即表示数据在网络传输当中,使用怎么样的保证方式来保证数据是安全成功地传输处理。可以是分段传输,也可以是不分段,直接使用原数据进行传输。
有效的值为:Trunked和Identity.
传输内容编码:Content-Encoding
内容编码,即整个数据信息是在数据器端经过怎样的编码处理,然后客户端会以怎么的编码来反向处理,以得到原始的内容。这里的内容编码主要是指压缩编码,即服务器端压缩,客户端解压缩。
可以参考的值为:gzip,compress,deflate和identity。
传输内容格式:Content-Type
内容格式,即接收的数据最终是以何种的形式显示在浏览器中。可以是一个图片,还是一段文本,或者是一段html。内容格式额外支持可选参数,charset,即实际内容的字符集。通过字符集,客户端可以对数据进行解编码,以最终显示可以看得懂的文字(而不是一段byte[]或者是乱码)。
3种描述信息,可以由下图来表示(来源于《Http权威指南》):
从上文中,可以看出,实际上原filter中的内容可能是想表达以下的意思:
response.setContentType("text/html;charset=UTF8"); //或者 response.setContentType("application/json;charset=UTF8");