プロが教える店舗&オフィスのセキュリティ対策術

Tomcat + axis の Webサービスにおいて、
クライアントからの入力に対し、
Webサービス側でなんらかの処理を行い、
結果のデータを返しています。

このとき、入力が不正な値だった場合に、
返却時のHTTPコードに 50x InputError などの
任意のHTTPコードを返したいのですが、可能でしょうか?

よろしくお願い致します。

A 回答 (3件)

あまりSOAPに詳しくはないのですが、私の知っている範囲で考えると、


もともとのSOAPの仕組みとしては、任意のデータを任意のプロトコルで転送する仕組みですから、質問のケースではHTTPプロトコルとしては通信に成功しているためHTTPのエラーコードを使うのはふさわしくないと考えられます。
SOAPには、データの論理エラーやサービスの実行時エラーの場合に例外を返す仕組みがありますが、それで代用は出来ないのでしょうか。
axisの実装としても、アプリケーション側からHTTPのエラーコードを制御できるようにはしていないでしょうから、希望通りにHTTPコードを返すのは、難しいと思います。
どうしてもHTTPエラーコードにする必要があるのなら、完全に憶測ですが、tomcatみたいに、axisにもプラグインとかフィルタとかの仕組みがあるでしょうから、そのあたりをいじれば可能かもしれません。

もし大嘘ついていたらごめんなさい。
知らないなら答えるなって感じですが、少しでもヒントになればと。
    • good
    • 0
この回答へのお礼

確かに、その通りかもしれないですね。
SOAPを投げる側がもともとHTTPを制御していたモジュールなので、
HTTPでエラーを管理すると楽かなと思ったのですが、
axisにHTTP制御ができないとなると、無理にやる必要性が無さそうですね。

検討してみます。ありがとうございました!

お礼日時:2007/06/21 17:15

>SOAPで入力を受け取ったとき、HttpServletResponseインスタンスを受け取りません。



なるほど。そうなんですか。
では、こういうのはどうでしょうか?
(1)Axisサーブレットを継承してカスタムサーブレットを作成する
 よくわかってないからあれですが、
 http://ws.apache.org/axis/java/apiDocs/index.html
 をぱっと見たところ、 
 org.apache.axis.transport.http.AxisServlet
 これを継承するの・・・かな?
(2)このサーブレットから、HttpServletResponseをstaticに保存しておく
(3)エラーの箇所でsetStatus実行する

相当トリッキーですまぬ(^-^;
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

カスタムサーブレットを作成ですか。
見た感じ、できればうまくいきそうですね!
ただやはり、大規模&トリッキーになりがちなので、
ちょっと別の方法を検討してみます!

ありがとうございました。

お礼日時:2007/06/21 17:16

すみません。

SOAPが良くわからないのですが、
SOAPだと、
HttpServletResponse#setStatus(int )
とか
HttpServletResponse#sndError(int, String )
は使えないということでしょうか?

この回答への補足

SOAPで入力を受け取ったとき、HttpServletResponseインスタンスを受け取りません。
そのため、setStatusでコードを設定する事ができません。

============================================
Webサービスクラスは以下のような感じです。

/**
*WebServiceのsサービス
*入力が0なら1が返る
*入力が0以外ならHTTP505などのコードが返る
*/
public class WebService {
public int s( int n ) {
if ( n==0 ) {
// 何もしないとHTTPコード200が返るようです。
return 1;
} else {
// HTTPコード505などでエラーを返したい。
return -1;
}
}
}

補足日時:2007/06/20 15:00
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!