Delphi WebServiceアーキテクチャによって作成された3層プログラムでセッションを維持する方法

問題の原因:

Delphiの新しいバージョンで推奨されているDataSnapなど、TCP / IPロング接続に基づくリモートサービスである場合、クライアントとサーバーに基づくTCPロング接続をサポートします。サーバーは、この接続を通じてクライアントにコールバックし、クライアントへのアクティブな通知を開始することもできます。次に、セッションは非常に長い接続です。

ただし、WEBアクセスは短い接続です。1つの操作、1つの接続が確立され、操作が完了し、接続が切断されます。次回、再接続します。したがって、ユーザーがログイン後に他の操作を続行した場合、サーバーは、次の操作の接続またはクライアントが前回ログインしたかどうかをどのようにして知るのでしょうか。

WebページからアクセスするWEBサーバーでこれを行う方法はいくつかあります。

1. Cookieを使用してクライアントを追跡します。

2. Webページの形式で非表示フィールドを使用します。つまり、非表示フィールドはページに表示されませんが、ページのフロントエンドのHTMLコードにあります。ページが送信されると、サーバーはそのような非表示フィールドの内容を読み取ることができます。 WHO

3. URLパラメータを使用します。http://abcd.com/readDoc?docNumb=123456に似ていますが、これは疑問符の後のURLパラメータです。多くのWebサイトがこの方法を使用しています。

4.私が知らない他の方法があるかもしれません。メッセージを知ってください。

それでは、Delphiを使用してWEBアクセスに基づくWebServiceを開発する方法は何ですか?

---------------

Delphiが使用できる方法:

1. SOAPヘッダー:インターネットで検索できるメソッドはすべて、Soapヘッダーの使用について話します。ユーザーがログインした後にサーバーから取得したセッション値を格納するためにTSoapHeaderから継承したクラスを定義するか、クライアントの独自のユーザー名とつまり、パスワードはこのSoapヘッダーを介してサーバーにパラメーターを渡すことであり、サーバー側のコードはこのSoapヘッダーを読み取ってパラメーターを取得し、クライアントが誰であるかを知ることができます。

2. Cookie:自分で見つけた機能ですが、とても便利な機能でしたが、Delphiの新バージョンでは少し面倒です。

3. URLパラメータ。シンプルで使いやすいです。ただし、Delphi WebService Soapなどのオンライン検索では、関連情報はありません。多分それはあまりにも簡単ですか?

----------------------------

Soapヘッダーメソッドに基づく最大の問題は、クライアントがサーバー側メソッドを呼び出すたびに、事前にSoapヘッダーを送信するメソッドを呼び出す必要があることです。つまり、コードの量が増加しています。クライアントがTClientDataSetを開いたり、TSoapConnectionを介してTClientDataSetを送信したりする場合でも、最初にSoapヘッダーを送信するコードを実行する必要があります。

Cookieはクライアントに対して透過的であり、クライアントはそれを処理する必要がないため、Cookieを使用します。サーバーがクライアントにCookieを設定している限り、サーバーはクライアントが将来アクセスするたびにCookieを読み取ることができ、Cookieはクライアントが誰であるかを知ることができます。とても良い方法です。以前にCookieを使用する方法についてもブログを書いています。DelphiのWebServiceのCookieオペレーション

Cookieの使用に関する問題:

1.操作を容易にするために、私は通常、クライアント側にTHTTPRIOとTSoapConnectionを配置し、THttpRioを使用してサーバー側インターフェイスメソッドを呼び出し、TSoapConnectionを介してMIDASベースの3層データベースアーキテクチャを使用します。コードを記述せずにデータを取得して送信できますデータ、コードのワークロードを削減。

2.上記の状況では、HttpRioを使用してサーバー側のログインメソッドを呼び出します。サーバー側は、このメソッドでクライアントから送信されたユーザー名やパスワードなどのパラメータを確認します。ログインが成功すると、サーバー側はクライアントのCookieを作成してクライアントのパラメータを記録します。将来、HttpRioがサーバー側インターフェイスを呼び出すかClientDataSetを呼び出してSoapConnectionを介してデータベースを読み書きするかに関係なく、サーバー側は以前にクライアント用に作成されたCookieを読み取り、パラメーターに基づいてクライアントが誰であるかを知ることができます。

