2016-06-15 13 views
1

는 ColdFusion에서 9 웹 사이트에 대한 다음과 같은 구조를 고려 common.cfc 내ColdFusion 세션 범위는 응용 프로그램에 지속적입니까?

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

내가 루트 아래에 여러 응용 프로그램에서 공유 할 모든 일반적인 기능이 포함되어 있습니다.

이러한 함수 중 하나를 사용하면 동적으로 세션 이름을 만들고 값을 할당 할 수 있습니다.

JavaScript 처리 후이 세션을 생성하려면 AJAX를 통해이 함수를 호출합니다.

이것은 ColdFusion에서 사용하는 표현식으로 실제 URL로 렌더링 된 다음 AJAX을 통해 호출됩니다.

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

그러나 새로 만든이 세션을 Index.cfm에 표시하려고하면 아무 것도 표시되지 않습니다.

common.cfc를 MyApp 폴더로 재배치하여 위에서 언급 한 ColdFusion 표현 경로를 수정하여 새 경로를 반영했지만 아무런 문제가 없습니다.

이것은 내가 (존재가 Application.cfc가 발견되는 MyApp를 폴더 있음),

내 질문이입니다 내 응용 프로그램의 범위를 외부의 함수에서 세션을 설정할 수 없습니다 믿고 날 리드 응용 프로그램의 범위를 벗어난 함수를 호출 할 수있는 방법이 있습니다.이 함수는 여전히 응용 프로그램의 세션을 관리 할 수 ​​있습니까?

+2

세션은 사용자에게 연결됩니다. 'Session [ "# strSessionName #"]'는 실제로 세션 이름을 생성하지 않습니다. 사용자 세션에서 특정 이름의 변수를 만듭니다. 응용 프로그램 범위 밖에서 무언가를 공유하려면 서버 범위를 고려해야합니다. –

+2

세션은 본질적으로 애플리케이션에 묶여 있습니다. 파일이 Application.cfc/cfm에 의해 보호되지 않으면 세션이 없습니다. – Leigh

답변

1

이 내가 내 응용 프로그램의 범위를 외부의 함수에서 세션을 설정할 수 없습니다 믿고 날 리드 (있다는 것을 Application.cfc가 발견되는 MyApp를 폴더) 폴더와

구조에서는 두 가지 ColdFusion 응용 프로그램이 있습니다. MyApp 폴더에 응용 프로그램이 있고 SharedComponents 폴더가 속한 루트 폴더에 응용 프로그램이 있습니다. share a session between applications에 몇 가지 해킹 단계를 사용하지 않는 한 모든 응용 프로그램에는 사용자에 대해 고유 한 세션 범위가 있습니다. 이런 세션을 공유 할 것을 권하지는 않습니다. 한 웹 사이트의 모든 응용 프로그램간에 하나의 세션 범위를 공유해야하는 경우 여러 응용 프로그램이있는 이유를 재검토합니다.

예를 들어, 클라이언트가 sharedComponents 폴더의 원격 기능에 직접 요청하게하는 경우가 있습니다. 구성 요소에서 사용할 수있는 세션 범위는 MyApp 응용 프로그램에서 사용할 수있는 세션 범위와 다릅니다.

모든 응용 프로그램에서 공통 코드를 공유하는 방법은 공유 코드를 저장하는 위치에 mapping을 설정하는 것입니다. 공유 코드에 대한 매핑을 만들면 공유 구성 요소를 확장하거나 공유 코드를 제공하는 래퍼를 만들 수 있습니다. 다음은 그 두 가지 모두를 사용하는 예입니다. 필자는 Common이라는 새로운 구성 요소를 MyApp의 루트에 배치하고 매핑을 'mapToSharedComponents'라고 불렀습니다. http://localhost/MyApp/common.cfc?method=wrappedCall&key=wrapped&value=test

호출 사용자에 대한 MyApp를 세션 범위의 새로운 키 값 쌍을 만듭니다 두 통화

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

component extends="mapToSharedComponents.Common" 
{ 
    remote function wrappedCall(key, value){ 
     local.common = new mapToSharedComponents.Common(); 
     common.CreateSession(key,value); 
    } 
} 
. 첫 번째 호출은 기존 구성 요소에서 상속 된 CreateSession 함수를 호출합니다. 새 wrappedCall 함수를 호출하면 원래 구성 요소의 새 인스턴스가 만들어지고 인수가 전달 된 CreateSession 함수가 호출됩니다.

모든 응용 프로그램이 동일한 웹 사이트에있는 경우 매핑을 건너 뛰고 웹 루트에서 구성 요소를 참조 할 수 있습니다. 여전히 하위 폴더 응용 프로그램과 다른 구성 요소가 필요합니다. 이 경우 예제 구성 요소는 다음과 같습니다.

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

어쩌면 그는 일종의 싱글 사인을하려고 노력 중입니까? 이 경우 다른 방법으로이를 수행 할 수 있습니다. 매핑 방법은 일반적이지만 문제가있을 수도 있습니다. 필자가 권장하는 것은 아니지만 공통된 구성 요소에서 매우 일반적인 기능적 형식 방법 일뿐입니다. 우리는 프로그래머에게 공유 기능의 매핑 스타일을 사용하게했지만 기능은 때로는 응용 프로그램에만 해당됩니다. 부풀려 졌을뿐만 아니라 누군가가 기능을 변경하고 어디에서 사용되었는지 전혀 몰랐습니다. 다른 응용 프로그램과 UDF를 공유하지 않는 것이 좋습니다. – Leeish