解析Tomcat 6、7在EL表达式解析时存在的一个Bug
背景
在使用Tomcat 6或7的过程中,若使用EL表达式进行解析,会出现下标访问时数组越界的问题。比如在表达式${array[1]}
中,即使数组array
的长度不足2,Tomcat也不会抛出越界异常,而是返回null。
原因
这是由于Tomcat在解析EL表达式时采用了JSP规范中的解析方式,即调用了数组的get()
方法获取元素,而非直接访问数组。对于下标越界的情况,该get()
方法规定返回null,并不会抛出异常。因此,Tomcat在解析表达式时也按照这种规范处理了下标越界的情况。
解决方法
解决这个问题的方法有两种:
-
升级Tomcat版本。Tomcat 8及以后的版本已经修复了这个Bug,可以直接使用。
-
自定义EL表达式解析器。通过自定义EL表达式解析器,可以实现对下标越界的检查。具体步骤如下:
-
实现
ELResolver
接口,重写getValue()
方法,在该方法中间接调用数组的get()
方法获取元素。 - 将该EL解析器配置到Tomcat的
context.xml
文件中。
示例1
对于以下EL表达式:
${array[1]}
如果array
长度不足2,Tomcat将不会抛出越界异常,而是返回null。
示例2
自定义EL表达式解析器的示例代码:
public class MyELResolver extends ELResolver {
@Override
public Object getValue(ELContext context, Object base, Object property) {
if (base != null && base.getClass().isArray() && property instanceof Integer) {
int index = (Integer) property;
Object[] array = (Object[]) base;
if (index < 0 || index >= array.length) {
context.setPropertyResolved(true);
throw new IndexOutOfBoundsException();
}
context.setPropertyResolved(true);
return array[index];
}
return null;
}
//...其他方法的实现
}
在Tomcat的context.xml
文件中配置自定义EL解析器:
<Context>
<!-- Other configurations -->
<ELResolver>com.example.MyELResolver</ELResolver>
</Context>
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:解析Tomcat 6、7在EL表达式解析时存在的一个Bug - Python技术站