当使用CFML和CF9时,我通常会调整我的循环变量范围; 在这种情况下local.i,例如:
<cfloop list="#this.list#" index="local.i">
<cfif Len(local.i) GT 10>
// do something
</cfif>
</cfloop>
Run Code Online (Sandbox Code Playgroud)
我最近开始将一些东西转换为CFScript,并且(令我失望的是我发现没有办法在CFScript中循环遍历列表)我想知道我是否仍然应该调整我的循环变量范围,以及如何:
for (i = 1; LTE ListLen(this.list); i = i + 1 ) {
if (Len(ListGetAt(this.list, i) GT 10)) {
// do something
}
}
Run Code Online (Sandbox Code Playgroud)
我应该做什么,local.i = 1而local.i = local.i + 1不是我的例子中的示例代码?有必要吗?
编辑:我还应该问我的CFML循环的CFScript形式是否正确; 我问,因为我刚注意到我的CFML循环使用,(逗号和空格)delimiter参数,这似乎在CFScript版本的循环中不存在.
我在Coldfusion 9服务器上有一项服务,可以为我们动态创建图像横幅.一台单独的机器必须保存这些文件,例如:
wget http://myserver.com/services/local/bannerCreator/250x250-v3.cfm?prodID=3&percentSaving=19
Run Code Online (Sandbox Code Playgroud)
问题是我想不出如何在不使用临时文件的情况下让coldfusion写出二进制数据.在这一刻,图像只显示为这样的图像标签:
<cfimage action = "writeToBrowser" source="#banner#" width="#banner.width#" height="#banner.height#" />
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?或者我应该只使用临时文件?
我有多个CF应用程序在相同的域名下运行在同一台服务器上.其中之一,我们称之为Portal,旨在成为其他应用程序的单点登录,让我们称之为Atlas和P-Body.通常,您会在session范围中设置一些变量来处理登录信息:
function Login()
{
session.auth = structNew();
session.auth.isLoggedIn = true;
session.auth.id = GetCurrentUserId();
}
Run Code Online (Sandbox Code Playgroud)
但会话范围仅在一个应用程序中共享,而不是在整个服务器中共享.这意味着登录Portal的任何用户都将保持登录状态,但如果他们尝试导航到Atlas或P-Body,他们将不得不再次登录.
在这种情况下,我将如何"共享"会话范围,以便服务器上的所有应用程序都可以访问它?我能想到的唯一方法是使用客户端变量并设置数据存储,以便在应用程序之间共享.然后代码变成:
function Login()
{
client.auth = structNew();
client.auth.isLoggedIn = true;
client.auth.id = GetCurrentUserId();
}
function Logout()
{
structDelete(client, "auth");
}
Run Code Online (Sandbox Code Playgroud)
需要注意的是,因为客户端变量在会话结束时没有被清除,所以我们必须在OnSessionEnd处理程序中手动清除它.
这是处理ColdFusion中单点登录的最佳方式吗?如果是这样,使用客户端变量有什么缺点,或者需要注意缺陷吗?
更新:我只是测试客户端变量法,它看起来像只hitcount,timecreated,lastvisit,和urltoken应用程序之间共享,所以我又回到了起点1.
authentication coldfusion session-variables single-sign-on coldfusion-9
编辑3:感谢@Leigh的帮助我将问题缩小到了查询中的日期列.使用原始代码集和POI时,当SpreadSheetAddRows()尝试添加包含类似日期的单元格的非常大的查询时,页面崩溃.我在这里做了一个错误报告:https://bugbase.adobe.com/index.cfm?event = bug &id = 3432184.
我有一个查询,我添加到一个spreadhseet对象,当查询具有非常多的行(在此示例中为18583)时似乎出错.确切的错误如下:
java.lang.ArrayIndexOutOfBoundsException: -32735
at java.util.ArrayList.get(ArrayList.java:324)
at org.apache.poi.hssf.model.WorkbookRecordList.get(WorkbookRecordList.j ava:50)
at org.apache.poi.hssf.model.Workbook.getExFormatAt(Workbook.java:787)
at org.apache.poi.hssf.usermodel.HSSFCell.getCellStyle(HSSFCell.java:901 )
at org.apache.poi.hssf.usermodel.HSSFSheet.autoSizeColumn(HSSFSheet.java :1727)
at coldfusion.excel.Excel.autoResize(Excel.java:1246)
at coldfusion.excel.Excel.autoResize(Excel.java:1240)
at coldfusion.excel.Excel.addRows(Excel.java:1214)
at coldfusion.runtime.CFPage.SpreadSheetAddRows(CFPage.java:7089) at coldfusion.runtime.CFPage.SpreadSheetAddRows(CFPage.java:7076)
Run Code Online (Sandbox Code Playgroud)
这是相关的代码:
<cfset xls = spreadsheetNew()>
<cfset spreadsheetAddRow(xls, arrayToList( qryTest.getMeta().getColumnLabels() ))>
<cfset SpreadsheetFormatRow(xls, {bold=true,fgcolor="brown",color="white"}, 1)>
<cfset SpreadsheetAddRows(xls, qryTest)>
<cfheader name="Content-Disposition" value="attachment; filename=#filename#">
<cfcontent variable="#spreadsheetReadBinary(xls)#" reset="yes" type="application/vnd.ms-excel">
Run Code Online (Sandbox Code Playgroud)
编辑:我之前成功使用过cfspreadsheet,但它没有生成带有标题的电子表格(并且它还有需要创建临时文件以供服务的缺点.)
EDIT2:关注@Leigh建议我更新了CF9/lib文件夹中的POI.现在错误已更改为以下内容:
<cfset SpreadsheetFormatRow(xls, {bold=true,fgcolor="brown",color="white"}, 1)> 给出以下消息:org.apache.poi.hssf.util.HSSFColor.getIndexHash()Ljava/util/Hashtable;
错误代码:
java.lang.NoSuchMethodError:
org.apache.poi.hssf.util.HSSFColor.getIndexHash()Ljava/util/Hashtable;
at coldfusion.excel.Excel.getHSSFColor(Excel.java:2094)
at coldfusion.excel.Excel.findFont(Excel.java:2237)
at coldfusion.excel.Excel.getCellStyle(Excel.java:2318)
at coldfusion.excel.Excel.formatRow(Excel.java:2948)
at …Run Code Online (Sandbox Code Playgroud) 为什么以下工作在CF10而不是CF9?
<cfset out="">
<cfif isQuery( arguments.values ) >
<cfloop query="#arguments.values#" >
<cfset out = '#out#<option value="#value#">#label#</option>'>
</cfloop>
</cfif>
Run Code Online (Sandbox Code Playgroud)
CF9声明"复杂对象类型无法转换为简单值".对于包含cfloop的行.我正在使用Coldbox框架,它的调试器信息显示arguments.values是一个带有Label&Value列的查询.
我们最近有一个黑客访问我们的系统.他们抛弃了一些Coldfusion模板,并将它们包含在我们网站上的随机页面中.
他们转储的文件开头,Allaire Cold Fusion Template然后包含看似"垃圾"的东西,但我相信这是某种预编译的Coldfusion代码.
我们已经清除了黑客攻击,但我保存了文件,因为我希望有一些方法可以对它们进行反编译,也许可以对它们有所了解.虽然我认为黑客已被处理,但我有点担心这段代码在做什么.(当我查看包含此代码的页面的源代码时,它没有创建输出,因此必须在后台进行某些操作.)
如果没有办法,那很酷,我只是想我至少会调查看看这些文件在做什么的可能性.在此先感谢您的帮助.
一些背景:
我正在使用onCFCRequest()与常规CFM页面请求分开处理远程CFC调用.这允许我捕获错误并为所有远程请求干净地设置MIME类型.
问题:
我不小心设置了一些远程CFC功能,public而不是remote在远程调用时意识到它们仍在工作.
正如您在下面所看到的,我的实现onCFCRequest()为我的整个应用程序创建了一个巨大的安全漏洞,其中HTTP请求可用于public在任何HTTP可访问的CFC上调用任何方法.
REPRO CODE:
在Application.cfc中:
public any function onCFCRequest(string cfc, string method, struct args){
cfc = createObject('component', cfc);
return evaluate('cfc.#method#(argumentCollection=args)');
}
Run Code Online (Sandbox Code Playgroud)
在远程调用的CFC中:
public any function publicFunction(){
return 'Public function called remotely!';
}
Run Code Online (Sandbox Code Playgroud)
题:
我知道我可以在调用方法之前检查组件的元数据,以验证它是否允许远程访问,但还有其他方法可以解决这个问题吗?
这段代码适用于CF10,但不适用于CF9.任何人都可以告诉我为什么?
CF9错误如下:
Invalid CFML construct found on line 2 at column 18.
ColdFusion was looking at the following text:
{
Run Code Online (Sandbox Code Playgroud)
代码:
<cfscript>
CompanyobjData = {
'CustomerID' : 'a',
'CUSTOMERNAME1' : 'b',
'CUSTOMERADDRESS1' : 'c',
'CUSTOMERADDRESS2' : 'd',
'CITY' : 'e',
'ST' : 'f',
'ZIP' : 'g',
'PHONE' : 'h',
'DEFAULTTERM' : 'i'
};
</cfscript>
<cfdump var="#CompanyobjData#" >
Run Code Online (Sandbox Code Playgroud) 我使用ColdFusion导出相当少的行(大约1000)但是大量的列(大约300)到Excel.它是一个多页Excel文件,其中至少有两个页面具有大量列.使用cfspreadsheet抛出Java堆错误.更新JVM设置值没有显示任何改进.在不导致Java堆错误的情况下导出到Excel的最佳方法是什么?
编辑:我已经尝试了几种方法来解决程序中的问题.我正在使用cfsavecontent中的xml工作簿来构建多个工作表并使用cfcontent呈现结果.在这种情况下,cfcontent可能会使用大量内存,从而导致堆空间错误.
<cfsavecontent variables="REQUEST.xmlData">
<cfoutput>
<xml version="1.0"?>
<?mso-application progid="Excel.sheet"?>
<Workbook>
...other contents
</Workbook>
</cfoutput>
</cfsavecontent>
Run Code Online (Sandbox Code Playgroud)
对于第二种解决方法,我使用querynew来构建内容并使用在Excel中转储最终结果<Cfspreadsheet action="write">.对于后续的工作表,我正在使用<cfspreadsheet action="update">.最终目标是使用excel <cflocation url="excelPath">,但在这种情况下,cfspreadsheet更新将永远丢失内存错误.
如果更新jvm不是一个选项,那么您建议采用哪些其他方法来克服内存问题.
我知道这个问题已经被问了很多,但是虽然我现在一直在寻找几天,但我找不到合适的答案.
我们使用JDK 1.7运行Coldfusion 9 Standard.我正在尝试使用cfhttp执行请求,代码如下:
<cfhttp url="Https://subdomain.example.com" method="get" result="result" username="#myUsername#" password="#myPassword#" />
Run Code Online (Sandbox Code Playgroud)
转出结果时我得到以下内容:
[![1]](https://i.stack.imgur.com/CqDs9.png)
我已经将证书链中的所有证书导入到正确的密钥库中.CA是Let的加密.有趣的是,我们有另一个网站,我们要求网络服务,也有来自Let's Encrypt的证书,它正在运行.从同一Coldfusion服务器访问.
我还尝试在Application.cfc中使用onApplicationStart中的代码,但是没有用:
<cfif NOT isDefined("Application.sslfix")>
<cfset objSecurity = createObject("java", "java.security.Security") />
<cfset objSecurity.removeProvider("JsafeJCE") />
<cfset Application.sslfix = true />
</cfif>
Run Code Online (Sandbox Code Playgroud)