目录
- 一、SpEL表达式概念
- 二、SpEL 的作用和应用场景
- 三、SpEL支持的功能特性
- 四、SpEL的执行机制
- ExpressionParser(表达式解析器)
- EvaluationContext(表达式上下文)
- 五、SpEL表达式使用方法
- 六、SpEL注入示例
- 七、SpEL利用的前置条件
- 八、漏洞修复
- 九、审计方法
一、SpEL表达式概念
Spring Expression Language(SpEL) 是 Spring Framework 提供的一种功能强大的表达式语言,全称为 Spring Expression Language,简称 SpEL。它类似于 Struts2 中的 OGNL 表达式语言,旨在为静态的 Java 语言增加动态执行能力,使开发者可以以一种更简洁、灵活的方式访问对象属性、调用方法、进行逻辑运算和动态赋值。
二、SpEL 的作用和应用场景
SpEL 的设计初衷是为了简化开发工作,提供一种 在运行时动态解析和执行表达式 的机制,常用于如下场景:
- 配置 Bean 的属性值(配合 @Value 注解)
- Spring Security 权限表达式
- Spring Data JPA 查询表达式
- 条件逻辑控制(如 SPEL 条件注解 @ConditionalOnExpression)
- 模板引擎中处理动态数据
- 静态方法调用或对象动态构造
举个简单例子,@Value("#{user.name}") 能让你动态从某个 Bean 中获取字段值注入到另一个 Bean 中。
SpEL 不仅支持属性访问和方法调用,还支持集合操作、正则匹配、表达式求值、对象创建等,是 Spring 应用中的通用表达式解析工具。
三、SpEL支持的功能特性
SpEL 主要支持以下操作:
功能示例描述文字表达式'hello', 123, true字符串、数字、布尔值、null属性访问person.name访问对象属性方法调用'abc'.toUpperCase()调用实例方法静态方法T(java.lang.Math).random()访问 Java 类的静态方法或字段对象创建new java.util.Date()实例化对象集合操作list[0], map['key']访问数组、List、Map关系运算符age > 18比较操作,如 >、 60 ? '及格' : '不及格'简化条件判断正则表达式'abc' matches '[a-z]+'字符串正则匹配Bean 引用@myBean引用 Spring 容器中的 Bean投影操作list.![name]从集合中提取每个元素的某个属性过滤操作list.?[age > 18]过滤集合中满足条件的元素变量引用#name, #user.age使用上下文中定义的变量模板表达式"Welcome, #{#user.name}!"与字符串模板结合生成动态字符串四、SpEL的执行机制
- ExpressionParser
- EvaluationContext
ExpressionParser(表达式解析器)
用于将字符串形式的表达式解析为 Expression 对象:- ExpressionParser parser = new SpelExpressionParser();
- Expression expr = parser.parseExpression("user.age");
复制代码 EvaluationContext(表达式上下文)
在执行表达式时提供变量、对象、函数等运行环境,简单来说,它是表达式执行的运行环境。- StandardEvaluationContext context = new StandardEvaluationContext(user);
- int age = expr.getValue(context, Integer.class);
复制代码 主要有 StandardEvaluationContext 和 SimpleEvaluationContext两种
有些老版本不支持SimpleEvaluationContext,并且如果不做特意说明的情况下,默认是使用更不安全的StandardEvaluationContext
其中StandardEvaluationContext功能最强大,支持SpEL的所有特性,而SimpleEvaluationContext功能受限,专为安全场景设计
[table][tr]功能类别StandardEvaluationContext ✅SimpleEvaluationContext
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |