2012-09-29 24 views
2

有没有人遇到过这个?这使得我很难获得一个appplet工作。我认为它不工作的原因是由于我的程序中的套接字与服务器进行通信。但是,我无法弄清楚如何阻止它,而谷歌没有帮助。我无法得到一个异常,因为谷歌浏览器的java控制台没有输出错误,只是在点击错误的小程序之后给我一个弹出窗口,说它出错了。如果需要代码,我会添加。提前致谢。Java:安全例外 - 非法网址重定向

security: --- parseCommandLine converted : -Djava.net.preferIPv4Stack=true 
into: 
[-Djava.net.preferIPv4Stack=true] 
basic: Added progress listener: [email protected] 
basic: Plugin2ClassLoader.addURL parent called for http://voidchar.com/Other/DatRLTest.jar 
basic: Plugin2ClassLoader.addURL parent called for http://voidchar.com/Other/SharedClasses.jar 
security: Blacklist revocation check is enabled 
security: Trusted libraries list check is enabled 
network: Cache entry found [url: http://voidchar.com/Other/DatRLTest.jar, version: null] prevalidated=false/0 
cache: Resource http://voidchar.com/Other/DatRLTest.jar has expired. 
network: Connecting http://voidchar.com/Other/DatRLTest.jar.pack.gz with proxy=DIRECT 
network: Connecting http://voidchar.com:80/ with proxy=DIRECT 
basic: exception: illegal URL redirect. 
java.lang.SecurityException: illegal URL redirect 
at com.sun.deploy.net.HttpUtils.followRedirects(Unknown Source) 
at com.sun.deploy.net.BasicHttpRequest.doRequest(Unknown Source) 
at com.sun.deploy.net.BasicHttpRequest.doGetRequestEX(Unknown Source) 
at com.sun.deploy.cache.ResourceProviderImpl.checkUpdateAvailable(Unknown Source) 
at com.sun.deploy.cache.ResourceProviderImpl.isUpdateAvailable(Unknown Source) 
at com.sun.deploy.cache.DeployCacheHandler.get(Unknown Source) 
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source) 
at sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source) 
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source) 
at sun.plugin.PluginURLJarFileCallBack.downloadJAR(Unknown Source) 
at sun.plugin.PluginURLJarFileCallBack.access$000(Unknown Source) 
at sun.plugin.PluginURLJarFileCallBack$1.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at sun.plugin.PluginURLJarFileCallBack.retrieve(Unknown Source) 
at sun.net.www.protocol.jar.URLJarFile.retrieve(Unknown Source) 
at sun.net.www.protocol.jar.URLJarFile.getJarFile(Unknown Source) 
at sun.net.www.protocol.jar.JarFileFactory.get(Unknown Source) 
at sun.net.www.protocol.jar.JarURLConnection.connect(Unknown Source) 
at sun.plugin.net.protocol.jar.CachedJarURLConnection.connect(Unknown Source) 
at sun.plugin.net.protocol.jar.CachedJarURLConnection.getJarFileInternal(Unknown Source) 
at sun.plugin.net.protocol.jar.CachedJarURLConnection.getJarFile(Unknown Source) 
at com.sun.deploy.security.DeployURLClassPath$JarLoader.getJarFile(Unknown Source) 
at com.sun.deploy.security.DeployURLClassPath$JarLoader.access$1000(Unknown Source) 
at com.sun.deploy.security.DeployURLClassPath$JarLoader$1.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at com.sun.deploy.security.DeployURLClassPath$JarLoader.ensureOpen(Unknown Source) 
at com.sun.deploy.security.DeployURLClassPath$JarLoader.<init>(Unknown Source) 
at com.sun.deploy.security.DeployURLClassPath$3.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at com.sun.deploy.security.DeployURLClassPath.getLoader(Unknown Source) 
at com.sun.deploy.security.DeployURLClassPath.getLoader(Unknown Source) 
at com.sun.deploy.security.DeployURLClassPath.getResource(Unknown Source) 
at sun.plugin2.applet.Plugin2ClassLoader$2.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at sun.plugin2.applet.Plugin2ClassLoader.findClassHelper(Unknown Source) 
at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source) 
at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Unknown Source) 
at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source) 
at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Unknown Source) 
at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source) 
at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source) 
at java.lang.ClassLoader.loadClass(Unknown Source) 
at sun.plugin2.applet.Plugin2ClassLoader.loadCode(Unknown Source) 
at sun.plugin2.applet.Plugin2Manager.initAppletAdapter(Unknown Source) 
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source) 
at java.lang.Thread.run(Unknown Source) 
Ignored exception: java.lang.SecurityException: illegal URL redirect 
basic: Dialog type is not candidate for embedding 
basic: Removed progress listener: [email protected] 
basic: Loading Java Applet Failed... 
security: Accessing keys and certificate in Mozilla user profile: null 
security: Reset deny session certificate store 

