【问题标题】:Bypassing CloudFlare's time-out of 100 seconds绕过 CloudFlare 的 100 秒超时
【发布时间】:2017-11-02 23:46:45
【问题描述】:

我正在尝试对我的报告进行 AJAX 化处理,以绕过 CloudFlare 对通过其站点运行的请求施加的 100 秒超时。

Is it possible to increase CloudFlare time-out?

我做了以下事情:

function ajaxReport() {
    var seconds = prompt("Please enter how many seconds you want the report to run", "5");
    $('#imgWaiting').show();
    $.post("post/post_ajaxReport.jsp",
  {
    theParam:seconds
  },function(data) {
    $('#imgWaiting').hide();
    window.location=data;
 });

}

以及 post_ajaxReport.jsp 的以下内容

<%
 int theParam=myFunctionToConvertStringToInt(request.getParameter("theParam"));
int a=theParam/60;
int b=theParam-a*60;
String query="WAITFOR DELAY '00:"+a+":"+b+"';";
double d=myCustomCodeToRunQuery(query);
String fileName=createReport();
%>
<%=fileName%>

代码在 100 秒内运行良好。但没有工作超过 100 秒。

有什么想法吗?

反馈后更新

我的报告现在可以在没有 AJAX 的情况下正常工作(尽管 CloudFlare 有 100 秒的超时)。我试图将它们转换为 AJAX 以避免对子域产生灰色影响,因为我不想公开我的 IP 地址。如果我要对子域进行灰云化,我会在原始代码上进行,这比 AJAX 化我的代码要简单得多!我的问题是“如何修复我的 AJAX 代码,这样我就可以避免 100 秒超时,但又不会暴露我的 IP 地址……”

【问题讨论】:

    标签: javascript ajax asynchronous timeout cloudflare


    【解决方案1】:

    如果其他人也有同样的问题,我将发布我最终是如何工作的。我放弃了尝试使用 AJAX 运行报告,而是通过线程运行报告,但使用 AJAX 来“轮询”以检查报告是否已创建。我所做的基本上如下。

    请注意,我从代码中删除了很多内容,例如安全例程和错误检查例程,只是为了给出基本框架。

    我创建了一个名为 ThreadMyReport 的 java 类

    public class ThreadMyReport implements Runnable {
    
        String fileID = "";
        Date dateOfReport = null;
    
        public ThreadMyReport(Date dateOfReport) {
            this.fileID= "MyReport_" + UUID.randomUUID();
            this.dateOfReport = dateOfReport;
        }
    
        public void run() {
            int a = ReportMyReport.loadAndSaveMyReport(dateOfReport, fileID);
        }
    
    
        public String getFileID() {
            return fileID;
        }
    }
    

    我生成报告的所有原始代码都可以在 ReportMyReport.loadAndSaveMyReport 中找到。报告完成后,它会在服务器上保存一个文件名为 fileID 的文件。

    然后我启动了一个线程来运行报告

        ThreadMyReport a  = new ThreadMyReport(theDate);
        Thread theThread=new Thread(a);
        theThread.start();
        fileID=a.getFileID();
    

    然后我添加了一个 javascript 例程,每秒通过 AJAX 检查文件是否已创建,如果已创建则显示报告。

    <SCRIPT language="javascript">
    
    
        var myVar;
        myVar=setInterval(function (){
        $.post("post/post_checkReportReady_xml.jsp", {
           generatedReport: '<%=fileID%>'
        }, function(data) {
           if (data.indexOf("produced")>-1) {
               clearInterval(myVar);
               //display report
           }
           if (data.indexOf("failed")>-1) {
               clearInterval(myVar);
           }
        });
    
    }, 1000);
            </SCRIPT>
    

    AJAX 代码如下所示:

         <%
        String result="";
    
        String generatedReport=(request.getParameter("generatedReport"));
    
        if(!"".equals(generatedReport)) {
            String fileName2="My directory/"+generatedReport+".xlsm"; 
            java.io.File f = new java.io.File(fileName2);
            if(f.exists()) { 
                result="produced";
            }
        }
    }
    
    %>
    <%=result%>
    

    【讨论】:

      【解决方案2】:

      由于 cloudflare 不缓存 html 或 xhr,因此您可以对子域进行灰云化,但在服务器上将其用作别名。比如……

      在 CloudFlare dns 中:

      • www 123.123.123.123 = 橙色(受保护)
      • ajax 123.123.123.123 = 灰色(仅限 DNS)

      在您的网站控制面板中添加 ajax.mydomain.com 作为别名。

      最后,在您的代码中使用绕过 cloudflare 访问您的服务器的 fqdn。

      function ajaxReport() {
          var seconds = prompt("Please enter how many seconds you want the report to run", "5");
          $('#imgWaiting').show();
          $.post("//ajax.mydomain.com/post/post_ajaxReport.jsp",
        {
          theParam:seconds
        },function(data) {
          $('#imgWaiting').hide();
          window.location=data;
       });
      }
      

      这确实会暴露您的 IP 地址。但根据返回的内容,应该几乎没有性能损失。

      【讨论】:

      • 感谢@jules 的回复。我的报告现在可以在没有 AJAX 的情况下正常工作(尽管 CloudFlare 有 100 秒的超时)。我试图将它们转换为 AJAX 以避免对子域产生灰色影响,因为我不想公开我的 IP 地址。如果我要对子域进行灰云化,我会在原始代码上进行,这比 AJAX 化我的代码要简单得多!我的问题实际上是如何修复我的 AJAX 代码,这样我就有避免 100 秒超时的好处,但没有暴露我的 IP 地址的缺点......也许无法做到!
      猜你喜欢
      • 2016-11-19
      • 2014-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-27
      • 2021-08-05
      • 1970-01-01
      • 2022-09-27
      相关资源
      最近更新 更多