2016-06-15 2 views
1

Рассмотрим следующую структуру для сайта ColdFusion 9:Является ли область сеансов ColdFusion устойчивой к приложению?

/root 
..../MyApp 
........../Application.cfc 
........../Index.cfm 
..../SharedComponents 
........../Common.cfc 

В common.cfc содержит все общие функции, которые я хотел бы разделить на несколько приложений под корень.

Одна из этих функций позволяет мне динамически создавать имя сеанса и присваивать значение.

<cffunction name="CreateSession" access="remote" returntype="any"> 
    <cfargument name="strSessionName" required="yes" type="string"> 
    <cfargument name="strSessionValue" required="yes" type="string"> 
    <cfset Session["#strSessionName#"] = "#strSessionValue#" /> 
</cffunction> 

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

Это выражение, которое я использую в ColdFusion, которое затем отображается в фактический URL-адрес, который затем вызывается через AJAX.

"#Application.Protocol & "://" & CGI.SERVER_NAME#/SharedComponents/common.cfc?method=CreateSession&strSessionName=TestSessionName&strSessionValue=TestValue" 

Однако при попытке отобразить этот недавно созданный сеанс на Index.cfm ничего не отображается.

Я попытался переместить common.cfc в папку MyApp, изменив путь выражения ColdFusion (показано выше), чтобы отразить новый путь, и это не проблема.

Это приводит меня к мысли, что я не могу установить сессию функции вне сферы моего приложения (что, будучи в папке MyApp, где находится Application.cfc)

Мой вопрос, является существует способ вызова функции за пределами области приложения, которая все еще может управлять сеансами приложения?

+2

Сессия привязана к пользователю. 'Session [" # strSessionName # "]' на самом деле не создает имя сеанса. Он создает переменную в сеансе пользователя с определенным именем. Если вы хотите поделиться чем-то вне области приложения, вам может потребоваться рассмотреть область сервера. –

+2

Сессии по сути связаны с приложением. Если файл не покрывается Application.cfc/cfm, то сеанса нет. – Leigh

ответ

1

Это приводит меня к мысли, что я не могу установить сессию функции вне сферы моего приложения (что, будучи в папке MyApp, где находится Application.cfc)

С вашей папке структура, у вас есть два приложения ColdFusion. У вас есть приложение в папке MyApp и приложение в корневой папке, к которой принадлежит папка SharedComponents. Если вы не решите использовать несколько хакерских шагов до share a session between applications, все приложения имеют уникальные сеансы для пользователей. Я бы не предлагал такие сеансы обмена. Если вам нужно разделить одну область сеанса между всеми приложениями на одном веб-сайте, я бы пересмотрел, почему у вас несколько приложений.

В вашем примере у клиента есть запрос непосредственно на удаленную функцию в папке sharedComponents. Область сеанса, доступная для компонента, отличается от области сеанса, доступной для приложения MyApp.

Способ совместного использования общего кода через все ваши приложения - установить mapping в местоположение, в котором хранится ваш общий код. После того, как вы создали сопоставление с общим кодированием, вы сможете расширить свои общие компоненты или создать оболочку для предоставления общего кода. Вот пример, который дозирует оба. Я решил разместить этот новый компонент, все так называемый Common, в корень MyApp, и я назвал свое сопоставление «mapToSharedComponents».

component extends="mapToSharedComponents.Common" 
{ 
    remote function wrappedCall(key, value){ 
     local.common = new mapToSharedComponents.Common(); 
     common.CreateSession(key,value); 
    } 
} 

http://localhost/MyApp/common.cfc?method=CreateSession&strSessionName=inherited&strSessionValue=test http://localhost/MyApp/common.cfc?method=wrappedCall&key=wrapped&value=test

двух вызовов будет создавать новые пары ключ-значение в MyApp сеанса области для вызывающего пользователя. Первый вызов вызывает унаследованную функцию CreateSession от вашего существующего компонента. Вызов новой функции wrappedCall создает новый экземпляр вашего исходного компонента и вызывает функцию CreateSession с переданными аргументами.

Если все ваши приложения находятся на одном веб-сайте, вы можете пропустить отображение и ссылаться на компонент из корня веб-сайта. Вам все равно понадобится компонент, который отличается от приложения подпапки. В этом случае примерный компонент будет выглядеть так:

component extends="SharedComponents.Common" 
{ 
    remote function wrappedCall(key, value){ 
     local.common = new SharedComponents.Common(); 
     common.CreateSession(key,value); 
    } 
} 
+0

Может, он что-то пытается сделать с помощью одного знака? В этом случае есть и другие способы этого. Метод сопоставления является общим, хотя может также иметь проблемы. Дело не в том, что я не рекомендую этого, но просто заметьте, я бы использовал только общие, функциональные типы методов в общем компоненте. У нас был программист, использующий этот стиль сопоставления функций совместного доступа, но функции иногда были специфичны для приложения. Мало того, что это раздулось, но затем кто-то изменил функцию и понятия не имел, где еще ее использовали. Я предпочитаю не делиться UDF с другими приложениями. – Leeish

Смежные вопросы