我正在尝试使用AJAX-ify我的报告,以便绕过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地址的缺点......”
答案 0 :(得分:2)
如果其他人有同样的问题,我会发布我最终如何运作。我放弃了尝试使用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中找到。报告完成后,它会在服务器上保存带有fileName 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%>
答案 1 :(得分:0)
由于cloudflare不缓存html或xhr,您可以greycloud子域,但在服务器上使用它作为别名。例如......
在CloudFlare dns中:
在您的网站控制台中,将ajax.mydomain.com添加为别名。
最后,在您的代码中使用击中服务器的fqdn绕过cloudflare。
2017-06-01 22:23:51.540: property -> subscribed
2017-06-01 22:23:51.553: property -> Event next(Optional(__lldb_expr_136.Property(id: "bar", name: "tampa")))
test passed
这确实暴露了您的IP地址。但是根据返回的内容,应该几乎没有性能损失。