编辑:这里是我用来加载小程序的html代码。


    {applet width=800 height=800 archive='DatRLTest.jar,SharedClasses.jar' code='vc.voidwhisperer.datrl.main'} 
    {PARAM name="java_arguments" value="-Djava.net.preferIPv4Stack=true"} 
    {/applet} 

的小于&大于迹象被替换由于这样的事实,它不喜欢我试图把东西他们。

编辑#2:我自签名的jar,这仍然在发生。我还没有想出如何解决这个问题..

最后编辑:经过多小时的工作,我终于遇到了一个解决方案,这要感谢irc频道的朋友。下面是它是如何固定的一般要点:

  • 如果你看一下输出的具体线路:网络:连接http://voidchar.com/Other/DatRLTest.jar.pack.gz与代理= DIRECT。
  • 查找该文件时,它不存在。
  • 对文件类型做了一些研究,它是一个pack200 jar,它可以使用jar来制作,然后使用它进行以下操作:打开cmd并键入'pack200 example.jar.pack.gz [JarLocation]'。
  • 现在,将example.jar替换为jar文件的名称,但将.pack.gz保留在那里。
  • 现在,将该文件上传到与小应用程序相同的目录,并尝试再次加载小应用程序。

注:确保小程序已签名!希望这有助于他人解决我遇到的问题。

+0

我遇到http://www.ol-in-berlin.de/gadget/reitti.jar同样的问题,当客户端更新到Java 7中。在客户端禁用Java下一代插件是第一个(坏)解决方案。幸运的是,我发现你的这篇文章并提供.pack.gz文件。感谢分享它。 (也许你应该把它作为一个自我回答)现在,如果有人能够提供详细的解释,为什么会发生这种情况,这将是很好的。 – bodo

回答

4

你的小应用程序违反了“同源”的限制,这是旨在防止讨厌的小应用程序用户默认Applet的安全限制。

请参阅this blog post了解限制的解释以及为何强制执行。


你能做些什么呢?最好的做法是重新构建你的applet和/或服务,以便重定向完全移除,或者重定向到一个不违反限制的URL。如果这不是一个选项,您将需要使您的小程序成为“可信任的小程序”;例如请参阅this tutorial以了解问题。


UPDATE

我错了有关使小程序信任的小程序。它不会帮助。我查看了OpenJDK源代码(herehere),并且似乎执行“同源”安全检查时不考虑安全策略。 (查找与该消息抛出异常的代码......)

所以你唯一的选择是从同一个主机和端口的网页链接到它服务于小程序。换句话说,不要违反“同源”规则。

+0

我自行签署了小程序。它仍然不会加载。并且所有类都与试图加载它的页面位于同一台服务器上。我将我使用的html代码添加到orignal文章中。 – VoidWhisperer

+0

唯一可能导致这种情况的原因是我的小应用程序通过插件连接到远程ip ......我不能做太多的工作来解决这个问题吗?我很确定它试图访问的两个.jar文件都在同一个网络服务器上,除非它试图从目录以外的地方访问它 – VoidWhisperer

+0

是否有任何简单的方法来诊断错误到达哪一行来自,因为看着堆栈跟踪,它没有说明异常来自哪里,因此弄清楚错误来自哪里确实有点麻烦。 – VoidWhisperer

0

我使用Java 1.7.0_09时,看到一个客户的服务器上的同样的问题。如果我使用Java的早期版本,那么没有问题。如果我在不同的服务器上运行相同的Applet,那么没有问题。

我终于找到了一个修复程序。我清除了我的Java缓存。 (这是不是浏览器缓存不同。)

在Windows 7中,您可以:

  1. 启动Java控制面板,
  2. 点击 “常规” 选项卡,
  3. “Internet临时文件” 下点击“设置”,
  4. 单击“删除文件”,
  5. 只选择“缓存的应用程序和小程序”并点击确定。

花了将近一分钟,清除我的Java高速缓存。

然后一切正常。

2

至于我的研究就这个问题时请求的java小程序,并得到一个HTTP响应300造成的。首先,java将尝试加载applet的压缩版本,即“yourjarfile.jar.pack.gz”。如果服务器提供HTTP 404,则按预期工作。但是,如果服务器提供HTTP 300响应,则java假定存在重定向目标,如果没有设置则失败。

从我的经验,你可以做以下的事情来解决服务器端的问题:

  1. 如果你的小程序由一个jar文件,并没有数据被加载之后,您可以压缩与您的小程序pack200工具,并用新文件替换原始jar。确保.pack.gz文件扩展名附加到原始文件。
  2. 如果你有一个Apache并完全控制你的服务器,你可以卸载mod_speling。请确保您运行的环境的其他部分正常。
  3. 如果您可以使用.htaccess文件,则可以禁用对applet从中加载的文件夹进行拼写检查。为此,创建一个内容为“CheckSpelling off”的.htaccess文件。如果已经存在.htaccess文件,只需将此行添加到它。

我希望这可以帮助一些人出来。