Html 显示302重定向或HTTP兼容等待屏幕的内容

Html 显示302重定向或HTTP兼容等待屏幕的内容,html,http,redirect,Html,Http,Redirect,我希望在用户进入网站之前用HTML绘制一个等待屏幕,因为一些长期运行的身份验证过程超出了我的控制。我希望该屏幕完全符合HTTP,即: 如果没有可用的实际内容,则不应使用200 OK进行响应(这消除了显示带有加载指示器的空白页面占位符的选项,并在后台使用AJAX调用加载内容) 如果确实存在任何重定向(消除了HTML的元刷新功能),它应该以302重定向响应 我能看到的唯一“第三种方法”是依赖标准302重定向。但是我需要在等待第二个请求时向用户提供导致302响应的请求的实际内容(带有“请等待”信息

我希望在用户进入网站之前用HTML绘制一个等待屏幕,因为一些长期运行的身份验证过程超出了我的控制。我希望该屏幕完全符合HTTP,即:

  • 如果没有可用的实际内容,则不应使用
    200 OK
    进行响应(这消除了显示带有加载指示器的空白页面占位符的选项,并在后台使用AJAX调用加载内容)
  • 如果确实存在任何重定向(消除了HTML的元刷新功能),它应该以
    302重定向
    响应
我能看到的唯一“第三种方法”是依赖标准302重定向。但是我需要在等待第二个请求时向用户提供导致302响应的请求的实际内容(带有“请等待”信息或其他信息)。在大多数(所有?)情况下,浏览器不会绘制这些请求的内容,只需等待来自重定向的数据

问题是:

  • 在什么情况下呈现302重定向请求的内容?是否可以在重定向之前强制浏览器渲染它
  • 有没有其他方法可以在不破坏HTTP协议的情况下解决此问题?或者没有任何内容的页面的
    200状态是否正常
    最初没有违反协议

  • 对你的问题的简短回答可能是“实际上不可能”

    但你可能很幸运

    显示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进程将尝试连接,一旦成功,它将管理将页面重定向到目标页面

    您的服务器处于代理角色 您可以通过接管与目标服务器的所有通信并向客户端提供类似的内容来修改第一个建议的解决方案——“服务器端选项”

    结论 明确浏览器、服务器和目标服务器的角色 如果你用生命线“Browser”、“MyServer”、“TargetServer”来画,那就太棒了

    所有提议的解决方案都是危险的 最大的问题是,如果你想获得其他域(而不是你所服务的域)的身份验证,你会要求你的用户与你共享非常私人的信息。浏览器会尽最大努力防止这种行为,你的用户可能愿意与你的应用共享此类信息,但这种行为非常棘手

    试图解决你力所能及的问题是非常棘手的
    对我来说,这听起来像是在试图以某种方式解决一个你无法控制的域上的缓慢身份验证过程。这通常会导致非常绝望的情况“我没有足够的能力去做,但我必须去做”。拒绝这一要求的好理由可能是“它需要打破一些与安全相关的标准”。“

    最简单的解决方案是使用多部分/x-mixed-replace内容类型响应,第一部分为
    HTTP/1.1 200 OK
    Content-Type: multipart/x-mixed-replace;boundary=MYBOUNDARYSTRING
    
    --MYBOUNDARYSTRING
    Content-Type: text/html
    
    <html><body><!-- your waiting page content here --></body></html>
    --MYBOUNDARYSTRING
    
    Content-Type: text/html
    
    <html><body><!-- your final page here --></body></html>
    --MYBOUNDARYSTRING
    --
    
    HTTP/1.1 200 OK
    Content-Type: text/html
    Transfer-Encoding: chunked
    
    6E
    <html><head><!-- load my CSS and JS files --></head><body>
    <div id="waiting"><!-- my waiting content --></div>
    
    3E
    <div id="final"><!-- my final content --></div></body></html>
    0
    
    <style> body { position: relative; margin: 0; padding: 0 } body > div { position: absolute; top: 0; left: 0; width: 100% } #waiting { z-index: 0 } #final { z-index: 1 } </style>