2016-06-15 5 views
1

は、ColdFusion 9のウェブサイトのための次のような構造を考えてみましょう。common.cfc以内ColdFusionセッションスコープはアプリケーションに対して永続的ですか?

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

は、私はルートの下に複数のアプリケーション間で共有したいすべての共通の機能が含まれています。

これらの関数の1つでは、セッション名を動的に作成して値を割り当てることができます。

私はこのセッションを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フォルダ、ということを)私は自分のアプリケーションの範囲外の関数からのセッションを設定することができないと信じて私をリード2つのColdFusionアプリケーションがあります。 MyAppフォルダにはアプリケーションがあり、SharedComponentsフォルダが属するルートフォルダにはアプリケーションがあります。 share a session between applicationsへのいくつかのハッキリした手順を使用しない限り、すべてのアプリケーションにはユーザーのセッションスコープが一意です。私はこのようなセッションを共有することを提案しません。 1つのWebサイト内のすべてのアプリケーション間で1つのセッションスコープを共有する必要がある場合は、複数のアプリケーションがある理由を再評価します。

この例では、クライアントが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関数が呼び出されます。

すべてのアプリケーションが同じWebサイトにある場合は、マッピングをスキップしてWebルートからコンポーネントを参照できます。サブフォルダアプリケーションとは別のコンポーネントが必要です。この場合、サンプルコンポーネントは次のようになります。

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

たぶん、彼は一種のことにシングルサインをしようとしていますか?この場合、これを達成する他の方法があります。マッピング方法は一般的ですが、問題もあります。私はそれをお薦めしているわけではありませんが、共通のコンポーネント内の非常に一般的な機能型メソッドだけに留意してください。プログラマはこの共有スタイルのマッピング機能を使用していましたが、その機能はアプリケーション固有のものでした。肥大化しただけでなく、誰かが機能を変えて、それがどこで使われたか分からなかった。私は他のアプリとUDFを共有したくない。 – Leeish

関連する問題