Передать запрошенные параметры в файл 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>
Другие вопросы по тегам