技术开发 频道

如何处理Web服务异常

    容器安全的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;

    }

    测试显示了defensiveStringDivide(…)Web方法的行为:正面测试显示,Web服务对输入数值进行了正常的除法; 如果输入了零除数,像defensiveDivide(…)一样,该方法也是表现正常,不会发送带堆栈跟踪的SOA错误。该方法恰当地返回零值给Web服务使用者; 如果被除数或者除数什么也没有输入,或者输入非数值字符,该方法就会试图转换它,但转换失败,catch代码块会处理异常,然后返回零值。

    defensiveStringDivide()方法比前两种方法来得严格。该方法可以显式防范用户输入随意的非数字值。它可以控制异常处理,并且防止利用非数值输入生成堆栈跟踪。借助防御性编码,编程人员就可以通过容器的异常处理结构来防止信息泄漏。使用这种防御性方法可以降低通过Web服务途径提取程序、解析程序和容器内部的可能性。

0
相关文章