我希望在用户进入网站之前用HTML绘制一个等待屏幕,因为有些长期运行的auth进程超出了我的控制范围。我希望该屏幕完全符合HTTP,即:
200 OK进行响应(这消除了在后台使用AJAX调用显示带有加载指示符的空页面占位符和加载内容的选项)302 Redirect的Meta特性),则应该使用HTML响应。我能看到的唯一“第三条路”是依赖标准302重定向。但是,我需要导致302响应的请求的实际内容,以便在等待第二个请求时(包含“请等待”信息或其他内容)呈现给用户。大多数(全部?)在这种情况下,浏览器不会绘制那些请求的内容,只需去等待来自重定向的数据。
问题如下:
200 OK状态没有任何内容,最初没有破坏协议?发布于 2014-04-14 22:25:45
对你问题的简短回答可能“实际上是不可能的”。
但你可能很幸运。
显示302的内容-不可能
规范要求客户端立即转到302响应中指定的新url。没有办法等待,现在的想法是作出回应。
一定有人在等待服务器端选项。
您预期某些进程将等待冗长的身份验证过程完成。
这样的过程必须能够
1)启动身份验证过程
2)呈现一些“等待”页面。
3)验证过程的结果。
4)认证成功后,将您重定向到
步骤1-从服务器端启动身份验证过程可能是真正的问题,因为您将无法访问目标站点的cookie和其他身份验证资源。您正在为另一个域服务,因此您将没有机会阅读这些与安全相关的内容,只有您的浏览器知道这些内容。但我假设,您将以某种方式管理(请您的用户早些时候告诉您此类信息)。
然后,您的web服务器将为您的客户端启动身份验证过程。这是相当奇怪的,但是您可以尝试通过从服务器向目标站点发起http请求来做到这一点。这必须异步完成,因为我们还需要做其他一些事情,比如为用户提供要呈现的东西。
第二步--呈现一些“等待页面”。要在浏览器端呈现某些内容,您可以返回一个带有200状态代码的页面。我不认为这破坏了http。您将返回一些很好的“稍等片刻”内容,并添加“刷新”标题,以便在短时间内启动页面刷新(比如在2秒左右)。
步骤3-检查身份验证过程的状态:您的服务器将获得另一个请求,该请求来自“刷新表单”上一步。您的服务器必须知道此活动的上下文,可能是通过会话id。在这种情况下,它会发现,存在一个正在运行的身份验证进程。如果身份验证尚未完成,请重复步骤2。
步骤4-(仍在您的服务器上)如果身份验证已经完成,请收集客户端作为经过身份验证的用户连接到目标服务器所需的信息,并返回302,其中包含指向目标服务器的链接。这假设链接允许以“身份验证”的方式进行连接。
这种方法很可能在步骤1和/或4中失败,但是可能会出现一些情况(取决于目标服务器)。
在客户端浏览器中运行的等待进程
等待完全身份验证的进程的另一个选项是在浏览器中。使用AJAX进程并不会破坏HTTP,它只是并行运行的另一个进程。
您可以呈现一些“等待”的内容,然后尝试通过AJAX连接到目标服务器。
但是,在这里您尝试执行某种跨站点脚本,因此除非目标服务器不允许您发出这样的请求(搜索CORS,您的web浏览器正在另一个域的上下文中运行),否则web浏览器将拒绝这样的请求。
假设您成功了,AJAX流程将尝试连接,一旦成功,它将设法将页面重定向到目标页面。
代理角色中的服务器
您可以修改第一个建议的解决方案--“服务器端选项”,方法是接管与目标服务器的所有通信,并向客户端提供类似的内容。
结论
明确浏览器、服务器和目标服务器的角色
如果您使用生命线"Browser“、"MyServer”、"TargetServer“绘制MyServer,那就太好了。
所有建议的解决方案都是危险的。
最大的问题是,如果您想要获得其他域的身份验证,而不是您所服务的域,则您要求您的用户与您共享非常私密的信息。浏览器会尽力防止这样的行为,你的用户可能愿意和你的应用程序分享这样的信息,但是这种行为是非常棘手的。
试图解决一个你力所能及的问题是非常棘手的。
在我看来,您正在设法解决域上缓慢的身份验证过程,您无法控制。这往往导致非常绝望的情况“我没有足够的力量去做,但我必须这样做”。拒绝这一要求的好理由可能是“这将需要打破很少的与安全有关的标准”。
https://stackoverflow.com/questions/22922835
复制相似问题