3.ただし、Delphiの新しいバージョンでは、HttpRIO1を使用してサーバーサイドメソッドを呼び出します。サーバーサイドで作成されたCookieは、このHttpRio1が他のサーバーサイドメソッドを再度呼び出したときにのみ読み取ることができます。HttpRIO2またはSoapConnection1を使用してサーバーを操作した場合サーバー側では、以前に作成されたCookieをサーバー側で読み取ることはできません。つまり、新しいバージョンのDelphiのクライアントにある複数のHttpRioおよびSoapConnectionインスタンスは、サーバーによって作成されたCookieを共有しません。

3.1。上記の問題を解決する方法は少し面倒です。つまり、サーバー側のメソッドを呼び出す場合でも、別のHttpRio1を使用する代わりにSoapConnection1.RIOを使用して呼び出します。ただし、SoapConnection1.RIOがサーバー側のインターフェースメソッドを呼び出すには、次のものが必要です。

  SoapConnection1.Connected := False;
  SoapConnection1.SOAPServerIID := '{A4E625D6-1BC4-4335-BEF4-669113CA65B4}';  //这个 ID 是你用 Delphi 写的 WebService 服务器端的接口的 IID
  SoapConnection1.Connected := True; //设计期关掉连接。运行期设置这个为 True

上記の方法に関して、Delphiの公式ヘルプはこれを言っています:

サーバーに複数のリモートデータモジュールが含まれている場合、  TSOAPConnectionが使用するリモートデータモジュールを識別できるように、ターゲットデータモジュールのインターフェイス(IAppServerSOAPの子孫)を指定する必要があります。これを行うには2つの方法があります。

  • SOAPServerIIDプロパティを設定して、ターゲットリモートデータモジュールのインターフェースを示します。このメソッドは、IAppServerSOAPの子孫を実装するすべてのサーバーで機能します。SOAPServerIIDは、GUIDによってターゲットインターフェイスを識別します。実行時に、インターフェース名を使用でき、コンパイラーは自動的にGUIDを抽出します。ただし、設計時には、オブジェクトインスペクタでGUID文字列を指定する必要があります。
  • サーバーがDelphi言語を使用して記述されている場合は、URLのパス部分の最後のスラッシュの後にSOAPデータモジュールのインターフェイスの名前を含めるだけです。これにより、GUIDではなく名前でインターフェイスを指定できますが、クライアントとサーバーの両方がDelphiで記述されている場合にのみ使用できます。

-------------------------------------------------- -------------

URLパラメータを使用:

サーバーへの接続にはHttpRio1またはSoapConnection1を使用します。サーバーがDelphiで記述されている場合、通常はURLを次のように設定するだけです。

https://127.0.0.1:8080/soap

サーバーと対話できます。

次に、クライアントがサーバー側のログインメソッドを呼び出すと、サーバー側は、このログイン関数を介してクライアントに返される13559の文字列などのクライアントのセッションIDを生成できます。その後、クライアントは上記のURLを次のように変更できます。 https://127.0.0.1:8080/soap?session=13579

次に、それがClientDataSet1.OpenまたはClientDataSet1.ApplyUpdatesであるか、HttpRIO1を使用してサーバー側でインターフェイスメソッドを呼び出すか、サーバー側で、このセッションを読み取ることができます= 13579; クライアントは、URLを変更するためのコードを1行だけ必要とします。操作は自動的に送信され、他のコードは必要ありませんサーバーがこのパラメーターを読み取る方法は次のとおりです。

ID := GetSOAPWebModule.Request.QueryFields.Values['session'];

説明:

サーバー側では、GetSOAPWebModuleは、グローバル関数であり、TWebModuleを返すSoap.WebBrokerSOAPユニットで宣言されています。Soap.WebBrokerSOAPを使用している限り、それを使用できます。Requestはクライアントのリクエストを表し、それを通じてクライアントのURLパラメータを読み取ることができます。クライアントのCookieを読み取る前に、GetSOAPWebModuleを使用して取得します。

実際、DelphiのWebBrokerフレームワークを使用して、ブラウザページを使用してアクセスするWebサーバープログラムを記述し、このTWebModuleを介して、クライアントへの要求とコンテンツ応答をクライアントに送信します。

おすすめ

転載: blog.csdn.net/pcplayer/article/details/108563773