Проблема конкатенации функции со строкой в ​​переменной области клиента в Application.cfc - PullRequest
2 голосов
/ 31 октября 2019

Я хочу установить переменную области клиента, которая является комбинацией текста и вывода из функции. Независимо от того, как я форматирую cfset, я не могу получить нужный мне результат.

Я использую управление сеансами, и пользователи проходят аутентификацию по таблицам базы данных. Поэтому я использую функцию GetAuthUser(), чтобы получить имя пользователя.

В моем application.cfc я хочу добавить к имени пользователя строку пути. Но я не могу понять правильный синтаксис. Я всегда получаю только строку. Я запускаю и останавливаю сервер Coldfusion, чтобы убедиться, что область клиента очищена, но это не имеет значения.

Я бы предпочел использовать для этого cfset, а не cfscript.

Это функция в моем application.cfc :

<cffunction name="OnSessionStart" >

  <cfset client.customerpath="C:\Dropbox\CustomerArea\" & #GetAuthUser()#>

</cffunction>

cfdump показывает только C:\Dropbox\CustomerArea\

GetAuthUser() на немсобственный работает отлично. Я просто не могу поставить префикс.

Ответы [ 3 ]

2 голосов
/ 31 октября 2019

Сначала убедитесь, что ваш логин работает правильно. Я полагаю, что ваш код выше работает правильно, но логин где-то не работает, поэтому ваш getAuthUser() пуст.

После того, как это будет проверено, вышеупомянутая конкатенация должна работать как положено.

Или есть несколько других способов объединения строк. Вверху головы:

Ваш метод:

<cfset client.s1="C:\Dropbox\CustomerArea\" & GetAuthUser()>

Прямая конкатенация: (ПРИМЕЧАНИЕ. В современных версиях CF этот вызов должен быть довольно быстрым для нескольких вызовов. )

<cfset client.s2="C:\Dropbox\CustomerArea\#GetAuthUser()#">

Сокращение вашего метода:

<cfset client.s3="C:\Dropbox\CustomerArea\"> 
<cfset client.s3&=GetAuthUser()>

И Java StringBuffer:

<cfset client.s4 = createObject("java",  "java.lang.StringBuffer").init("C:\Dropbox\CustomerArea\")>
<cfset client.s4 = client.s4.append(getAuthUser()).toString()>

Каждый метод будет иметь разную производительность, ивам придется протестировать в своей системе, чтобы увидеть, какая из них наиболее эффективна.

https://trycf.com/gist/22fc36dcbb8653d0b32ceb22987bf2d5/acf?theme=monokai

ПРИМЕЧАНИЕ. Возможно, вы также захотите предоставить каталог по умолчанию, чтобы предотвратить случайное назначениевысший каталог. (Если CF11 +, вы можете использовать оператор elvis, чтобы упростить это. https://trycf.com/gist/0b0d513b3e45af427f4813099e84c9c9/acf11?theme=monokai)


И на личном мнении, я не знаю, почему вы бы предпочли <cfset...> вместо cfscript. Это одна из вещей, которую cfscript делает исключительно простой и понятной. Плюс, изменение с cftags на cfscript откроет много преимуществ для ColdFusion.

0 голосов
/ 01 ноября 2019

Спасибо всем, кто ответил. Вы помогли мне понять, что в Applicaiton.cfc у меня была аутентификация пользователя в OnRequestStart, но я пытался использовать имя пользователя в OnSessionStart. Я переместил присвоение переменной в OnRequestStart и использовал область действия сеанса для переменной.

<cffunction name="OnRequestStart">

<!--- code here including cflogin to authenticate user --->

        <cfif GetAuthUser() NEQ "">
            <cfset session.customerpath="C:\Dropbox\CustomerArea\#GetAuthUser()#">
        <cfelse>
            <cfset session.customerpath="User not authenticated">
        </cfif>
</cffunction>

Я надеюсь, что использование области сеанса в OnRequestStart не является плохой практикой. Я предполагаю, что это просто означает, что переменная будет сбрасываться чаще - что, я надеюсь, в любом случае немного более безопасно.

0 голосов
/ 31 октября 2019

Вы уверены, что у вас есть getAuthUser() так же, как вы начинаете сеанс? Рассмотрим это вместо:

<cffunction name="OnRequestStart" >

   <cfset request.customerpath = "C:\Dropbox\CustomerArea\#GetAuthUser()#">

</cffunction>
...