当前位置: 首页 > 面试题库 >

当struts.ognl.allowStaticMethodAccess为false时,Struts 2调用静态方法

邵骁
2023-03-14
问题内容

撑杆2设置struts.ognl.allowStaticMethodAccessfalse,安全问题。静态方法调用在某些情况下可能很有用,例如,在验证器表达式中使用StringUtils处理基于表达式的验证器Struts2时。

解决此问题的一种方法是在操作中定义一个辅助方法,例如,如果要使用Math类,则应在下面添加:

public double randomMath(){
  return Math.random();
}


public double asinMath(double a){
  return Math.asin(a);
}

....

并将其用作${randomMath}${asinMath(1)}

如您所见,对于Math类中的每个方法,我们都需要在操作中定义一个public具有相同签名的方法。

有没有更好的方法来避免这些样板吸气剂?


问题答案:

OGNL允许执行方法,但是默认情况下禁用静态访​​问,因此您不能在表达式中使用静态方法。但是,您可以教OGNL哪些类需要访问静态方法。

[OGNL开发人员指南:方法访问器](https://commons.apache.org/proper/commons-

ognl/developer-guide.html#Method_Accessors)

方法调用是OGNL需要基于动态信息对方法进行查找的另一个领域。该MethodAccessor接口提供了有关OGNL如何调用方法的信息。当请求静态或实例方法时,将调用此接口的实现者以实际执行该方法。

public interface MethodAccessor
{

    Object callStaticMethod( Map context, Class targetClass, String

methodName, List args )
throws MethodFailedException;

    Object callMethod( Map context, Object target, String methodName,

List args )
throws MethodFailedException;

}

您可以使用逐个类地设置方法访问器OgnlRuntime.setMethodAccessor()。是Object的默认方法访问器(它仅根据方法名称和参数类型查找适当的方法,并使用反射来调用该方法)。

您可以编写一些东西

public class StringUtil extends StringUtils implements MethodAccessor {
  //implement above methods
}
public static final String MESSAGE = "hello.message";

/**
 * Field for Message property.
 */
private String message;

/**
 * Return Message property.
 *
 * @return Message property
 */
public String getMessage() {
    return message;
}
private StringUtil stringUtil = new StringUtil();

public StringUtil getStringUtil() {
  return stringUtil;
}

public String execute() throws Exception {
    setMessage(getText(MESSAGE));
    OgnlRuntime.setMethodAccessor(StringUtil.class, stringUtil);
    return SUCCESS;
}

在JSP中

<s:if test="!stringUtil.isEmpty(message)">
  <h2><s:property value="message"/></h2>
</s:if>


 类似资料:
  • Powermock为什么不模拟静态方法调用,而是在然后()语句中调用初始方法? 在这种情况下,我有一系列方法调用: TestClass方法-调用- Class4方法尝试查找上下文中不存在且挂起的对象,因此我尝试使用Powermock模拟公共静态Class3方法。 所有的类和方法都是非最终的。我使用TestNg。我的测试方法有一个@准备测试我尝试了以下方法来模拟方法调用: 或而不是当-然后返回: 或

  • 本文向大家介绍Struts2 OGNL调用公共静态方法详细介绍,包括了Struts2 OGNL调用公共静态方法详细介绍的使用技巧和注意事项,需要的朋友参考一下 Struts2 OGNL调用公共静态方法 一直以来都知道Struts2的OGNL支持在前台调用后台的静态方法,以前也用过,但用的比较少,今天自己重新开始了一个新的项目,在实现一个功能的时候用到了Struts2的在前台调用后台的静态方法,弄了

  • 问题内容: 有没有一种方法可以自动转换此静态方法调用(): 使用以下命令进行此调用: 我知道我可以按照此答案中所述使用此配置代码完成。 我的问题是关于转换 现有的 静态方法调用。理想情况下,我不想配置“收藏夹导入”。 问题答案: 将光标放在方法名称()上,然后按。 这是“添加导入”命令的默认键盘快捷键。您也可以在“源”菜单上找到该命令。

  • 我最近对 PHP 5.4 进行了更新,但收到有关静态和非静态代码的错误。 这是错误: 这是第371行: 我希望有人能帮忙。

  • 我正在使用存储库模式并尝试建立模型之间的关系。当我尝试运行存储()方法(在控制器中),该方法试图使用用户()方法(与方模型建立关系)时,我收到以下错误消息: 非静态方法不应该静态调用::user(),假设$this来自不兼容的上下文 我不明白为什么在尝试运行user()relationship方法时会出现此错误,但所有其他方法(包括$this- 以下是相关代码:

  • 问题内容: 尝试在静态类中调用非静态方法时遇到错误。 无法从类型播放中静态引用非静态方法methodName() 我不能使该方法静态,因为这也给我一个错误。 此静态方法无法从xInterface隐藏实例方法 有什么办法可以在另一个静态方法中轮回调用非静态方法?(这两种方法位于单独的包和单独的类中)。 问题答案: 从静态方法中调用非静态方法的唯一方法是使类的实例包含非静态方法。根据定义,非静态方法是