容器安全的Web服务
下面,相除方法经过了改动,把字符串值作为输入值,而不是前几个例子中所预料的双精度值。这样,开发人员就可以通过编码来控制输入值的正确性,而不是让方法抛出运行时异常、让容器去处理。如果让容器来处理异常,编程人员就失去了控制权,对编程人员可以处理的预料到的边缘条件而言更是如此。
字符串除数和被除数先用try-catch代码块转换成双精度数。如果转换不成功,catch代码块就会找出异常,返回零值。转换成功后,检查除数是不是零值; 如果值不是零,运算就成功进行。
@WebMethod
public double defensiveStringDivide(String dividend, String divisor)
{
double dDividend;
double dDivisor;
try
{
dDividend = Double.parseDouble(dividend);
dDivisor = Double.parseDouble(divisor);
}
catch (Exception e)
{
return 0;
}
if (dDivisor != 0)
return dDividend/dDivisor;
else
return 0;
}
public double defensiveStringDivide(String dividend, String divisor)
{
double dDividend;
double dDivisor;
try
{
dDividend = Double.parseDouble(dividend);
dDivisor = Double.parseDouble(divisor);
}
catch (Exception e)
{
return 0;
}
if (dDivisor != 0)
return dDividend/dDivisor;
else
return 0;
}
测试显示了defensiveStringDivide(…)Web方法的行为:正面测试显示,Web服务对输入数值进行了正常的除法; 如果输入了零除数,像defensiveDivide(…)一样,该方法也是表现正常,不会发送带堆栈跟踪的SOA错误。该方法恰当地返回零值给Web服务使用者; 如果被除数或者除数什么也没有输入,或者输入非数值字符,该方法就会试图转换它,但转换失败,catch代码块会处理异常,然后返回零值。
defensiveStringDivide()方法比前两种方法来得严格。该方法可以显式防范用户输入随意的非数字值。它可以控制异常处理,并且防止利用非数值输入生成堆栈跟踪。借助防御性编码,编程人员就可以通过容器的异常处理结构来防止信息泄漏。使用这种防御性方法可以降低通过Web服务途径提取程序、解析程序和容器内部的可能性。