Hprose for Javaサーバ(二)


パブリケーションリストを非表示
パブリケーションリストの役割は、WebサービスのWSDLに相当します.WSDLとは異なり、Hproseのパブリケーションリストにはメソッド名のみが含まれ、メソッドパラメータリスト、結果タイプ、呼び出しインタフェース記述、データ型記述などの情報は含まれません.これはHproseが弱いタイプの動的言語呼び出しをサポートしているため,パラメータ個数,パラメータタイプ,結果タイプはパブリッシュ期間で不確定であり,呼び出し期間でのみ決定される.したがって、Hproseは、Webサービスに比べて、サービスのパブリケーションでもクライアントの呼び出しでも柔軟です.
ユーザーが直接ブラウザを通じてパブリケーションリストを表示したくない場合は、サーバがGETリクエストを受信することを禁止できます.方法は簡単で、初期化パラメータgetをfalseに設定するだけで、以下のように構成できます.
<init-param>
    <param-name>get</param-name>
    <param-value>false</param-value>
</init-param>

では、GET方式でアクセスしてパブリケーションリストを表示しなくなりました.しかし、クライアント呼び出しは正常に実行され、影響を受けません.ただし、デバッグ中にパブリッシュリストを無効にすることは推奨されません.そうしないと、デバッグに大きなトラブルが発生します.デバッグ期間中により多くのデバッグ情報を得ることを望んでいるかもしれませんが、これはできますか?答えは間違いありません.デバッグスイッチを入れればいいです.
デバッグスイッチ
デフォルトでは、呼び出し中にサーバ側でエラーが発生した場合、限られたエラー情報のみが返されます.デバッグスイッチをオンにすると、サーバはエラースタック情報をすべてクライアントに送信します.これにより、クライアントに詳細なエラー情報が表示されます.
構成方法は、パブリケーションリストの非表示と同様に、初期化パラメータdebugをtrueに設定するだけです.
<init-param>
    <param-name>debug</param-name>
    <param-value>true</param-value>
</init-param>

オブジェクトのシーケンス化モード
前述したgetUserListメソッドは、カスタムシーケンス可能なオブジェクトリストを渡します.カスタムシーケンス可能オブジェクトの説明では、フィールドモードとプロパティモードの2つのシーケンス化モードについても何度も説明します.では、どのモードを使用するかをどのように構成しますか?
同様に、初期化パラメータを設定することで構成を完了できます.たとえば、プロパティ・モード(デフォルトはフィールド・モード)に設定する場合は、次の構成情報を追加するだけです.
<init-param>
    <param-name>mode</param-name>
    <param-value>propertyMode</param-value>
</init-param>

プロパティ・モードの転送に設定すると、プロパティ名の頭文字が自動的に小文字で表示され、他の部分の大文字と小文字は変更されません.これにより、フィールド・シーケンス化モードと統一されるだけでなく、他の言語・オブジェクトのフィールドまたはプロパティの名前も統一されます.
P 3 Pスイッチ
Hproseのhttpサービスにはもう一つのP 3 Pスイッチがあり、このスイッチはP 3 Pのhttpヘッダを送信するかどうかを決定し、このヘッダの役割はIEにドメイン間受信を許可させるCookieである.サービスがブラウザでドメイン間で呼び出され、Cookieを渡す必要がある場合(たとえば、Cookieを介してSession IDを渡す場合)は、このスイッチをオンにすることを考慮します.そうでなければ、このスイッチをオンにする必要はありません.このスイッチのデフォルトはオフです.オンにする方法は次のとおりです.
<init-param>
    <param-name>p3p</param-name>
    <param-value>true</param-value>
</init-param>

サーバイベント
他のhttpヘッダを設定したり、エラーが発生した場合にサーバ側でログを記録したりすることもできます.呼び出しの発生前後に権限チェックやログ記録などを行うことも望ましい.Hproseでは、これらは簡単にできます.Hproseはこのようなイベントメカニズムを提供した.
Hproseサーバは、HproseServiceEventインタフェースの4つのメソッドとして定義された4つのイベントを提供します.
package hprose.server;
public interface HproseServiceEvent {
    void onBeforeInvoke(String name, Object[] args, boolean byRef);
    void onAfterInvoke(String name, Object[] args, boolean byRef, Object result);
    void onSendHeader();
    void onSendError(String error);
}

このインタフェースを実装するだけで、イベントの定義を完了できます.
イベント構成
イベントクラスを定義した場合(ここでは、hprose.exam.Eventというイベントクラスのクラス名を仮定します)、サーブレットの初期化パラメータで次のパラメータを構成するだけです.
<init-param>
    <param-name>event</param-name>
    <param-value>hprose.exam.Event</param-value>
</init-param>

