Просмотр исходного кода

优化 ognl 高版本出现bug

java110 лет назад: 4
Родитель
Сommit
9aece31b17

+ 113 - 0
java110-service/src/main/java/com/java110/service/smo/impl/DefaultMemberAccess.java

@@ -0,0 +1,113 @@
+package com.java110.service.smo.impl;
+
+import org.apache.ibatis.ognl.MemberAccess;
+
+import java.lang.reflect.AccessibleObject;
+import java.lang.reflect.Member;
+import java.lang.reflect.Modifier;
+import java.util.Map;
+
+/**
+ * This class provides methods for setting up and restoring
+ * access in a Field.  Java 2 provides access utilities for setting
+ * and getting fields that are non-public.  This object provides
+ * coarse-grained access controls to allow access to private, protected
+ * and package protected members.  This will apply to all classes
+ * and members.
+ *
+ * @author Luke Blanshard (blanshlu@netscape.net)
+ * @author Drew Davidson (drew@ognl.org)
+ * @version 15 October 1999
+ */
+public class DefaultMemberAccess implements MemberAccess {
+    public boolean allowPrivateAccess = false;
+    public boolean allowProtectedAccess = false;
+    public boolean allowPackageProtectedAccess = false;
+
+    /*===================================================================
+        Constructors
+      ===================================================================*/
+    public DefaultMemberAccess(boolean allowAllAccess) {
+        this(allowAllAccess, allowAllAccess, allowAllAccess);
+    }
+
+    public DefaultMemberAccess(boolean allowPrivateAccess, boolean allowProtectedAccess, boolean allowPackageProtectedAccess) {
+        super();
+        this.allowPrivateAccess = allowPrivateAccess;
+        this.allowProtectedAccess = allowProtectedAccess;
+        this.allowPackageProtectedAccess = allowPackageProtectedAccess;
+    }
+
+    /*===================================================================
+        Public methods
+      ===================================================================*/
+    public boolean getAllowPrivateAccess() {
+        return allowPrivateAccess;
+    }
+
+    public void setAllowPrivateAccess(boolean value) {
+        allowPrivateAccess = value;
+    }
+
+    public boolean getAllowProtectedAccess() {
+        return allowProtectedAccess;
+    }
+
+    public void setAllowProtectedAccess(boolean value) {
+        allowProtectedAccess = value;
+    }
+
+    public boolean getAllowPackageProtectedAccess() {
+        return allowPackageProtectedAccess;
+    }
+
+    public void setAllowPackageProtectedAccess(boolean value) {
+        allowPackageProtectedAccess = value;
+    }
+
+    /*===================================================================
+        MemberAccess interface
+      ===================================================================*/
+    public Object setup(Map context, Object target, Member member, String propertyName) {
+        Object result = null;
+
+        if (isAccessible(context, target, member, propertyName)) {
+            AccessibleObject accessible = (AccessibleObject) member;
+
+            if (!accessible.isAccessible()) {
+                result = Boolean.FALSE;
+                accessible.setAccessible(true);
+            }
+        }
+        return result;
+    }
+
+    public void restore(Map context, Object target, Member member, String propertyName, Object state) {
+        if (state != null) {
+            ((AccessibleObject) member).setAccessible(((Boolean) state).booleanValue());
+        }
+    }
+
+    /**
+     * Returns true if the given member is accessible or can be made accessible
+     * by this object.
+     */
+    public boolean isAccessible(Map context, Object target, Member member, String propertyName) {
+        int modifiers = member.getModifiers();
+        boolean result = Modifier.isPublic(modifiers);
+
+        if (!result) {
+            if (Modifier.isPrivate(modifiers)) {
+                result = getAllowPrivateAccess();
+            } else {
+                if (Modifier.isProtected(modifiers)) {
+                    result = getAllowProtectedAccess();
+                } else {
+                    result = getAllowPackageProtectedAccess();
+                }
+            }
+        }
+        return result;
+    }
+
+}

+ 4 - 1
java110-service/src/main/java/com/java110/service/smo/impl/QueryServiceSMOImpl.java

@@ -18,6 +18,7 @@ import com.java110.utils.util.Assert;
 import com.java110.utils.util.StringUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.ibatis.ognl.Ognl;
+import org.apache.ibatis.ognl.OgnlContext;
 import org.apache.ibatis.ognl.OgnlException;
 import org.dom4j.DocumentException;
 import org.dom4j.DocumentHelper;
@@ -449,7 +450,9 @@ public class QueryServiceSMOImpl extends LoggerEngine implements IQueryServiceSM
 
             Object condObj = Ognl.parseExpression(condition);
 
-            Object value = Ognl.getValue(condObj, requestParams);
+            OgnlContext context = new OgnlContext(null,null,new DefaultMemberAccess(true));
+
+            Object value = Ognl.getValue(condObj,context, requestParams);
 
             if (value instanceof Boolean) {
                 conditionResult = (Boolean) value;