防止 getText() 评估 EL 表达式
Prevent getText() evaluating EL expressions
在Struts2后端,我有一个动作class实例变量,例如:keyName
。返回查看的动态密钥(JSP).
此 keyName
变量是使用 POST 方法使用请求参数设置的。根据请求参数值,keyName
会有所不同。
在 JSP 中,我使用 <s:property value="getText(keyName)" />
来显示与 keyName 变量给定的键对应的标签。
当我发送一个 EL 表达式例如 ${90-40}
到 keyName
时,这个表达式正在被计算并导致在 UI 上显示 50。
我们怎样才能避免或防止这种 EL 注入getText()
?
除了<s:property value="getText(keyName)" />
还有其他替代方法吗?
使用<s:text name="keyName" />
您可以创建自己的文本提供程序并在 struts.xml
中注册:
<constant name="struts.xworkTextProvider" value="com.struts.text.MyTextProvier"/>
现在创建一个 class MyTextProvier
来扩展 TextProviderSupport
并覆盖 getText()
方法。所有方法都将参数 key
作为 String
,您可以从中替换不需要的字符。然后调用super.getText()
。例如
public String getText(String key) {
return super.getText(key.replaceAll("[\$\{\}]", ""));
}
在Struts2后端,我有一个动作class实例变量,例如:keyName
。返回查看的动态密钥(JSP).
此 keyName
变量是使用 POST 方法使用请求参数设置的。根据请求参数值,keyName
会有所不同。
在 JSP 中,我使用 <s:property value="getText(keyName)" />
来显示与 keyName 变量给定的键对应的标签。
当我发送一个 EL 表达式例如 ${90-40}
到 keyName
时,这个表达式正在被计算并导致在 UI 上显示 50。
我们怎样才能避免或防止这种 EL 注入getText()
?
除了<s:property value="getText(keyName)" />
还有其他替代方法吗?
使用<s:text name="keyName" />
您可以创建自己的文本提供程序并在 struts.xml
中注册:
<constant name="struts.xworkTextProvider" value="com.struts.text.MyTextProvier"/>
现在创建一个 class MyTextProvier
来扩展 TextProviderSupport
并覆盖 getText()
方法。所有方法都将参数 key
作为 String
,您可以从中替换不需要的字符。然后调用super.getText()
。例如
public String getText(String key) {
return super.getText(key.replaceAll("[\$\{\}]", ""));
}