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);
					}
				}
 

你可能感兴趣的:(java,tomcat,.net,weblogic)