我正在解决这个非常烦人的问题,并且已经解决了太多天了,所以试试吧。
环境
我们有 2 个应用服务器,它们可以位于同一台机器或 2 台不同的机器上,并使用相同的签名证书,并托管 2 个不同的网络应用程序。
虽然我们假设,为了我们这里的研究案例,它们在同一台物理机器上。所以,我们有:
webapp1
是基于 GWT 的富客户端,它在其中一个屏幕上包含一个菜单,其中包含一个用于调用位于webapp2
. 它window.open
通过这个 GWT 调用执行一个简单的调用来做到这一点:
Window.open("https://company.com/webapp2/app.jnlp", "_blank", null);
预期行为
- 用户愉快地前往
webapp1
- 用户导航到菜单条目以启动 WebStart 应用程序并单击它
- 浏览器会触发一个单独的窗口/对话框,根据浏览器及其安全设置,它将:
- 请求确认导航到此安全站点,
- 直接下载文件,
- 如果有文件关联,可能会自动执行一个
javaws
进程,否则用户可以简单地单击文件并启动应用程序(或在这里做任何事情)。
- 如果您关闭应用程序,关闭对话框,然后重新单击菜单条目,同样的事情应该会再次发生。
实际行为
除了上帝遗弃的 IE 8 之外的任何东西
(虽然我承认也有所有被上帝遗弃的 IE8 之前的东西,但是要求领主是仁慈的,我们最近已经设法让他们放弃这些傻瓜。那很接近了。让我们手牵手,表达感激之情。)
东西刚刚好。JNLP 被下载,应用程序运行正常,您可以关闭应用程序并重新执行所有步骤,它会愉快地重新启动。人们欢欣鼓舞。小狗是安全的,在阳光下在绿色的山丘上玩耍。开发人员可以去喝杯咖啡,然后继续做更有意义和更有价值的任务,比如检查 SO 问题。
Chrome 不想执行 JNLP,但谁在乎呢?客户不会因为每隔一周点击一个文件而获得 RSI。
在被上帝遗忘的 IE8 上
在第一次访问时,对话框打开并请求用户确认继续webapp2
,尽管它可能不安全(这里是龙,我告诉你)。JNLP 下载并自动打开,应用程序启动。你的呼吸平稳而缓慢。
您关闭应用程序,关闭 SSL 确认对话框,然后重新单击菜单条目。对话框打开并自动关闭。什么都没有开始,文件没有下载到任何已知位置,Fiddler 只是报告连接已关闭。如果您关闭 IE 并到达该菜单项以再次单击它,它现在恢复正常工作。当然,直到您在同一会话中再次尝试。
你的心率上升,你喝了更多的咖啡,让事情变得更糟,开始在网上寻找普通的门票,在网上拍卖网站上寻找便宜但沉重的高尔夫俱乐部,去泡小极地海豹,为你的嗜血报仇,因为雷德蒙德 IE 团队的大门可能比冰块更安全,因为人们会认为他们经常受到死亡威胁。另外,IE9 和 IE10 团队已经在努力修复他们前辈留下的垃圾,所以也许你不想对他们太苛刻,而且你没有钱浪费在 PI 上来追踪负责这个烂摊子的前开发人员。
添加详细信息
我遇到了很多问题,IE8 在使用
no-cache
标头时无法通过 SSL 下载文件。这确实是我们的问题之一,现在似乎已经解决了。它可以很好地下载文件,webapp2
使用以下标头来提供 JNLP 文件:response.setHeader("Cache-Control", "private, must-revalidate"); // IE8 happy response.setHeader("Pragma", "private"); // IE8 happy response.setHeader("Expires", "0"); // IE8 happy response.setHeader("Access-Control-Allow-Origin", "*"); // allow to request via cross-origin AJAX
response.setContentType("application/x-java-jnlp-file"); // 请执行我
正如您可能已经推断的那样,我们得到了一些确认对话框,因为 SSL 证书有些奇怪。不幸的是,我无法控制。假设这只是暂时的并且出于开发目的,因为我们通常不会获得生产证书。因此 SSL 证书已过期且未指定服务器。和确认对话框。如果不是 IE 就不会那么糟糕,因为其他浏览器不在乎,只需请求确认,并按预期和一致地执行。
拜托,非常拜托,帮助我,否则我可能会考虑牺牲杀戮作为一种选择。而且我想我刚刚找到了一个相当珍贵的不锈钢高尔夫球杆,所以我正处于血腥的边缘。
旁注
实际上可能与IE8 window.open SSL Certificate issue有关。虽然它没有解释为什么对话框会自动关闭(这真的是我的......),但它可能有助于没有确认对话框并且根本不需要对话框。例如,我认为在该菜单中只使用一个简单的 URL 而不是完全由 GWT 代码管理来调用 Window.open 可以解决问题。但是我无法控制那个菜单,而且我很好奇如何解决这个问题,以及为什么它首先会发生......