2017-06-01 2 views
0

Ich versuche AJAX-ify meine Berichte, um die 100 Sekunden Timeout zu umgehen, die CloudFlare auf Anforderungen auferlegt, die über seine Website ausgeführt werden.Umgehung von CloudFlares Time-out von 100 Sekunden

Siehe Is it possible to increase CloudFlare time-out?

Ich habe folgendes:

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; 
}); 

} 

und die folgenden für 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%> 

Der Code für unter 100 Sekunden, um großes gearbeitet. Aber hat über 100 Sekunden lang nicht funktioniert.

Irgendwelche Ideen?

UPDATE NACH MEINUNG

Meine Berichte jetzt ohne AJAX funktionieren (obwohl es die 100 Sekunden Time-out mit CloudFlare). Ich habe versucht, sie in AJAX zu konvertieren, um eine Subdomäne nicht zu trüben, weil ich meine IP-Adresse nicht offen legen wollte. Wenn ich eine Subdomain grauwolken würde, würde ich es mit dem ursprünglichen Code machen, was viel einfacher wäre als AJAX - wenn ich meinen Code hätte! Meine Frage ist, "wie man meinen AJAX-Code repariert, so dass ich die Vorteile der Vermeidung des 100-Sekunden-Timeouts hätte, aber ohne den Nachteil, meine IP-Adresse freizulegen ..."

Antwort

0

Falls jemand anderes das gleiche Problem hat, poste ich, wie ich das endlich funktionierte. Ich habe es aufgegeben, AJAX zu verwenden, um den Bericht auszuführen, aber stattdessen den Bericht über einen Thread ausgeführt, aber AJAX verwendet, um "abzufragen", um zu überprüfen, ob der Bericht erstellt wurde. Was ich getan habe, war im Grunde wie folgt.

Beachten Sie, dass ich viel aus meinem Code, z. Sicherheitsroutinen und Fehlerprüfroutinen, nur um das Grundgerüst zu geben.

habe ich eine Java-Klasse meiner ursprünglichen Code, um den Bericht zu erzeugen, ist in ReportMyReport.loadAndSaveMyReport gefunden genannt ThreadMyReport

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; 
    } 
} 

All. Wenn der Bericht fertig ist, speichert er eine Datei mit der Datei-ID fileID auf dem Server.

Dann begann ich einen Thread geht dem Bericht

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

ich dann eine JavaScript-Routine ausgeführt werden hinzugefügt jede Sekunde, ob die Datei über AJAX zu überprüfen geschaffen worden, und wenn es dann die erstellt worden war, angezeigt werden Bericht.

<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> 

Der AJAX-Code sieht wie folgt aus:

 <% 
    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%> 
0

Da cloudflare nicht html oder xhr zwischenspeichert, Sie können eine Subdomain graucloud aber auf dem Server als Alias ​​verwenden. Zum Beispiel ...

In CloudFlare dns:

  • www 123.123.123.123 = orange (geschützt)
  • ajax 123.123.123.123 = grau (dns nur)

In Ihrer Webseite Systemsteuerung hinzufügen ajax.mydomain.com als Alias.

Schließlich verwenden Sie in Ihrem Code die FQDN, die Ihren Server unter Umgehung von Cloudflare trifft.

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; 
}); 
} 

Dadurch wird Ihre IP-Adresse freigelegt. Aber es sollte wenig bis keine Leistungseinbußen geben, abhängig vom zurückgegebenen Inhalt.

+0

Danke @jules für die Beantwortung. Meine Berichte funktionieren jetzt ohne AJAX (obwohl es das 100-Sekunden-Timeout mit CloudFlare gibt). Ich habe versucht, sie in AJAX zu konvertieren, um eine Subdomäne nicht zu trüben, weil ich meine IP-Adresse nicht offen legen wollte. Wenn ich eine Subdomain grauwolken würde, würde ich es mit dem ursprünglichen Code machen, was viel einfacher wäre als AJAX - wenn ich meinen Code hätte! Meine Frage war wirklich, wie man meinen AJAX-Code repariert, so dass ich die Vorteile des Vermeidens des 100-Sekunden-Timeouts hätte, aber ohne den Nachteil, meine IP-Adresse freizulegen ... Vielleicht kann es nicht getan werden! – gordon613

Verwandte Themen