Java:在 Applet 中使用 Gson 会导致 SecurityException
我正在尝试在我的 Java Applet 中使用 Google Gson,但是当我这样做时,我得到了
线程“Thread-19”中出现异常 java.security.AccessControlException:访问被拒绝(java.lang.reflect.ReflectPermission suggestAccessChecks) 在 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)
我在这里发现了另外两个相关问题。
Google App Engine 上的 GSON 引发安全异常< br> 在应用程序中使用 GSON 库时的反射权限问题applet
但他们都没有给我答案。刚刚有人说不要使用Gson。
有什么方法可以向我的小程序授予反射权限吗?
更新:我正在将我的应用程序切换为使用 JNLP 文件和 Java Web Start,因为我无法弄清楚如何使 Applet 工作。我将保留这个问题,以防有人弄清楚,但如果您不想放弃 Gson,使用 JNLP 可能是唯一的选择。
I'm trying to use Google Gson in my Java Applet, but when I do I get
Exception in thread "Thread-19" java.security.AccessControlException: access denied (java.lang.reflect.ReflectPermission suppressAccessChecks)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
at java.security.AccessController.checkPermission(AccessController.java:546)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.reflect.AccessibleObject.setAccessible(AccessibleObject.java:74)
at com.google.gson.MappedObjectConstructor.getNoArgsConstructor(MappedObjectConstructor.java:85)
at com.google.gson.MappedObjectConstructor.constructWithNoArgConstructor(MappedObjectConstructor.java:62)
at com.google.gson.MappedObjectConstructor.construct(MappedObjectConstructor.java:53)
at com.google.gson.JsonObjectDeserializationVisitor.constructTarget(JsonObjectDeserializationVisitor.java:40)
at com.google.gson.JsonDeserializationVisitor.getTarget(JsonDeserializationVisitor.java:56)
at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:109)
at com.google.gson.JsonDeserializationContextDefault.fromJsonObject(JsonDeserializationContextDefault.java:73)
at com.google.gson.JsonDeserializationContextDefault.deserialize(JsonDeserializationContextDefault.java:51)
at com.google.gson.Gson.fromJson(Gson.java:495)
at com.google.gson.Gson.fromJson(Gson.java:444)
at com.google.gson.Gson.fromJson(Gson.java:396)
at com.google.gson.Gson.fromJson(Gson.java:372)
at org.jblux.client.network.GsonParser$1.run(GsonParser.java:32)
at java.security.AccessController.doPrivileged(Native Method)
at org.jblux.client.network.GsonParser.parseJson(GsonParser.java:36)
at org.jblux.client.network.PlayerDataFactory.getDataFromBase64(PlayerDataFactory.java:36)
at org.jblux.client.states.MainMenuState.update(MainMenuState.java:155)
at java.util.Observable.notifyObservers(Observable.java:142)
at org.jblux.client.network.ResponseWaiter.responseReceived(ResponseWaiter.java:33)
at org.jblux.client.network.ServerListener.notify_observers(ServerCommunicator.java:236)
at org.jblux.client.network.ServerListener.doCommand(ServerCommunicator.java:252)
at org.jblux.client.network.ServerListener.run(ServerCommunicator.java:218)
There were two other related questions I found here.
GSON on Google App Engine throws a Security Exception
Reflection Permission problems when using the GSON library in a applet
But neither of them had an answer for me. One just said to not use Gson.
Is there any way to grant Reflection permission to my applet?
Update: I'm in the process of switching my application to use JNLP file and Java Web Start because I haven't been able to figure out how to make the Applet work. I'll leave this question open in case anybody figures it out, but using a JNLP may be the only option if you don't want to give up Gson.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我使用自定义解串器解决了这个问题。
我的班级有两名成员,一个时间戳和一个双打列表。这是对我有用的代码。
希望这可以帮助任何人!
I solved this problem using a custom deserializer.
I had a class with two members, a timestamp and a list of doubles. This is the code that worked for me.
Hope this can help anyone!
我在此处找到了答案。
添加到 static main 帮助了我。当然jnlp等的所有权限都是必须的。
I have found the answer here.
Adding to static main helped me. Of course, all-permissions in jnlp and so on must be.
进一步@Chrizzz,我正在 Java Web 服务器和未签名的小程序之间进行两种方式的命令对象交换。因此,我在小程序代码中同时使用 Gson toJson() 和 fromJson() 。
我发现未签名小程序中的反序列化和序列化都会引发安全异常,并且实现自定义序列化程序和反序列化程序可以解决这些问题。
最大的痛苦是无法模拟小程序环境(SecurityManager)进行单元测试。似乎没有可用的框架来执行此操作:参见例如
如何对预计在小程序安全管理器中运行的 Java 代码进行单元测试
Further to @Chrizzz, I'm doing two way command object exchange between a Java web server and an unsigned applet. As such I am using both Gson toJson() and fromJson() within my applet code.
I've found that both deserialization and serialization in an unsigned applet throw security exceptions and that implementing custom serializers and deserializers can work-around those problems.
The biggest pain is not being able emulate the applet environment (SecurityManager) for Unit testing. It seems that there are no frameworks available to do this: see e.g.
How to unit test Java code that is expected to run within an applet Security Manager