OGNL 简介

OGNL(Object-Graph Navigation Language)是一种功能强大的表达式语言,用于访问和操作 Java 对象图的属性。它广泛应用于 Java Web 框架(如 Struts2)中,用于数据绑定、表达式求值等场景。OGNL 支持动态属性访问、方法调用、集合操作等功能,语法简洁且灵活。


OGNL 的核心功能

动态属性访问
OGNL 允许通过表达式动态访问对象的属性,支持嵌套属性访问。例如,user.address.city 可以获取 user 对象中 address 对象的 city 属性。

方法调用
OGNL 支持直接调用对象的方法。例如,user.getName() 可以通过表达式 user.nameuser.getName() 调用。

集合操作
OGNL 提供了丰富的集合操作功能,包括列表、数组、Map 的创建和访问。例如,{1, 2, 3} 创建一个列表,#{'key': 'value'} 创建一个 Map。

类型转换
OGNL 支持自动类型转换,例如将字符串转换为数字或日期类型。

Lambda 表达式
OGNL 支持简单的 Lambda 表达式,可以用于条件判断或循环操作。


OGNL 的基本语法

属性访问

user.name
user['name']
user["name"]

方法调用

user.getName()
user.setName('John')

集合操作

# 创建列表
{1, 2, 3}
# 创建 Map
#{'key1': 'value1', 'key2': 'value2'}
# 访问集合元素
list[0]
map['key1']

条件判断

user.age > 18 ? 'adult' : 'minor'

Lambda 表达式

#(x : x > 0, {1, -2, 3})

OGNL 在 Struts2 中的应用

Struts2 使用 OGNL 作为默认的表达式语言,用于数据绑定和页面渲染。以下是一些常见的使用场景:

页面数据绑定
在 JSP 页面中,可以使用 OGNL 表达式访问 Action 中的属性:

表单数据绑定
表单字段可以通过 OGNL 表达式绑定到 Action 的属性:

集合遍历
使用 OGNL 遍历集合:


    

OGNL 的安全性问题

OGNL 的强大功能也带来了潜在的安全风险,尤其是在处理用户输入时。以下是一些常见的安全问题及防范措施:

表达式注入攻击
恶意用户可能通过构造特殊的 OGNL 表达式执行任意代码。防范措施包括:

  • 避免直接使用用户输入作为 OGNL 表达式。
  • 对用户输入进行严格的过滤和验证。

禁用危险方法
通过配置 OGNL 的安全策略,禁用危险的方法调用,例如 Runtime.exec

使用沙箱环境
在沙箱环境中运行 OGNL 表达式,限制其访问权限。


OGNL 示例代码

Java 代码示例

OgnlContext context = new OgnlContext();
Object root = new User("John", 25);
Object value = Ognl.getValue("name", context, root); // 返回 "John"

Struts2 示例


    
    

总结

OGNL 是一种功能强大且灵活的表达式语言,广泛应用于 Java Web 开发中。通过掌握其核心功能和语法,可以高效地实现数据绑定和操作。同时,需要注意其安全性问题,避免潜在的风险。