2012-07-31 3 views
2

https://sub.domain.com/login.cfm에 하나의 로그인 양식을 가진 sub.domain.com 도메인이 있다고 가정 해 봅시다.동일한 도메인의 서버/여러 ColdFusion 응용 프로그램간에 SESSION을 공유하려면 어떻게합니까?

루트 디렉토리에는 THIS.Name = "MyApp";을 사용하여 응용 프로그램의 이름을 지정하는 Application.cfc가 있습니다.

저는이 웹 사이트에 여러 하위 디렉토리가 있습니다.이 하위 디렉토리는 루트 인 Application.cfc를 확장하는 자체 Application.cfc와 함께 별도의 응용 프로그램으로 실행하려고하지만 각 응용 프로그램은 자체 이름을 가지고 있으므로 응용 프로그램을 만들 수 있습니다 예컨대

: 해당 어플리케이션에 고유 변수 -scope

가 sub.domain.com/Application.cfc는 (프록시 CFC 사용) 연장 sub.domain.com/site1/Application.cfc THIS.Name = "MyApp_Site1";

및 일부 응용 프로그램 범위 변수를 응용 프로그램에 고유하게 설정합니다.

그러나 로그인 할 때 https://sub.domain.com/login.cfm으로 설정하면 거기에 설정된 모든 세션 범위 변수가 APPLICATION 이름 "MyApp"에 연결됩니다.

루트 디렉터리 응용 프로그램에서 유효한 로그인을 수락하고 사용자 별 속성을 유지하면서 사용자를 응용 프로그램에 전달하는 데 사용할 수있는 솔루션에는 어떤 것이 있습니까?

답변

1

ColdFusion의 세션은 특정 응용 프로그램과 연결되어 있습니다. ColdFusion에서 세션 구조를 사용하여 응용 프로그램간에 공유 할 수 없습니다. (동일한 서버의 응용 프로그램에서 세션 정보를 가져올 수있는 공유 호스트에서 보안상의 악몽이 있다고 상상해보십시오.)

세션 정보가 성공적으로 기록 될 때 데이터베이스 나 다른 지속성 메커니즘에 저장해야합니다 in을 앱의 루트에 추가 한 다음 사이트의 특정 애플리케이션에 대한 첫 번째 요청시 고객의 세션 정보를로드합니다. 이 작업은 사이트 별 응용 프로그램 또는 onRequestStart()의 application.cfc에서 onSessionStart()에서 수행 할 수 있습니다.

3

간단한 대답은 없습니다. 그러나 그것이 또한 전적으로 사실이 아니기 때문에 조금 설명해 보도록하겠습니다. 첫째, 세션은 응용 프로그램 이름에 연결됩니다. 따라서 두 응용 프로그램 이름이 같은 두 개의 application.cfc 파일을 갖고 있다면 두 세션 모두 세션을 사용할 수 있습니다. 그러나 그것은 당신이하는 일이 아닙니다. 각기 다른 이름이 있기 때문에 새로운 세션마다 새 응용 프로그램 범위가 생깁니다.

FW \ 1 및 하위 응용 프로그램을 사용하려고 할 수도 있습니다. 이렇게하면 하나의 기본 app.cfc가 있지만 기능을 다른 그룹으로 구분할 수 있습니다.

로그인 페이지에서 도메인 수준 쿠키를 설정할 수도 있습니다. 그런 다음 다른 응용 프로그램에서이를 사용하여 맹목적으로 세션을 만들 수 있습니다.

3

@Dave Ferguson이 언급했듯이, 세션 데이터를 공유하는 가장 쉬운 방법은 단일 응용 프로그램으로 유지하는 것입니다. 이름이 같은 한 다른 폴더에 내용을 넣을 수도 있습니다.

당신이 찾고있는 것을 얻기 위해 FW \ 1 같은 프레임 워크를 사용할 필요는 없습니다. 키는 하위 응용 프로그램 이름으로 항상 응용 프로그램 범위 내에 구조체를 저장할 수 있습니다. 예를 들어 application.myvariable이 application [request]이 될 수 있습니다.subappname] .myvariable. 이렇게하면 하나의 응용 프로그램으로 유지되지만 응용 프로그램 변수의 범위는 다양한 하위 응용 프로그램에 따라 달라집니다. 세션 변수에서도 동일한 작업을 수행 할 수 있습니다.

@Brian이 언급 한 또 다른 접근 방법은 중간 저장소를 사용하는 것입니다. 그런 다음 원하는 키를 사용하여 세션 데이터를 저장할 수 있습니다. @Dave Ferguson이 언급했듯이 CFID와 CFTOKEN을 도메인 쿠키로 설정하십시오 (특히 CF10은 setting up the cookies에 약간의 개선이 있습니다). 그렇게하면 동일한 CFID와 CFTOKEN이 여러 응용 프로그램에서 사용됩니다. 그들은 여전히 ​​다른 세션을 가지고 있지만 동일한 세션 식별자를 사용합니다. 그런 다음 해당 조합을 중간 저장소의 데이터 키로 사용할 수 있습니다.

데이터베이스는이 문제를 해결하는 일반적인 방법이지만 앱에 따라 동시성 및 잠금 문제, 직렬화/직렬화 해제 또는 성능 문제가 발생할 수 있으며 이전/만료 된 데이터의 제거를 항상 처리합니다 . 따라서 이것을 처리하려면 ehcache 또는 memcached과 같은 것을 조사하고 싶을 것입니다.

ehcache는 ColdFusion 9 이상과 함께 번들로 제공되므로 설정에 따라 메모리와 디스크를 모두 사용할 수 있으므로 서비스 재시작 (또는 재부팅) 후에도 캐시의 데이터가 유지 될 수 있으며 일정량의 비활성 후 자동으로 레코드가 만료되도록 설정할 수 있습니다. 그리고 예, 그것은 used for custom caches 일 수 있습니다.

이 방법을 사용하면주의해야합니다. onSessionStart()에서 데이터를 가져 와서 여러 응용 프로그램에서 데이터를 가져 와서 세션이 시간 초과 될 때까지 캐시에서 데이터를 가져올 때마다 성능에 영향을 주어야합니다 (onRequestStart에서 말하기). 어떤 경로를 선택 하느냐는 애플리케이션의 성능 특성, 세션 데이터의 크기 등에 따라 달라집니다.

+0

APPLICATION [REQUEST.subappname]을 사용하는 것에 대한 아이디어는 내가 찾고있는 것입니다. –

+0

+1 Ehcache를 사용합니다. Adobe CF9 +에 추가하여 사용하기 쉽고 매우 뛰어나며 Railo에서 사용할 수 있습니다. Railo와 OpenBD는 memcached를 즉시 지원합니다. – Brian

관련 문제