Передать запрошенные параметры в файл ColdFusion несколько раз?
У меня есть настройка функции cfmail в определенном файле, email_output.cfm, для которой требуется правильно переданный ей идентификатор, например email_output.cfm?ID=1. Я хочу настроить задание cron, которое выполняется через запрос, возвращающий различные необходимые идентификаторы для прохождения. В тестировании я могу сделать следующее:
<cflocation url="email_output.cfm?ID=10" >
Но, поскольку cflocation останавливает все остальные операции и открывает другую страницу, я не могу пройти по ней. Как мне передать параметры из запроса на одну страницу CF несколько раз?
Спасибо - джо
2 ответа
Пример реализации пользовательского тега этого...
Если вы впервые используете пользовательский тег, проще всего поместить его в ту же папку, что и вызывающая его страница. Есть несколько вариантов размещения его в другом каталоге, но давайте начнем с простого.
EmailMembers.cfm
<cfquery name="GetUIDs">
select userid from users
</cfquery>
<cfoutput query="GetUIDs">
<cf_maileach uid="#userID#">
</cfoutput>
Обратите внимание, как я назвал свой тег cf_maileach?
В том же каталоге разместите maileach.cfm, посмотрите, как совпадают имена?
maileach.cfm
<cfif StructKeyExists(attributes,"uid") and val(attributes.uid) gt 0>
<cfquery name="getinfo">
select fname,lname,email
from users
where userID = <cfqueryparam cfsqltype="cf_sql_integer" value="#attributes.uid#">
</cfquery>
<cfmail to="#getinfo.email#" subject="Hi #getinfo.fname#">...</cfmail>
</cfif>
Заметки
- В зависимости от вашей версии cf и от того, используете ли вы application.cfc или нет, существует несколько способов разместить пользовательский тег во внешнем каталоге. Существует также
<cfmodule>
- Это только пример, что-то из этого базового является излишним, я просто пытался подражать тому, что обрисовал Аскер. В этом примере я вызываю запрос, который может получить все данные, только чтобы использовать его для запроса строка за строкой.
- Если вы не знакомы с
<cfqueryparam>
Посмотри, используй, люби.
Изменить: Хотя метод CFHTTP может служить этой цели, он страдает несколько проблем
- Сеансы не передаются автоматически (даже если запрашивающий сервер и целевой сервер совпадают).
- Доступ к странице осуществляется по запросу браузера. Application/OnRequestEnd обрабатываются (и поскольку информация о сеансе также передается, это может вызвать проблемы при попытке доступа к файлам в защищенных областях.
- Из-за вышеизложенного страница должна находиться в папке с собственным файлом приложения, чтобы исключить любые файлы приложения над ней в иерархии каталогов.
- Для борьбы с 1, 2 и 3 вам потребуется кодировать на уровне безопасности, аналогичном собственной безопасности вашего приложения, чтобы файл не был уязвим при обнаружении URL-адреса.
- Каждый вызов файла через cfhttp должен вызывать дополнительную проверку безопасности.
- Это значительно медленнее. В очень простом тесте с application.cfc с нулевым содержимым метод нестандартного тега выполнялся буквально в <= 1/100 раз. При добавлении фактической функции в метод разница в результатах будет меняться.
Вот пример кода, чтобы проверить это самостоятельно.
Содержимое папки "Сейф":
Application.cfc
[ blank file, to negate my testing site's actual application.cfc ]
Testrun.cfm
<cfoutput><cfset starttick = GetTickCount()>
<cfloop from="1" to="20" index="i">
<cfhttp url="http://mysamesite.com/safe/http.cfm?u=#i#" method="get" result="test">
#test.filecontent#<br>
</cfloop>
CFHTTP Execution Time: #(GetTickCount() - starttick)#<br><br>
<cfset starttick = GetTickCount()>
<cfloop from="1" to="20" index="i">
<cf_testtag u="#i#"><br>
</cfloop>
CustomTag Execution Time: #(GetTickCount() - starttick)#<br><br>
</cfoutput>
testtag.cfm
<cfoutput>The ID entered was #attributes.u#</cfoutput>
http.cfm
<cfoutput>The ID entered was #url.u#</cfoutput>
Результаты (в миллисекундах). Каждый тест состоял из 20 проходов по HTTP и 20 проходов по пользовательскому тегу.
CFHTTP Tag
661ms 6ms
1624 5
616 5
460 4
522 6
816 4
Вы можете сделать это с помощью cfhttp также
<cfquery name="GetUIDs">
select userid from users
</cfquery>
<cfloop query="GetUIDs">
<cfhttp url="http://localhost:8500/cf10/test.cfm?id=#userid#" method="get" result="test">
</cfloop>