显示302 Redirect - 或HTTP兼容等待屏幕的内容

NOt*_*Dev 2 html redirect http

我希望在用户进入网站之前在HTML中绘制一个等待屏幕,因为一些长时间运行的auth进程是我无法控制的.我希望该屏幕完全符合HTTP标准,即:

  • 200 OK如果没有可用的实际内容,则不应该响应(这消除了显示带有加载指示符的空页占位符并在后台使用AJAX调用加载内容的选项)
  • 它应该响应,302 Redirect如果实际上有任何重定向(这消除了HTML的元刷新功能).

我能看到的唯一"第三种方式"是依靠标准的302重定向.但是我需要请求的实际内容,导致302响应在等待第二个请求时呈现给用户("请等待"信息或其他内容).在大多数(所有?)情况下,浏览器不会绘制这些请求的内容,只是等待重定向数据.

问题是:

  1. 在什么情况下呈现302重定向请求的内容?是否有可能强制浏览器在重定向之前呈现它?
  2. 是否有另一种方法来解决问题而不破坏HTTP协议?或者是200 OK没有任何内容最初没有违反协议的页面的状态?

Jan*_*sky 5

对你的问题的简短回答可能是"实际上不可能".

但你可能很幸运.

显示302的内容 - 不可能

规范要求客户端立即转到302响应中指定的新URL.无法等待,现在可以呈现回复的概念.

有人必须等待 - 服务器端选项

您期望某些进程应等到冗长的身份验证过程完成.

这样的过程必须能够

1)启动认证过程

2)渲染一些"等待"页面

3)检查认证过程的结果

4)验证成功后,将您重定向到那里

步骤1 - 从服务器端启动身份验证过程可能是真正的问题,因为您无法访问目标站点的cookie和其他身份验证资源.您正在为另一个域提供服务,因此您将无法阅读此安全相关内容,只有您的浏览器知道这些内容.但我会假设,你会以某种方式管理(要求你的用户提前告诉你这类信息).

然后您的Web服务器将为您的客户端启动身份验证过程.这很奇怪,但您可以通过从服务器向目标站点发起http请求来尝试这样做.这必须是异步完成的,因为我们还需要做一些其他事情,例如为用户提供渲染内容.

第2步 - 呈现一些"等待页面.要在浏览器端呈现某些内容,您可能会返回一个包含200个状态代码的页面.我不认为,这会破坏http.您将返回一些不错的"等待片刻"内容加上"刷新"标题以在短时间内启动页面刷新(如在2秒左右).

步骤3 - 检查身份验证过程的状态:您的服务器将从上一步的刷新表单获得另一个请求.您的服务器必须知道此活动的上下文,可能是会话ID.在这种情况下,它会发现,有一个身份验证过程正在运行.如果尚未完成身份验证,请重复步骤2.

步骤4 - (仍在您的服务器上)如果身份验证已完成,请收集客户端作为经过身份验证的用户连接到目标服务器所需的所需信息,并返回302,其中包含指向目标服务器的链接.这假定,链接允许以"认证"方式连接.

这种方法很可能在步骤1和/或4中失败.但是可能存在可行的情况(取决于目标服务器).

等待进程在客户端浏览器中运行

等待完整身份验证的进程的另一个选项是在浏览器中.使用AJAX进程不会破坏HTTP,它只是另一个并行运行的进程.

您可以渲染一些"等待"内容,然后尝试通过AJAX连接到目标服务器.

但是,在这里您尝试进行某种跨站点脚本编写,因此除非目标服务器不允许您发出此类请求(搜索CORS,您的Web浏览器在另一个域的上下文中运行),否则Web浏览器将拒绝这样的要求.

假设您成功,您的AJAX进程将尝试连接,并且一旦成功,它将管理将页面重定向到目标页面.

您的服务器在代理角色

您可以修改第一个建议的解决方案 - "服务器端选项",接管与目标服务器的所有通信并向您的客户端提供类似的内容.

结论

阐明浏览器,服务器和目标服务器的角色

如果您使用生命线"浏览器","MyServer","TargetServer" 绘制序列图,那将会很棒.

所有提出的解决方案都很危险

最大的问题是,如果您希望对其他域进行身份验证,而不是您所服务的域,则要求您的用户与您分享非常隐私的信息.浏览器会尽力防止此类行为,您的用户可能愿意与您的应用分享此类信息,但此类行为非常棘手.

试图解决您无法触及的问题非常棘手

对我来说听起来,你正试图以某种方式解决域上的慢速身份验证过程,你无法控制.这往往导致非常绝望的情况"我没有足够的力量去做,但我必须".拒绝这样一个要求的好理由可能是"它需要打破几个与安全相关的标准."