Javascript 什么是绕过IE文件下载安全规则的技术?

Javascript 什么是绕过IE文件下载安全规则的技术?,javascript,jquery,internet-explorer,Javascript,Jquery,Internet Explorer,Internet Explorer(使用默认设置,我通常认为默认设置将在大型未洗设备的桌面上生效)似乎不喜欢在HTTP响应中接受附件内容,如果相应的请求不是直接从用户操作(如“单击”处理程序或本机表单提交)发出的。可能有更多的细节和细微差别,但这是让我沮丧的基本行为 在我看来,这种情况很常见:一些可下载内容(比如,准备好的PDF报告)前面的用户界面允许在创建内容时使用一些选项和输入。现在,与所有允许用户规定应用程序如何执行某些操作的表单一样,输入可能会出错。不总是,但有时 因此,存在一个两难境地

Internet Explorer(使用默认设置,我通常认为默认设置将在大型未洗设备的桌面上生效)似乎不喜欢在HTTP响应中接受附件内容,如果相应的请求不是直接从用户操作(如“单击”处理程序或本机表单提交)发出的。可能有更多的细节和细微差别,但这是让我沮丧的基本行为

在我看来,这种情况很常见:一些可下载内容(比如,准备好的PDF报告)前面的用户界面允许在创建内容时使用一些选项和输入。现在,与所有允许用户规定应用程序如何执行某些操作的表单一样,输入可能会出错。不总是,但有时

因此,存在一个两难境地。如果客户机试图做一些奇特的事情,比如运行AJAX事务让服务器检查表单内容,然后重新提交以获得下载,IE不会喜欢这样做。它不会喜欢它,因为实际的HTTP事务将不会在原始的用户操作事件处理程序中发生,而是在AJAX完成回调中发生。更糟糕的是,由于IE安全栏似乎认为解决所有问题的办法就是从原始URL重新加载外部页面,因此它邀请用户继续下载可疑内容的做法根本不起作用

另一种选择是让表单自动启动。服务器检查参数,如果有任何错误,它会用表单容器页面响应,并适当地添加错误消息。如果表单内容正常,它将生成内容并将其作为附加文件发送回HTTP响应。在这种情况下(我认为),IE很高兴,因为内容显然是由用户直接请求的(顺便说一句,这是一种区分好内容和坏内容的可笑的脆弱方法)。这很好,但现在的问题是,客户端环境(即我页面上的代码)无法判断下载是否有效,因此表单仍然停留在那里。如果我的表单处于某种对话框中,那么我真的需要在操作完成后关闭该对话框——这是用AJAX方式进行操作的动机之一

在我看来,唯一要做的事情就是在表单对话框中安装类似“下载开始时关闭此按钮”的消息。这对我来说真的很蹩脚,因为这是一个“请为我按下此按钮”界面的示例:理想情况下,我自己的代码应该能够在适当的时候按下按钮。我不知道的一个关键问题是,客户端代码是否有办法检测表单提交是否导致了附件下载。我从来没有听说过一种检测这种情况的方法,但这会打破我的僵局。

IE这样做有很多很好的理由,我相信这不是任何人都会争论的——所以主要目标是以某种方式绕过它,为用户创造更好的环境

有时值得重新思考事情是如何完成的。也许禁用该按钮,使用javascript检查所有字段的填写时间,并在填写完毕后发出ajax请求。如果ajax成功,请启用该按钮。这只是一个建议,我相信会有更多

编辑:更多

执行简单提交(非AJAX),如果检查失败,则返回页面而不是附件。发送回的页面可以包含最初提交的所有信息(以及发送给用户的任何错误消息),因此用户无需再次填写整个表单。我也相信会有更多的想法

编辑:更多


我相信你以前见过这种类型的东西-是的,这是一个额外的点击(不理想,但不难)。。。。“如果下载失败,请单击此处”->在本例中,按照您的意愿进行操作,但在AJAX返回时向页面添加一个新的链接/按钮,因此如果下载失败,他们可以通过“直接用户操作”提交已验证的表单。我相信我会想到更多(或者其他人会)…

我想你提交的表单有一个不同的目标窗口;因此,形式保持不变

有几种选择

  • 保持“提交”按钮处于禁用状态,并在后台进行持续验证,轮询表单中字段的更改,然后在字段更改时发出验证请求。当表单处于有效状态时,启用该按钮;否则,请禁用该按钮。这并不完美,因为可能会有延迟,但对于您正在做的任何事情来说,这可能已经足够好了
  • 对于表单的
    submit
    事件,在处理程序中执行不需要往返服务器的基本验证,然后提交表单并删除它(或者可能只是隐藏它)。如果服务器上的进一步验证检测到问题,它可以返回一个页面,该页面使用JavaScript通知原始窗口重新显示表单
  • 使用会话cookie和唯一的表单ID(从
    new Date().getTime()
    开始的当前时间即可);提交表单时,请禁用其“提交”按钮,但在响应返回之前保持其可见。将响应设置为会话cookie,该ID指示成功/失败。每隔一秒左右让包含表单轮询的窗口轮询cookie,并在看到结果时对其进行操作。(我从来没有做过最后一个;没有立即明白为什么它不起作用。)
  • 我想还有十几种方法可以剥这只猫的皮,但我想到的就是这三种

    (编辑)如果您没有提交到不同的目标,您可能希望继续并执行此操作--提交到同一页面上的隐藏的
    iframe
    。这(可能与上述或其他答案相结合)可能会帮助您获得所需的用户体验。