客户注意到我们的一个Java小程序不再工作了.但是,我们无法分辨出问题所在.
眼镜
该网络应用程序是tiparlo.它用于记录和组织口语,主要用于学校培训语言和存储以供以后评估.该应用程序由一个HTML界面组成,该界面由JavaScript管理.声音播放和录制是通过内部开发的java applet完成的.正如您在测试页面上看到的那样,小程序本身处于工作状态.
然而,在tiparlo中,applet(进一步称为soundrecorder)没有预加载的声音文件.由于tiparlo由多个声音文件组成,因此JavaScript会告诉soundrecorder要播放的文件.例如,如果你想要播放foo.ogg,javascript告诉soundrecorder播放http://url/path/foo.ogg.
这已经工作了好几年了,但现在已经不行了.
BUG跟踪
问题是它在某些条件下确实有效.例如,它适用于我们的本地开发机器和我们的公共测试环境.它只是停止为我们的客户工作.
工作示例: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 applet,js代码,html解析器和源代码是共享资源.因此,两个示例都运行完全相同的代码
>问题的相关文件是:soundrecorder.js和jrecord.jar.播放命令位于soundrecorder.js:第112行
到目前为止我们所知道的
>浏览器对非工作示例的反应不同. 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,只有工作示例有效.
>我们尝试使用替代server-url作为我们的非工作示例(webX.sX.olefa.com),这与工作示例类似.这次尝试失败了.
>我们尝试使用soundrecorder的相对路径(例如/path/foo.ogg).
>我们尝试将Java更新到最新版本.
>我们尝试以不同方式访问applet.
>我们在6个月前遇到了类似的问题,这是由java更新引起的.我们在具有较旧java版本的VM上尝试了非工作示例.有用.但是,我们怀疑java本身不是罪魁祸首,因为相同的java版本/浏览器适用于工作示例.
> Soundrecorder只拒绝播放通过JS动态加载的文件.如果它在init上加载文件,则没有错误.
>小程序本身已加载.你可以通过给它一个宽度/高度使它可见.我怀疑java / js相互通信存在问题(js告诉java要播放什么但是通信有问题?).但是我还不能证实这一点.
一般来说,我们无法找出为什么在完全相同的条件下运行的完全相同的代码在一个站点上运行,但在另一个站点上运行.
解
解决方案是评论的一部分.问题和解决方案可以在here找到.感谢Ryan指出我们正确的方向.
解决方法:
我在Windows上使用FF4(Java 1.6.0_24),并且能够在http://www.ecoles-dudelange.lu/cgi-bin/apps/tiparlo?projectid=1594&mode=viewer看到小程序.
然而,当我点击页面底部的大蓝色播放图标时,按钮上方窗格中的所有表情符号似乎都会发光 – “墨西哥波浪”风格.令人印象深刻
我点击了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,提示输入用户名/密码.
也许对此有一个很好的解释,但在我看来,表面上看,这可能是一个问题