【问题标题】:Java: Using Gson in an Applet causes SecurityExceptionJava:在 Applet 中使用 Gson 会导致 SecurityException
【发布时间】:2010-10-03 17:46:27
【问题描述】:

我正在尝试在我的 Java 小程序中使用 Google Gson,但是当我这样做时,我得到了

线程“Thread-19”中的异常 java.security.AccessControlException:访问被拒绝 (java.lang.reflect.ReflectPermission suppressAccessChecks) 在 java.security.AccessControlContext.checkPermission(AccessControlContext.java:323) 在 java.security.AccessController.checkPermission(AccessController.java:546) 在 java.lang.SecurityManager.checkPermission(SecurityManager.java:532) 在 java.lang.reflect.AccessibleObject.setAccessible(AccessibleObject.java:74) 在 com.google.gson.MappedObjectConstructor.getNoArgsConstructor(MappedObjectConstructor.java:85) 在 com.google.gson.MappedObjectConstructor.constructWithNoArgConstructor(MappedObjectConstructor.java:62) 在 com.google.gson.MappedObjectConstructor.construct(MappedObjectConstructor.java:53) 在 com.google.gson.JsonObjectDeserializationVisitor.constructTarget(JsonObjectDeserializationVisitor.java:40) 在 com.google.gson.JsonDeserializationVisitor.getTarget(JsonDeserializationVisitor.java:56) 在 com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:109) 在 com.google.gson.JsonDeserializationContextDefault.fromJsonObject(JsonDeserializationContextDefault.java:73) 在 com.google.gson.JsonDeserializationContextDefault.deserialize(JsonDeserializationContextDefault.java:51) 在 com.google.gson.Gson.fromJson(Gson.java:495) 在 com.google.gson.Gson.fromJson(Gson.java:444) 在 com.google.gson.Gson.fromJson(Gson.java:396) 在 com.google.gson.Gson.fromJson(Gson.java:372) 在 org.jblux.client.network.GsonParser$1.run(GsonParser.java:32) 在 java.security.AccessController.doPrivileged(本机方法) 在 org.jblux.client.network.GsonParser.parseJson(GsonParser.java:36) 在 org.jblux.client.network.PlayerDataFactory.getDataFromBase64(PlayerDataFactory.java:36) 在 org.jblux.client.states.MainMenuState.update(MainMenuState.java:155) 在 java.util.Observable.notifyObservers(Observable.java:142) 在 org.jblux.client.network.ResponseWaiter.responseReceived(ResponseWaiter.java:33) 在 org.jblux.client.network.ServerListener.notify_observers(ServerCommunicator.java:236) 在 org.jblux.client.network.ServerListener.doCommand(ServerCommunicator.java:252) 在 org.jblux.client.network.ServerListener.run(ServerCommunicator.java:218)

我在这里找到了另外两个相关问题。
GSON on Google App Engine throws a Security Exception
Reflection Permission problems when using the GSON library in a applet

但他们都没有给我答案。一个刚刚说不要使用 Gson。
有什么方法可以授予我的小程序反射权限?

更新:我正在将我的应用程序切换为使用 JNLP 文件和 Java Web Start,因为我无法弄清楚如何使 Applet 工作。我会留下这个问题,以防有人弄清楚,但如果你不想放弃 Gson,使用 JNLP 可能是唯一的选择。

【问题讨论】:

  • 第二个相关问题的答案之一建议签署小程序或执行PrivilegedAction。您尝试过其中一种吗?
  • 是的,我的小程序一直是签名的,我尝试了 PrivelagedAction 的东西,但没有奏效。 PrivelagedAction 甚至出现在我发布的回溯中。
  • 在堆栈跟踪的后期调用了 setAccessible。您的无参数构造函数的可见性是什么?如果还没有,请尝试将其设置为公开,看看是否可以让您通过此操作。如果已经公开,可能需要向 GSON 人员提交错误,以便在已经可见时不更改可访问性。

标签: java gson securityexception


【解决方案1】:

我使用自定义解串器解决了这个问题。

我有一个有两个成员的类,一个时间戳和一个双打列表。这是对我有用的代码。

GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.registerTypeAdapter(TimestampedValueList.class, new JsonDeserializer<TimestampedValueList>() {
        @Override
        public TimestampedValueList deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
            long timestampMs = json.getAsJsonObject().get("timestampMs").getAsLong();
            double[] valueList = context.deserialize(json.getAsJsonObject().get("valueList"), double[].class);
            return new TimestampedValueList(timestampMs, valueList);
        }
    });
gson = gsonBuilder.create();

希望这可以帮助任何人!

【讨论】:

    【解决方案2】:

    我找到了答案here

    System.setSecurityManager(null);
    

    添加到 static main 帮助了我。当然,jnlp等中的all-permissions是必须的。

    【讨论】:

      【解决方案3】:

      除了@Chrizzz,我正在Java Web 服务器和未签名的小程序之间进行两种方式的命令对象交换。因此,我在我的小程序代码中同时使用 Gson toJson() 和 fromJson()。

      我发现未签名小程序中的反序列化和序列化都会引发安全异常,而实现自定义序列化程序和反序列化程序可以解决这些问题。

      最大的痛苦是无法模拟小程序环境 (SecurityManager) 进行单元测试。似乎没有可用的框架来执行此操作:参见例如 How to unit test Java code that is expected to run within an applet Security Manager

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多