では、このイベントクラスはどのように定義すればいいのでしょうか.以下、この4つの事件についてそれぞれ紹介します.
onBeforeInvokeイベント
サーバ側でパブリッシュされたメソッドが呼び出される前に、onBeforeInvokeイベントがトリガーされ、nameはクライアントによって呼び出されたメソッド名であり、argsはメソッドのパラメータであり、byRefは参照パラメータが伝達された呼び出しであるかどうかを示す.
このイベントでは、IP認証などのユーザー認証を行うことができます.ログに記録することもできます.このイベントで呼び出しを終了したい場合は、例外を投げ出します.
onAfterInvokeイベント
サーバ側で公開されたメソッドが正常に呼び出されると、onAfterInvokeイベントがトリガーされ、最初の3つのパラメータはonBeforeInvokeイベントと一致し、最後のパラメータresultは呼び出し結果を表します.
呼び出しにエラーが発生した場合、onAfterInvokeイベントはトリガーされません.このイベントで例外が投げ出されると、呼び出し結果は返されず、クライアントはこのイベントが投げ出された例外を受信します.
onSendHeaderイベント
サーバが応答ヘッダに戻ると、onSendHeaderイベントがトリガーされます.
このイベントでは、Cookieの設定など、独自のヘッダ情報を送信できます.このイベントでは、例外を投げ出すべきではありません.
onSendErrorイベント
このイベントは、サーバ側呼び出しでエラーが発生した場合、またはonBeforeInvoke、onAfterInvokeイベントで例外が放出された場合にトリガーされます.
イベントにログを記録できますが、イベントに例外を投げ出すべきではありません.
アクセス環境コンテキスト
上記のサーバイベントまたはサーバパブリケーションの方法では、Request、Response、Session、Applicationなどの環境コンテキストにアクセスする必要がある場合がありますが、それらを取得するにはどのような便利な方法がありますか?
Hproseでは、http環境でのコンテキスト情報を表すHttpContextというヘルプクラスが用意されています.HproseHttpServiceクラスのgetCurrentContext静的メソッドでは、現在の環境コンテキストに対応するHttpContextオブジェクトを取得できます.次に、そのオブジェクトのgetRequest、getResponse、getSession、getCon
HttpContextヘルプクラスは、サーバイベントでもサーバパブリッシュの方法でも使用できます.また、サーバがパブリッシュするメソッドには、メソッドの最後のパラメータを対応する環境コンテキストタイプとして定義する別の方法があります.
たとえば、Sessionオブジェクトを取得するには、最後のパラメータをHttpSessionタイプとして定義するだけです.
public String getSessionID(HttpSession session) {
    return session.getId();
}

クライアントは、メソッドを呼び出すときにパラメータを代入する必要がなく、サーバが自動的にsessionパラメータをメソッドに渡します.HttpContextヘルプクラスを使用して上記の方法と等価に実装する方法は、次のように記述されています.
public String getSessionID() {
    HttpContext context = HproseHttpService.getCurrentContext();
    HttpSession session = context.getSession();
    return session.getId();
}

比較すると、パラメータ伝達方式を直接通過する書き方が簡潔であることがわかります.HttpContext自体とそれに含まれるすべての環境コンテキストタイプはパラメータ方式で渡すことができますが、パラメータ方式では1つの環境コンテキストパラメータしか渡されません.
静的メソッドのパブリッシュ
パブリッシュ静的メソッドは、パブリッシュインスタンスメソッドと似ていますが、クラスを定義するときにstatic publicメソッドとして定義する必要があります.その後、設定時にstaticClassという初期化パラメータを追加します.staticClassの値は、静的メソッドが存在するクラス名であり、複数を指定して「,」で区切ることができます.同様に、静的メソッドのクラスに名前空間(別名接頭辞)を指定し、"|"で区切ることもできます.
hproseがあるとしますexam.Exam 3とhprose.exam.Exam 4の2つのクラスの静的メソッドをパブリッシュし、hprose.exam.Exam 3が名前空間を指定すると、次のように構成できます.
<init-param>
    <param-name>staticClass</param-name>
    <param-value>hprose.exam.Exam3|ex3,hprose.exam.Exam4</param-value>
</init-param>

静的メソッドとインスタンスメソッドのパブリケーションは、同じサーブレットで構成できます.同じ名前のメソッドがある場合は、名前空間(別名接頭辞)で区別します.そうしないと、同じ名前の静的メソッドは、同じ名前のインスタンスメソッドのパブリケーションを上書きします.
では、HproseSeServeretパブリケーションサービスを直接使用するには、ここですべて紹介します.すべてのニーズを満たすことができると思ったら、次のセクションをスキップして次の章に進むことができます.まだお客様のニーズを完全に満たすことができない場合は、次のセクションが重要になる可能性があります.次のセクションでは、サービスのパブリケーションをより柔軟に制御できます.