解析Tomcat 6、7在EL表达式解析时存在的一个Bug

解析Tomcat 6、7在EL表达式解析时存在的一个Bug

背景

在使用Tomcat 6或7的过程中,若使用EL表达式进行解析,会出现下标访问时数组越界的问题。比如在表达式${array[1]}中,即使数组array的长度不足2,Tomcat也不会抛出越界异常,而是返回null。

原因

这是由于Tomcat在解析EL表达式时采用了JSP规范中的解析方式,即调用了数组的get()方法获取元素,而非直接访问数组。对于下标越界的情况,该get()方法规定返回null,并不会抛出异常。因此,Tomcat在解析表达式时也按照这种规范处理了下标越界的情况。

解决方法

解决这个问题的方法有两种:

  1. 升级Tomcat版本。Tomcat 8及以后的版本已经修复了这个Bug,可以直接使用。

  2. 自定义EL表达式解析器。通过自定义EL表达式解析器,可以实现对下标越界的检查。具体步骤如下:

  3. 实现ELResolver接口,重写getValue()方法,在该方法中间接调用数组的get()方法获取元素。

  4. 将该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技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • JAVA遍历map的几种实现方法代码

    Java中,Map是一种常用的数据结构,它可以存储键值对,因此常用来存储一些配置信息等数据。在实际应用中,我们经常需要遍历Map中的元素,本文将介绍几种Java遍历Map的实现方法,以及它们的代码示例。 1. Map.entrySet() Map.entrySet()方法将Map中的每个键值对映射都转换为一个Entry对象,并将这些Entry对象存储在一个S…

    Java 2023年5月19日
    00
  • springsecurity 企业微信登入的实现示例

    下面就详细讲解如何实现“spring security 企业微信登录”的攻略。 概述 企业微信登录是企业内部应用中常见的一种登录方式,通过企业微信统一授权登录,可以实现企业内部员工对应用的授权验证,保证内部应用的安全性。本文将以Spring Security框架为基础,介绍如何实现企业微信登录。 步骤 1. 创建企业微信应用和测试用户 首先需要在企业微信后台…

    Java 2023年6月3日
    00
  • java连接mysql底层封装详解

    Java连接MySQL是Java Web开发中最重要的一个环节。为了方便开发,我们通常会使用Maven或Gradle等构建工具引入一些常用的Java数据库连接库,如JDBC或MyBatis等。这些库本质上都是对Java JDBC API的封装,它们封装了大量的底层API,使我们能够更加方便地操作数据库。本文将围绕着Java连接MySQL展开,对其底层封装进行…

    Java 2023年5月19日
    00
  • Fixie.js 自动填充内容的插件

    Fixie.js 是一个用于自动填充表单内容的 JavaScript 插件,可以自动填充表单、日期、时间等多种类型的数据。下面是使用 Fixie.js 的详细攻略: 第一步:引入 Fixie.js 将 Fixie.js 文件下载到本地,并在 HTML 中引入该文件,代码如下: <script src="path/to/fixie.js&quo…

    Java 2023年6月15日
    00
  • java基于servlet的文件异步上传

    Java基于Servlet的文件异步上传是一种常见的Web开发技术,本文将详细讲解其完整攻略,包括前台页面设计、后端代码编写及实现文件上传效果的示例代码。 1. 前台页面设计 在前台设计中,需要使用HTML、JavaScript和CSS完成文件上传页面。其中,HTML中主要包括file组件、上传按钮、进度条等,JavaScript控制上传进度和上传结果,CS…

    Java 2023年5月19日
    00
  • jsp ${param.id}用法

    JSP ${param.id}用法 JSP,即Java Server Pages,是一种在HTML页面中插入Java代码的技术。${param.id}是其中非常实用的一种用法,可以将从浏览器发起的GET或POST请求中携带的参数值展示在页面上。 基本用法 在JSP页面中可以使用${param.id}的语法来获取请求参数中“id”的值。例如,如果当前请求的UR…

    Java 2023年6月15日
    00
  • SpringMVC Json自定义序列化和反序列化的操作方法

    SpringMVC Json自定义序列化和反序列化的操作方法 在SpringMVC中,我们可以使用注解@ResponseBody将一个Java对象转换为JSON格式的字符串进行传输,但是在某些场景下,我们可能需要对Java对象进行自定义的序列化和反序列化操作,以满足特定的需求。 自定义序列化 自定义序列化的实现,一般通过实现Spring提供的JsonSeri…

    Java 2023年5月26日
    00
  • Spring MVC学习笔记之Controller查找(基于Spring4.0.3)

    以下是关于“Spring MVC学习笔记之Controller查找(基于Spring4.0.3)”的完整攻略,其中包含两个示例。 Spring MVC学习笔记之Controller查找(基于Spring4.0.3) 在Spring MVC中,Controller是处理HTTP请求的核心组件。在本文中,我们将讲解如何在Spring MVC中查找Controll…

    Java 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部