Java Struts 2在Struts.ognl.allowStaticMethodAccess为false时调用静态方法
struts 2将Java Struts 2在Struts.ognl.allowStaticMethodAccess为false时调用静态方法,java,reflection,struts2,ognl,valuestack,Java,Reflection,Struts2,Ognl,Valuestack,struts 2将struts.ognl.allowStaticMethodAccess设置为false,以解决安全问题。静态方法调用在某些情况下可能很有用,例如在处理表达式基验证器时 解决此问题的一种方法是在操作中定义一个helper方法,例如,如果我们想使用Math类,我们应该添加以下内容: public double randomMath(){ return Math.random(); } public double asinMath(double a){ return Ma
struts.ognl.allowStaticMethodAccess
设置为false
,以解决安全问题。静态方法调用在某些情况下可能很有用,例如在处理表达式基验证器时
解决此问题的一种方法是在操作中定义一个helper方法,例如,如果我们想使用Math
类,我们应该添加以下内容:
public double randomMath(){
return Math.random();
}
public double asinMath(double a){
return Math.asin(a);
}
....
并将其用作${randomMath}
或${asinMath(1)}
正如您可以看到的,对于Math
类中的每个方法,我们需要在我们的操作中定义一个具有相同签名的public
方法
有没有更好的方法来避免这些陈词滥调 OGNL允许执行方法,但默认情况下禁用静态访问,因此不能在表达式中使用静态方法。但是,您可以教OGNL哪些类需要访问静态方法 方法调用是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()
逐个类设置方法访问器。是对象的默认方法访问器(它只是根据方法名称和参数类型查找适当的方法,并使用反射调用该方法)
你可以编写代码
public class StringUtil extends StringUtils implements MethodAccessor {
//implement above methods
}
动作类
在JSP中
XY问题。创建自定义验证器。亲爱的@AleksandrM谢谢,但通过这种方式,我将创建许多非原子自定义验证器。正如您猜测的那样,对于自定义验证器,我需要删除
@FieldExpressionValidator
和@ExpressionValidator
,并为每个表达式创建一个自定义验证器。非原子是什么意思?可测试性。如果验证器中有复杂的条件,那么如何测试它?将它放在自定义验证器中,可以对其进行单元测试。您不必仅为复杂表达式为每个表达式创建自定义验证器。您可以创建一些更通用的验证器并用参数控制它。为什么这比struts.ognl.allowStaticMethodAccess更好?xml验证呢?您的帖子中没有它的迹象。@AleksandrMstruts.ognl.allowStaticMethodAccess
没有被这段代码使用。但是为什么这个方法比struts.ognl.allowStaticMethodAccess更好呢?你认为struts.ognl.allowStaticMethodAccess
该怎么办?@AleksandrM如果你不理解OP的问题,最好不要struts.ognl.allowStaticMethodAccess
,而是不手动编写,将所有方法委托给不能使用struts.ognl.allowStaticMethodAccess
的静态方法是错误的。
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;
}