当前位置: 代码迷 >> Web前端 >> weblogic上Content-Length设置有误引起java.net.ProtocolException
  详细解决方案

weblogic上Content-Length设置有误引起java.net.ProtocolException

热度:499   发布时间:2012-08-22 09:50:35.0
weblogic下Content-Length设置有误引起java.net.ProtocolException

?? ? 问题描述:

?? ? ? ?公司平台中的附件组件,部署在Tomcat下上传、下载均没有问题,等到将代码部署到weblogic中时,下载附件时有时候会出现java.net.ProtocolException,有时候附件可正常下载。

?? ? ? 问题分析:

在异常信息中提示响应头中的Content-Length 与实际传输的字节长度不一致。但有的附件却可以正常下载,因此,问题应该出在响应输出流的字节数与Content-Length中设置的大小不一致。但有的附件却可以正常下载,也就是说有一些附件的实际输出字节数与Content-Length中的一致。

?? ? ? ?相同的问题曾经出现在我编写的MD5工具中,即我自己编写的工具根据文件生成的MD5值与其他工具生成的不一致,造成原因是我更新MD5时没有根据实际读入的字节数组长度,而是以缓存的字节数组固定长度进行更新的,因此问题就出现在了缓存数组的大小与实际读入(写出)的字节长度不一致,下面用代码进行说明:

?? ?错误代码:

?

				
                              byte bufferArray[]=new byte[10240];
				if(fis!=null)
				{
					while(fis.read(bufferArray)!=-1)
					{
						fos.write(bufferArray);
					}
				}

?

?? 上面的代码没有根据实际读入的大小进行输出,因此在输出时,由于读入的文件大小不是缓存数据大小的整数倍,就会造成实际输出的字节长度大于文件的实际长度,与相应头中设置的Content-Length不一致,下载报错。

?? ?但如果附件的长度恰恰是缓存数组长度的整数倍,则实际输出长度与Content-Length一致,下载不会报错。

?? ?至于Tomcat下没有问题而Weblogic下有问题,应该是weblogic对相应的校验比Tomcat严格所致。

?? ? ?问题解决:

?? ? ? 在输出时按照实际读入的字节数组长度进行输出,问题解决。

?? ? ? 具体代码:

?? ? ??

				byte bufferArray[]=new byte[10240];
				if(fis!=null)
				{
					int byteLength=fis.read(bufferArray);
					while(byteLength!=-1)
					{
						fos.write(bufferArray,0,byteLength);
						byteLength=fis.read(bufferArray);
					}
				}
?
  相关解决方案