一位客户注意到我们的一个 Java 小程序不再工作了。但是,我们无法确定问题出在哪里。
规范
网络应用程序是 tiparlo .用于记录和组织口语,主要用于学校训练语言和存储以备后用。该应用程序包含一个由 JavaScript 管理的 HTML 界面。声音播放和录制是通过内部开发的 java applet 完成的.正如您在测试页面上看到的,小程序本身处于工作状态。
然而,在 tiparlo 中,小程序(也称为录音机)没有预加载的声音文件。由于 tiparlo 由多个声音文件组成,因此 JavaScript 告诉录音机要播放哪个文件。例如,如果你想播放 foo.ogg,javascript 告诉录音机播放 http://url/path/foo.ogg。 .
这个方法现在有用了几年,但现在不行了。
错误追踪
问题是它确实在特定条件下工作。例如,它适用于我们的本地开发机器和我们的公共(public)测试环境。它只是停止为我们的客户工作。
工作示例:http://test.s2.olefa.com/cgi-bin/apps/tiparlo?projectid=3&mode=viewer
非工作示例:http://www.ecoles-dudelange.lu/cgi-bin/apps/tiparlo?projectid=1594&mode=viewer
一些有用的事实:
两个示例都在同一台服务器上运行
java小程序、js代码、html解析器和源代码是共享资源。因此,这两个示例都运行完全相同的代码
问题的相关文件是:soundrecorder.js 和 jrecord.jar。
play
命令在 soundrecorder.js:line 112
目前我们所知道的
浏览器对无效示例的 react 不同。 Safari/Mac 播放一切正常。然而,Safari/Win 在播放时卡住。 Firefox 4 根本不播放任何内容。 Firefox 3.5/Mac 再次正常运行。然而Firefox3.5/Win根本不播放任何东西。 IE9有同样的问题。 Chrome 也是如此。 Opera 彻底崩溃,需要重新启动。我们还没有在 linux 上找到适用于非工作示例的浏览器。澄清一下:工作示例适用于所有平台上的所有浏览器,除了 Safari/Win (meh)。 更新:这取决于 java 版本。使用 java 6.20,所有非工作示例都适用于所有浏览器。对于 java 6.24,只有工作示例有效。
我们尝试为我们的非工作示例 (webX.sX.olefa.com) 使用替代服务器 url,这与工作示例类似。这次尝试失败了。
我们尝试使用录音机的相对路径(例如/path/foo.ogg)。
我们尝试将 Java 更新到最新版本。
我们尝试以不同的方式访问小程序。
我们在 6 个月前遇到过类似的问题,这是由 java 更新引起的。我们在具有较旧 java 版本的 VM 上尝试了非工作示例。有用。但是,我们怀疑 java 本身并不是罪魁祸首,因为相同的 java 版本/浏览器适用于工作示例。
Soundrecorder 仅拒绝播放通过 JS 动态加载的文件。如果它在 init 上加载文件,则没有错误。
小程序本身已加载。你可以通过给它一个宽度/高度来让它可见。我怀疑是java/js互通有问题(js在告诉java玩什么但是通讯有问题?)。不过我目前还不能确认这一点。
一般来说,我们无法找出为什么在完全相同的条件下运行的完全相同的代码在一个站点上有效,但在另一个站点上却不能。
解决方案
解决方案是评论的一部分。问题和解决办法可以找here .感谢 Ryan 为我们指明了正确的方向。
最佳答案
我在 Windows (Java 1.6.0_24) 上使用 FF4,并且能够在 http://www.ecoles-dudelange.lu/cgi-bin/apps/tiparlo?projectid=1594&mode=viewer 看到小程序.
但是,当我单击页面底部的蓝色大播放图标时,按钮上方 Pane 中的所有表情符号似乎都在发光——“墨西哥波浪”风格。令人印象深刻:)
我确实查看了 java applet 控制台,并在单击按钮后注意到以下错误:
network: Cache entry not found [url: http://www.ecoles-dudelange.lu/resources/audio/_tiparlo_1594/ismael_20110405_11-17-47_3129344.ogg, version: null]
network: Connecting http://www.ecoles-dudelange.lu/resources/audio/_tiparlo_1594/ismael_20110405_11-17-47_3129344.ogg with proxy=DIRECT
network: Cache entry not found [url: http://85.119.157.43/crossdomain.xml, version: null]
network: Connecting http://85.119.157.43/crossdomain.xml with proxy=DIRECT
network: Connecting http://85.119.157.43:80/ with proxy=DIRECT
java.security.AccessControlException: access denied (java.net.SocketPermission 85.119.157.43 resolve)
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkConnect(Unknown Source)
at sun.plugin2.applet.Applet2SecurityManager.checkConnect(Unknown Source)
at sun.net.www.http.HttpClient.New(Unknown Source)
at sun.net.www.http.HttpClient.New(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(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 java.net.URL.openStream(Unknown Source)
at lu.educdesign.audio.gui.JRecordApplet.load(Unknown Source)
...
URL http://85.119.157.43/crossdomain.xml
加载一个 html 页面,重定向到 http://confixx.s2.olefa.com
提示用户名/密码。
也许对此有一个很好的解释,但在我看来,表面上看,这可能是个问题
关于Java Applet 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5829546/